2023-08-04 12:24:49 -04:00
|
|
|
|
using static Vanara.PInvoke.AdvApi32;
|
2019-07-12 18:58:24 -04:00
|
|
|
|
using static Vanara.PInvoke.Kernel32;
|
|
|
|
|
|
2023-03-31 11:47:53 -04:00
|
|
|
|
namespace Vanara.PInvoke.Tests;
|
|
|
|
|
|
|
|
|
|
public class ElevPriv : IDisposable
|
2019-07-12 18:58:24 -04:00
|
|
|
|
{
|
2023-03-31 11:47:53 -04:00
|
|
|
|
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()
|
2019-07-12 18:58:24 -04:00
|
|
|
|
{
|
2023-03-31 11:47:53 -04:00
|
|
|
|
AdjustTokenPrivileges(tok, false, prevState, out _);
|
|
|
|
|
tok.Dispose();
|
2019-07-12 18:58:24 -04:00
|
|
|
|
}
|
|
|
|
|
}
|