2012-09-26 121 views
1

我有一个c#应用程序需要做一些管理员(一些安装的东西)的事情,然后它需要以非管理员身份运行另一个进程。我之前没有对UAC做过任何事情,但我认为必须有办法做到这一点,对吧?如何从管理员运行非管理员进程c#应用程序

这也需要自动化,所以假设c#应用程序是以管理员凭证启动的。

基本程序将需要做这样的事情:

// MUST run this process as admin 
Process adminInstall = new Process(); 
adminInstall.StartInfo.FileName = "install.bat"; 
adminInstall.Start(); 
adminInstall.WaitForExit(); 

// CANNOT run this process as admin 
Process nonAdminProcess = new Process(); 
nonAdminProcess.StartInfo.FileName = "runner.cmd"; 
nonAdminProcess.StartInfo.UseShellExecute = false; 
nonAdminProcess.StartInfo.RedirectStandardOutput = true; 
nonAdminProcess.OutputDataReceived += new DataReceivedEventHandler(myHandler); 
nonAdminProcess.Start(); 
nonAdminProcess.BeginOutputReadLine(); 
nonAdminProcess.WaitForExit(); 
+1

可能的重复[如何删除子进程的权限](http://stackoverflow.com/questions/1173630/how-do-you-de-elevate-privileges-for-a-child-进程) –

回答

0

如果上述方法不可行,那么你可以试试我的方法。但它的丑陋;您需要获取非管理员进程的句柄,然后使用DuplicateTokenEx(p/invoke)复制其(非管理员)权限,然后将其传递到CreateProcessAsUser。您首先需要确定一个非管理进程,但可能没有任何进程。新创建的进程将使用您复制的令牌的任何特权生成,而不是父进程的标记。

+0

您不必获取非管理进程的句柄;您可以使用'SaferComputeTokenFromLevel'直接创建一个非管理员令牌。您还必须记住使用中等完整性级别。详细信息[这里](http://stackoverflow.com/a/40687129/33080)。 –

3

编译二进制文件之后,但在签名之前,可以在平台SDK中使用MT.exe(清单工具)在可执行文件中嵌入清单。您也可以选择在项目属性中使用自定义清单。打开项目属性,然后转到应用程序选项卡,然后将清单选项从默认清单更改为自定义清单。 Visual Studio将为您的项目添加一个清单,您可以在其中指定“requireAdministrator”专用权限。当您的应用程序运行时,它将提供UAC提示,或者以用户身份登录时要求提供凭据。子流程很可能以管理员身份启动。否则,你需要用没有记录的“runas”动词来启动它们。

+0

更好的选项列在这个重复的问题[这里](http://stackoverflow.com/questions/1173630/how-do-you-de-elevate-privileges-for-a-child-process)。 –

相关问题