Added ability to provide token

pull/83/head
David Hall 2019-08-19 15:06:36 -06:00
parent a69ebc00ae
commit ae467f5bac
1 changed files with 20 additions and 3 deletions

View File

@ -10,13 +10,30 @@ namespace Vanara.PInvoke.Tests
SafeCoTaskMemHandle prevState;
SafeHTOKEN tok;
public ElevPriv(string priv, HPROCESS hProc = default, TokenAccess access = TokenAccess.TOKEN_ADJUST_PRIVILEGES | TokenAccess.TOKEN_QUERY)
public ElevPriv(string priv, HPROCESS hProc = default, TokenAccess access = TokenAccess.TOKEN_ADJUST_PRIVILEGES | TokenAccess.TOKEN_QUERY) :
this(new[] { priv }, hProc, access)
{ }
public ElevPriv(string[] privs, HPROCESS hProc = default, TokenAccess access = TokenAccess.TOKEN_ADJUST_PRIVILEGES | TokenAccess.TOKEN_QUERY)
{
if (hProc.IsNull) hProc = GetCurrentProcess();
tok = SafeHTOKEN.FromProcess(hProc, access);
var newPriv = new PTOKEN_PRIVILEGES(LUID.FromName(priv), PrivilegeAttributes.SE_PRIVILEGE_ENABLED);
ElevatePrivileges(privs);
}
public ElevPriv(string priv, HTOKEN hToken) : this(new[] { priv }, hToken) { }
public ElevPriv(string[] privs, HTOKEN hToken)
{
tok = new SafeHTOKEN((IntPtr)hToken, false);
ElevatePrivileges(privs);
}
private void ElevatePrivileges(string[] privs)
{
var newPriv = new PTOKEN_PRIVILEGES(Array.ConvertAll(privs, s => new LUID_AND_ATTRIBUTES(LUID.FromName(s), PrivilegeAttributes.SE_PRIVILEGE_ENABLED)));
prevState = PTOKEN_PRIVILEGES.GetAllocatedAndEmptyInstance();
if (!AdjustTokenPrivileges(tok, false, newPriv, (uint)prevState.Size, prevState, out var retLen))
if (!AdjustTokenPrivileges(tok, false, newPriv, prevState.Size, prevState, out var retLen))
Win32Error.ThrowLastError();
prevState.Size = (int)retLen;
}