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); } } }
public void Dispose() { if (this.m_RegHive != null) { this.m_RegHive.Dispose(); this.m_RegHive = (RegistryKey)null; } if (this.m_RegHandle != null) { WindowsUserSpecificSettings.UnloadUserProfile(this.m_UserToken, this.m_RegHandle.DangerousGetHandle()); this.m_RegHandle.Dispose(); this.m_RegHandle = (SafeRegistryHandle)null; } if (!(this.m_UserToken != IntPtr.Zero)) { return; } WindowsUserSpecificSettings.CloseHandle(this.m_UserToken); this.m_UserToken = IntPtr.Zero; }