private static void AcquireTokenPriv(string name, uint accessFlags = 40) { IntPtr TokenHandle = IntPtr.Zero; try { if (!WindowsUserSpecificSettings.OpenProcessToken(Process.GetCurrentProcess().Handle, accessFlags, out TokenHandle)) { throw new Win32Exception(Marshal.GetLastWin32Error(), "Failed to open process token handle"); } WindowsUserSpecificSettings.TOKEN_PRIVILEGES NewState = new WindowsUserSpecificSettings.TOKEN_PRIVILEGES(); NewState.PrivilegeCount = 1U; NewState.Privileges = new WindowsUserSpecificSettings.LUID_AND_ATTRIBUTES[1]; NewState.Privileges[0].Attributes = 2U; if (!WindowsUserSpecificSettings.LookupPrivilegeValue((string)null, name, out NewState.Privileges[0].Luid)) { throw new Win32Exception(Marshal.GetLastWin32Error(), "Failed to look up privilege"); } if (!WindowsUserSpecificSettings.AdjustTokenPrivileges(TokenHandle, false, ref NewState, 0U, IntPtr.Zero, IntPtr.Zero)) { throw new Win32Exception(Marshal.GetLastWin32Error(), "Failed to adjust process token privileges"); } } finally { if (TokenHandle != IntPtr.Zero) { WindowsUserSpecificSettings.CloseHandle(TokenHandle); } } }
private static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, [MarshalAs(UnmanagedType.Bool)] bool DisableAllPrivileges, ref WindowsUserSpecificSettings.TOKEN_PRIVILEGES NewState, uint Zero, IntPtr Null1, IntPtr Null2);