你如何去提升subprocess的权限?
我知道如何使用以下命令从进程启动具有pipe理权限的进程:
proc.StartInfo.UseShellExecute = true; proc.StartInfo.Verb = "runas";
其中proc是一个System.Diagnostics.Process。 但是,如何做相反的?
如果您所在的进程已经升级,那么您如何在没有pipe理员权限的情况下启动新进程? 更准确地说,我们需要启动与Windows资源pipe理器具有相同权限级别的新进程,因此如果禁用UAC,则不会更改,但如果启用了UAC,但进程正在运行提升,则需要执行某些未升级的操作因为我们正在创build一个虚拟驱动器,如果它创build与提升的权限和Windows资源pipe理器运行unlevated它不会显示出来。
随意把标题改为更好的东西,我不能拿出一个好的描述。
您的解决scheme是使用EXPLORER.exe进程。
这个想法是使用Windows的文件浏览器进程explorer.exe
( info )在UN-ELEVATED模式下运行进程。 可以说,我们要启动的过程是$TEMP\MyUnElevatedProcess.exe
。
所以,对于NSIS代码,我只会写:(但可以用任何语言运行)
Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"'
示例代码( 使用NSIS安装程序 )
Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"'
***代码取自http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html
我们最终使用了这个代码项目文章中的示例: 高海拔可能对您的应用程序不利:如何在安装结束时启动非升级过程
它似乎工作到目前为止,我收集它注入到RunDll32.exe,我的C / Win32是相当薄弱的,所以我没有看太多的实际的实现,只是它的用处。 证实它可以在Vista和Win7下运行x86和x64(至less对于我们来说,x86和x64需要安装时检查不同的dll,并使用适当的dll)。
您可以使用ProcessStartInfo.UserName和ProcessStartInfo.Password来指定您的进程在其下运行的帐户。
class Program { static void Main(string[] args) { var psi = new ProcessStartInfo(@"c:\windows\system32\whoami.exe"); var password = new SecureString(); password.AppendChar('s'); password.AppendChar('e'); password.AppendChar('c'); password.AppendChar('r'); password.AppendChar('e'); password.AppendChar('t'); psi.Password = password; psi.UserName = "username"; psi.UseShellExecute = false; psi.RedirectStandardOutput = true; var p = new Process(); p.StartInfo = psi; p.Start(); p.WaitForExit(); Console.WriteLine(p.StandardOutput.ReadToEnd()); } }