mirror of https://github.com/dahall/Vanara.git
44 lines
1.3 KiB
C#
44 lines
1.3 KiB
C#
using System;
|
|
using Vanara.InteropServices;
|
|
using static Vanara.PInvoke.AdvApi32;
|
|
using static Vanara.PInvoke.Kernel32;
|
|
|
|
namespace Vanara.PInvoke.Tests
|
|
{
|
|
public class ElevPriv : IDisposable
|
|
{
|
|
TOKEN_PRIVILEGES prevState;
|
|
SafeHTOKEN tok;
|
|
|
|
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);
|
|
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 TOKEN_PRIVILEGES(Array.ConvertAll(privs, s => new LUID_AND_ATTRIBUTES(LUID.FromName(s), PrivilegeAttributes.SE_PRIVILEGE_ENABLED)));
|
|
AdjustTokenPrivileges(tok, false, newPriv, out prevState).ThrowIfFailed();
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
AdjustTokenPrivileges(tok, false, prevState, out _);
|
|
tok.Dispose();
|
|
}
|
|
}
|
|
} |