【问题标题】:How to run a non-admin process from admin c# application如何从管理员 c# 应用程序运行非管理员进程
【发布时间】:2012-09-26 00:58:07
【问题描述】:

我有一个 c# 应用程序需要以管理员身份执行一些操作(一些安装工作),然后它需要以非管理员身份运行另一个进程。我以前没有对 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();

【问题讨论】:

标签: c# .net uac


【解决方案1】:

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

【讨论】:

  • 在这个重复的问题here中列出了更好的选项。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 您不必获取非管理员进程的句柄;您可以使用SaferComputeTokenFromLevel 直接创建非管理员令牌。您还必须记住使用中等完整性级别。详细信息here.
      猜你喜欢
      • 2013-05-31
      • 1970-01-01
      • 2014-05-30
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多