У меня возникли проблемы с использованием переменных среды с использованием runas
при использовании команды в реестре для команды контекстного меню правой кнопкой мыши. Я пробовал разные способы экранирования переменной, однако runas
имеет другой синтаксис, который не объяснен.
Я использую пользовательскую команду в реестре для контекстного меню правой кнопкой мыши. Например, я пытаюсь сделать новую команду правой кнопкой мыши, например HKEY_USERS\<some user account>\Software\Classes\Msi.Package\shell\RunAsAdmin\command
.
Я понимаю, что могу удерживать нажатой клавишу Shift и правую кнопку мыши, чтобы использовать интерфейс оболочки для запуска от имени другого пользователя, однако использование runas
из командной строки дает возможность использовать дополнительные параметры и переключатели параметров, такие как \noprofile
и \savecred
.
Начальная попытка
используя runas напрямую, без экранирования
Вот что я пытался изначально использовать runas напрямую :
runas /noprofile /user:Administrator "\"%SystemRoot%\System32\msiexec.exe\" /i \"%1\" %*"
сначала используя cmd, без экранирования
В целях отладки я отправил команду сначала в cmd (с возможностью не закрывать окно), а затем в runas
cmd /k "runas /noprofile /user:Administrator "\"%SystemRoot%\System32\msiexec.exe\" /i \"%1\" %*""
используя runas напрямую или сначала cmd, без экранирования
Результат показывает, что переменная окружения интерпретируется неправильно. По какой-то причине %s
заменяется1
Attempting to start "1ystemRoot\System32\msiexec.exe" /i "D:\Downloads\somePackage.msi" as user "Administrator" ...
RUNAS ERROR: Unable to run - "1ystemRoot\System32\msiexec.exe" /i "D:\Downloads\somePackage.msi"
2: The system cannot find the file specified.
используя runas напрямую или сначала cmd, с обратной косой чертой
С моей первой попыткой экранирования переменной я получаю тот же результат, 1ystemRoot
если экранирую знак процента с обратной косой чертой \
вокруг переменной среды (например \%SystemRoot\%
) как для первой отправки в cmd, так и для прямой отправки в runas .
Я также попытался поместить кавычки \"
вокруг переменной окружения (например \"%SystemRoot\"%
), и это тоже не сработало.
Временное решение
сначала используя cmd, экранированный с процентами
Я обнаружил, что после отправки в cmd сначала работает, а затем runas
cmd /k "runas /noprofile /user:Administrator "\"%%SystemRoot%%\System32\msiexec.exe\" /i \"%1\" %*""
Attempting to start "C:\Windows\System32\msiexec.exe" /i "D:\Downloads\somePackage.msi" as user "Administrator" ...
И это сработало
используя runas напрямую, сбежал с процентами
Однако когда я использую тот же синтаксис непосредственно с runas , он не интерпретирует и не заменяет переменную окружения на ее значение, что мне кажется очень странным.
runas /noprofile /user:Administrator "\"%%SystemRoot%%\System32\msiexec.exe\" /i \"%1\" %*"
Этот результат показывает, что runas не заменяют переменную среды, как показано ниже, прежде чем окно командной строки быстро закрывается.
Attempting to start "%SystemRoot%\System32\msiexec.exe" /i "D:\Downloads\somePackage.msi" as user "Administrator" ...
Правильный синтаксис runas?
используя runas напрямую, правильный синтаксис?
Существует ли правильный способ экранирования или вызова переменных среды для runas напрямую при использовании команд реестра контекстного меню, вызываемых правой кнопкой мыши?
(Похоже, это как-то связано с тем, что проводник отправляет команды / параметры по-разному или как-то иначе интерпретирует команды / параметры.)
Или мне нужно сначала отправить в cmd, а затем runas, чтобы заполнить переменные среды, как я делал для целей отладки?
%SystemRoot%\System32\msiexec.exe
на так же,msiexec
как%SystemRoot%\System32;
уже будет в вашем системном пути.Ответы:
Если вы хотите использовать переменные среды внутри раздела реестра, не используя их
cmd
для расширения, вам нужно будет использовать тип раздела реестра REG_EXPAND_SZ, а не значение по умолчанию REG_SZ для значения реестра "(по умолчанию)".Но редактор реестра не позволяет вам изменить тип значения реестра «(по умолчанию)», поэтому вам нужно будет использовать что-то вроде
сначала создайте раздел реестра, а затем установите значение, которое вам нужно, и увеличьте переменные среды.
источник