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; }
public WindowsUserSpecificSettings(string domain, string user, string pass) { WindowsUserSpecificSettings.AcquireTokenPriv("SeImpersonatePrivilege", 40U); WindowsUserSpecificSettings.AcquireTokenPriv("SeBackupPrivilege", 40U); WindowsUserSpecificSettings.AcquireTokenPriv("SeRestorePrivilege", 40U); if (!WindowsUserSpecificSettings.LogonUser(user, domain, pass, WindowsUserSpecificSettings.LogonType.LOGON32_LOGON_NETWORK, WindowsUserSpecificSettings.LogonProvider.LOGON32_PROVIDER_DEFAULT, out this.m_UserToken)) { throw new Win32Exception(); } WindowsUserSpecificSettings.PROFILEINFO lpProfileInfo = new WindowsUserSpecificSettings.PROFILEINFO(); lpProfileInfo.dwFlags = 1; lpProfileInfo.lpServerName = string.Empty; lpProfileInfo.lpUserName = user; lpProfileInfo.dwSize = Marshal.SizeOf((object)lpProfileInfo); if (!WindowsUserSpecificSettings.LoadUserProfile(this.m_UserToken, ref lpProfileInfo)) { throw new Win32Exception(); } this.m_RegHandle = new SafeRegistryHandle(lpProfileInfo.hProfile, false); this.m_RegHive = RegistryKey.FromHandle(this.m_RegHandle, RegistryView.Default); }