为了账号安全,请及时绑定邮箱和手机立即绑定

C#以具有自定义环境变量的管理员身份启动子进程(在CMD窗口中)

C#以具有自定义环境变量的管理员身份启动子进程(在CMD窗口中)

C#
慕雪6442864 2021-05-13 17:17:46
我有一个程序,其中包含一些Windows SDK可执行文件,并在一个单独的CMD窗口中打开它们。Process process = new Process();process.StartInfo.FileName = "cmd.exe";process.StartInfo.Arguments = "/C signtool.exe [args] & pause";process.StartInfo.Verb = "runas";process.Start();现在,我将Windows SDK文件夹添加到系统的Path环境变量中。有没有一种方法可以通过编程方式将Windows SDK文件夹添加到用户的Path环境变量中,或者通过将SDK文件夹添加到该特定CMD窗口的Path变量中来运行该过程?这是我需要添加到每个CMD窗口的Path变量的文件夹:C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x86该子过程必须以管理员身份运行。它不需要接收子进程的输出。
查看完整描述

2 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

这里有许多障碍需要克服。

  1. 正如您所发现的,当is时,不能使用Environment和的EnvironmentVariables属性(抛出异常)。但是仅当is时有效(被默默忽略)。这归结为(Win32核心功能)和/ (shell函数)之间的差异。ProcessStartInfoUseShellExecutetrueVerbUseShellExecutefalseVerbCreateProcessShellExecuteShellExecuteEx

  2. 如另一位评论者所建议,您可以尝试在父进程中设置环境,然后启动子进程。但是,提升的流程不会从非提升的父流程继承环境

我愿意打赌,有一种方法可以使用一系列正确的Win32调用来获得所需的信息,以获取提升的令牌,然后再调用CreateProcessAsUser。我也敢打赌,由于必要的struct封送处理,在C#中它容易出错并且很丑陋。因此,除了提供其他建议之外,我不会提出其他建议:

只需以编程方式编写一个批处理脚本即可设置环境并调用signtool.exe。然后,您可以runas像现在一样使用动词来调用该批处理脚本。


查看完整回答
反对 回复 2021-05-21
  • 2 回答
  • 0 关注
  • 214 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信