public static class NativeMethods { [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, out LUID lpLuid); [DllImport("advapi32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, [MarshalAs(UnmanagedType.Bool)]bool DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState, Int32 Zero, IntPtr Null1, IntPtr Null2); [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] internal static extern bool OpenProcessToken(IntPtr ProcessHandler, int acc, ref IntPtr ProcessToken); [DllImport("advapi32.dll", SetLastError = true)] internal static extern bool LookupPrivilegeValue(string Host, string Name, ref long Luid); [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] internal static extern bool AdjustTokenPrivileges(IntPtr ProcessToken, bool disall, ref LUID Token, int Len, IntPtr prev, IntPtr ReLen); [DllImport("kernel32.dll", SetLastError = true)] internal static extern bool CloseHandle(IntPtr hObject); } [StructLayout(LayoutKind.Sequential, Pack = 0)] public struct LUID { public int Count; public long Luid; public int Attr; } [StructLayout(LayoutKind.Sequential)] public struct LUID_AND_ATTRIBUTES { public LUID Luid; public UInt32 Attributes; } public struct TOKEN_PRIVILEGES { private const Int32 ANYSIZE_ARRAY = 1; public UInt32 PrivilegeCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = ANYSIZE_ARRAY)] public LUID_AND_ATTRIBUTES[] Privileges; } public static class Privileges { const int TOKEN_QUERY = 0x8; const int TOKEN_ADJUST_PRIVILEGES = 0x20; const int SE_PRIVILEGE_ENABLED = 2; public static bool SetPrivilege(IntPtr hProcess, string seName, bool enable) { bool bok = false; IntPtr hToken = IntPtr.Zero; TOKEN_PRIVILEGES tp = new TOKEN_PRIVILEGES(); ; LUID luid; if (!NativeMethods.LookupPrivilegeValue(string.Empty, seName, out luid)) bok = false; else { tp.PrivilegeCount = 1; tp.Privileges = new LUID_AND_ATTRIBUTES[1]; if (enable) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else tp.Privileges[0].Attributes = 0; if (NativeMethods.OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref hToken)) { if (!NativeMethods.AdjustTokenPrivileges(hToken, false, ref tp, Marshal.SizeOf(typeof(TOKEN_PRIVILEGES)), IntPtr.Zero, IntPtr.Zero)) bok = false; else bok = true; } else bok = false; } if (hToken != IntPtr.Zero) NativeMethods.CloseHandle(hToken); return bok; } }