1

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

这也需要自动化,因此假设 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();
4

4 回答 4

3

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

于 2012-11-08T18:54:14.070 回答
0

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

于 2012-09-26T02:07:25.497 回答
0

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

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

于 2012-09-26T01:17:56.350 回答
0

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

于 2012-09-26T01:18:19.243 回答