如何从admin c#application运行非管理进程

时间:2012-09-26 00:58:08

标签: c# .net uac

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

这也需要自动化,因此假设c#app是使用管理员凭据启动的。

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

// 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();

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

Process.Start参数有一个用于Username。请参阅Process.Start参考:

http://msdn.microsoft.com/en-us/library/sxf2saat.aspx

答案 2 :(得分:0)

使用.Net类似乎没有一种很好的方法。但是,Process.Start with different credentials with UAC on解释了在从另一个进程窃取句柄后使用CreateProcessAsUserW执行此操作的方法。

答案 3 :(得分:0)

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