运行提升的进程
运行提升的进程
我正在尝试使用以下代码运行一个cmd命令:
ProcessStartInfo cmd = new ProcessStartInfo("cmd.exe"); cmd.RedirectStandardInput = true; cmd.RedirectStandardOutput = true; cmd.RedirectStandardError = true; cmd.UseShellExecute = false; cmd.CreateNoWindow = true; cmd.WindowStyle = ProcessWindowStyle.Hidden; Process exec = Process.Start(cmd); exec.StandardInput.WriteLine("sc create \"BaliService\" binPath= \"{0}\\BaliService.exe\"", Directory.GetCurrentDirectory());
这个命令需要管理员权限,如果我以管理员身份运行cmd并键入命令,它完美地工作,但是当我以管理员身份运行这个应用程序时却不起作用。我已经在一个清单文件中添加了
每次打开exe时都会提示UAC。
我看到有很多关于这个问题的问题,它们似乎都在暗示任何在提升的应用程序下运行的进程将具有相同的权限,但这对我不起作用。
我尝试过cmd.Verb = "runas";
,但没用。
问题:Run elevated process的出现原因和解决方法
在这段对话中,提到了一个问题:当原始进程没有被提升时,新进程将无法被提升。那么,为什么会出现这个问题呢?有什么解决方法呢?
根据对话内容分析,问题的原因是因为原始进程没有被提升,导致新进程也无法被提升。这是因为在Windows 10系统中,当原始进程没有被提升时,新进程也将无法被提升。
针对这个问题,可以通过以下解决方法来解决:
1. 尝试将管理员凭据分配给ProcessStartInfo
对象,以便提升进程权限。
SecureString password = new SecureString(); password.AppendChar('p'); password.AppendChar('w'); cmd.UserName = "admin"; cmd.Password = password;
然而,由于需要在多台计算机上使用,所以不能将管理员凭据直接分配给ProcessStartInfo
对象。
2. 直接运行"sc"命令,而不是创建一个命令进程并指示其执行"sc"。
cmd.FileName = "cmd.exe"; cmd.Arguments = String.Format("create \"BaliService\" binPath= \"{0}\\BaliService.exe\"", Directory.GetCurrentDirectory());
然而,这种方法在Windows 10上无法提升新进程的权限,当原始进程没有被提升时。
因此,针对这个问题,我们需要找到一个能够在Windows 10上提升新进程权限的解决方法。
问题出现的原因是在运行提升的进程时,无法同时重定向标准输出和设置Verb
属性,必须将UseShellExecute
设置为true
才能使用Verb
属性,而将其设置为false
才能重定向标准输出。
解决方法可能是找到其他方式来获取作为管理员运行的程序的输出。有一篇文章可以提供更多信息:http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx。
另外,还有一种尝试的方法是将UseShellExecute
设置为false
,Verb
设置为"runas",RedirectStandardInput
设置为true
,Domain
设置为du[0],UserName
设置为UserAdministrator,Password
设置为SecureStringHelper.ToSecureString(pwd),LoadUserProfile
设置为true
。如果将UseShellExecute
设置为true
,则会出现错误"The Process object must have the UseShellExecute property set to false in order to start a process as a user."。
如果需要完整的示例来以不同的方式获取作为管理员运行的程序的输出,则可以进行进一步的研究。