|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using Microsoft.Win32.Security.Win32Structs;
|
|
|
|
namespace Microsoft.Win32.Security
|
|
{
|
|
using HANDLE = IntPtr;
|
|
using DWORD = UInt32;
|
|
using BOOL = Int32;
|
|
using LPVOID = IntPtr;
|
|
using PSID = IntPtr;
|
|
|
|
/// <summary>
|
|
/// Summary description for TokenPrivilege.
|
|
/// </summary>
|
|
public class TokenPrivilege
|
|
{
|
|
public const string SE_CREATE_TOKEN_NAME = "SeCreateTokenPrivilege";
|
|
public const string SE_ASSIGNPRIMARYTOKEN_NAME = "SeAssignPrimaryTokenPrivilege";
|
|
public const string SE_LOCK_MEMORY_NAME = "SeLockMemoryPrivilege";
|
|
public const string SE_INCREASE_QUOTA_NAME = "SeIncreaseQuotaPrivilege";
|
|
public const string SE_UNSOLICITED_INPUT_NAME = "SeUnsolicitedInputPrivilege";
|
|
public const string SE_MACHINE_ACCOUNT_NAME = "SeMachineAccountPrivilege";
|
|
public const string SE_TCB_NAME = "SeTcbPrivilege";
|
|
public const string SE_SECURITY_NAME = "SeSecurityPrivilege";
|
|
public const string SE_TAKE_OWNERSHIP_NAME = "SeTakeOwnershipPrivilege";
|
|
public const string SE_LOAD_DRIVER_NAME = "SeLoadDriverPrivilege";
|
|
public const string SE_SYSTEM_PROFILE_NAME = "SeSystemProfilePrivilege";
|
|
public const string SE_SYSTEMTIME_NAME = "SeSystemtimePrivilege";
|
|
public const string SE_PROF_SINGLE_PROCESS_NAME = "SeProfileSingleProcessPrivilege";
|
|
public const string SE_INC_BASE_PRIORITY_NAME = "SeIncreaseBasePriorityPrivilege";
|
|
public const string SE_CREATE_PAGEFILE_NAME = "SeCreatePagefilePrivilege";
|
|
public const string SE_CREATE_PERMANENT_NAME = "SeCreatePermanentPrivilege";
|
|
public const string SE_BACKUP_NAME = "SeBackupPrivilege";
|
|
public const string SE_RESTORE_NAME = "SeRestorePrivilege";
|
|
public const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
|
|
public const string SE_DEBUG_NAME = "SeDebugPrivilege";
|
|
public const string SE_AUDIT_NAME = "SeAuditPrivilege";
|
|
public const string SE_SYSTEM_ENVIRONMENT_NAME = "SeSystemEnvironmentPrivilege";
|
|
public const string SE_CHANGE_NOTIFY_NAME = "SeChangeNotifyPrivilege";
|
|
public const string SE_REMOTE_SHUTDOWN_NAME = "SeRemoteShutdownPrivilege";
|
|
public const string SE_UNDOCK_NAME = "SeUndockPrivilege";
|
|
public const string SE_SYNC_AGENT_NAME = "SeSyncAgentPrivilege";
|
|
public const string SE_ENABLE_DELEGATION_NAME = "SeEnableDelegationPrivilege";
|
|
public const string SE_MANAGE_VOLUME_NAME = "SeManageVolumePrivilege";
|
|
|
|
private readonly PrivilegeAttributes _attributes;
|
|
private readonly Luid _luid;
|
|
|
|
public TokenPrivilege(string systemName, string privilege, bool enabled)
|
|
{
|
|
LUID luid;
|
|
BOOL rc = Win32.LookupPrivilegeValue(systemName, privilege, out luid);
|
|
Win32.CheckCall(rc);
|
|
|
|
_luid = new Luid(luid);
|
|
_attributes = (enabled ? PrivilegeAttributes.Enabled : 0);
|
|
}
|
|
|
|
public TokenPrivilege(string privilege, bool enabled) :
|
|
this(null, privilege, enabled)
|
|
{
|
|
}
|
|
|
|
public unsafe byte[] GetNativeLUID_AND_ATTRIBUTES()
|
|
{
|
|
LUID_AND_ATTRIBUTES la;
|
|
la.Luid = _luid.GetNativeLUID();
|
|
la.Attributes = (uint) _attributes;
|
|
var res = new byte[Marshal.SizeOf(typeof (LUID_AND_ATTRIBUTES))];
|
|
fixed (byte* luida = res)
|
|
{
|
|
Marshal.StructureToPtr(la, (IntPtr) luida, false);
|
|
}
|
|
return res;
|
|
}
|
|
}
|
|
}
|