C # запускает дочерний процесс (в окне CMD) в качестве администратора с пользовательскими переменными среды - PullRequest
0 голосов
/ 01 мая 2018

У меня есть программа, которая оборачивает некоторые исполняемые файлы 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, добавленной в переменную Path этого конкретного окна CMD?

Это папка, которую мне нужно добавить в переменную Path каждого окна CMD:

C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x86

Этот подпроцесс должен запускаться от имени администратора. Нет необходимости получать выходные данные дочернего процесса.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Здесь нужно преодолеть множество препятствий.

  1. Как вы обнаружили, свойства Environment и EnvironmentVariables ProcessStartInfo не могут использоваться, когда UseShellExecute равно true (исключение выдается). Но Verb работает только тогда, когда UseShellExecute равен false (Verb игнорируется). Это сводится к различиям между CreateProcess (основная функция Win32) и ShellExecute / ShellExecuteEx (функция оболочки).
  2. Как предложил другой комментатор, вы можете попытаться установить среду в родительском процессе и затем запустить дочерний процесс. Однако процессы с повышенными правами не наследуют среду от родительского процесса без повышенных прав .

Я был бы готов поспорить, что есть способ сделать то, что вы хотите, используя правильную серию вызовов Win32, чтобы получить повышенный токен, а затем вызвать что-то вроде CreateProcessAsUser. Я также готов поспорить, это будет немного подвержено ошибкам и уродливым в C # из-за необходимого структурного маршалинга. Поэтому вместо того, чтобы попытаться выяснить это для вас, я предложу другое предложение:

Просто программно напишите пакетный скрипт, который устанавливает среду и вызывает signtool.exe. Затем вы можете вызвать этот пакетный скрипт, используя глагол runas, как вы делаете сейчас.

0 голосов
/ 01 мая 2018

Используйте ProcessStartInfo и его экземпляр свойства Environment, чтобы установить его.

var startInfo = new ProcessStartInfo();
var defaultPath = startInfo.Environment["PATH"];
var newPath = "C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.16299.0\\x86" + ";" + defaultPath;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/c set > D:\\env.txt";
startInfo.Verb = "runas";
startInfo.Environment["PATH"] = newPath;
startInfo.UseShellExecute = false; // required to use Environment variables
Process.Start(startInfo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...