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

我有一个程序,其中包含一些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

该子过程必须以管理员身份运行。它不需要接收子进程的输出。


慕雪6442864
浏览 216回答 2
2回答

神不在的星期二

这里有许多障碍需要克服。正如您所发现的,当is时,不能使用Environment和的EnvironmentVariables属性(抛出异常)。但是仅当is时有效(被默默忽略)。这归结为(Win32核心功能)和/ (shell函数)之间的差异。ProcessStartInfoUseShellExecutetrueVerbUseShellExecutefalseVerbCreateProcessShellExecuteShellExecuteEx如另一位评论者所建议,您可以尝试在父进程中设置环境,然后启动子进程。但是,提升的流程不会从非提升的父流程继承环境。我愿意打赌,有一种方法可以使用一系列正确的Win32调用来获得所需的信息,以获取提升的令牌,然后再调用CreateProcessAsUser。我也敢打赌,由于必要的struct封送处理,在C#中它容易出错并且很丑陋。因此,除了提供其他建议之外,我不会提出其他建议:只需以编程方式编写一个批处理脚本即可设置环境并调用signtool.exe。然后,您可以runas像现在一样使用动词来调用该批处理脚本。
打开App,查看更多内容
随时随地看视频慕课网APP