我有一个程序,其中包含一些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个赞
这里有许多障碍需要克服。
正如您所发现的,当is时,不能使用
Environment
和的EnvironmentVariables
属性(抛出异常)。但是仅当is时有效(被默默忽略)。这归结为(Win32核心功能)和/ (shell函数)之间的差异。ProcessStartInfo
UseShellExecute
true
Verb
UseShellExecute
false
Verb
CreateProcess
ShellExecute
ShellExecuteEx
如另一位评论者所建议,您可以尝试在父进程中设置环境,然后启动子进程。但是,提升的流程不会从非提升的父流程继承环境。
我愿意打赌,有一种方法可以使用一系列正确的Win32调用来获得所需的信息,以获取提升的令牌,然后再调用CreateProcessAsUser
。我也敢打赌,由于必要的struct封送处理,在C#中它容易出错并且很丑陋。因此,除了提供其他建议之外,我不会提出其他建议:
只需以编程方式编写一个批处理脚本即可设置环境并调用signtool.exe
。然后,您可以runas
像现在一样使用动词来调用该批处理脚本。
- 2 回答
- 0 关注
- 229 浏览
添加回答
举报
0/150
提交
取消