通过模拟可以实现以管理员权限启动进程。模拟允许进程以具有提升权限的不同用户身份运行。
您提供的代码利用 ImpersonationHelper
类来模拟具有所需凭据的用户。此类建立访问令牌并模拟指定的用户,从而向进程授予以管理员身份运行的必要权限。
<code class="language-csharp">public ImpersonationHelper(string domain, string user, string password) { // 调用 LogonUser 获取访问令牌的句柄。 bool returnValue = LogonUser(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref m_tokenHandle); if (false == returnValue) { int ret = Marshal.GetLastWin32Error(); throw new System.ComponentModel.Win32Exception(ret); } // 模拟 m_impersonatedUser = new WindowsIdentity(m_tokenHandle).Impersonate(); }</code>
在 using
块内,激活模拟。随后,Process
类用于启动具有指定文件名作为参数的新进程。
<code class="language-csharp">using (new ImpersonationHelper("xxx.blabla.com", "xxxx", "xxxx")) { if (!string.IsNullOrEmpty(txtFilename.Text)) Process.Start(txtFilename.Text); }</code>
或者,您可以通过手动设置 StartInfo
属性来以不同的用户身份启动进程,如下所示:
<code class="language-csharp">System.Diagnostics.Process proc = new System.Diagnostics.Process(); System.Security.SecureString ssPwd = new System.Security.SecureString(); proc.StartInfo.UseShellExecute = false; proc.StartInfo.FileName = "filename"; proc.StartInfo.Arguments = "args..."; proc.StartInfo.Domain = "domainname"; proc.StartInfo.UserName = "username"; string password = "用户输入的密码"; for (int x = 0; x < password.Length; x++) { ssPwd.AppendChar(password[x]); } password = ""; proc.StartInfo.Password = ssPwd; proc.Start();</code>
通过为密码提供 SecureString
,您可以确保安全地处理密码,并且不会将其存储在明文内存中。
以上是如何使用模拟以不同用户身份运行 .NET 进程?的详细内容。更多信息请关注PHP中文网其他相关文章!