1

У меня возникли проблемы с использованием переменных среды с использованием runas при использовании команды в реестре для команды контекстного меню правой кнопкой мыши. Я пробовал разные способы экранирования переменной, однако у runas есть какой-то другой синтаксис, который четко не объясняется.

Я использую пользовательскую команду в реестре для пункта контекстного меню, вызываемого правой кнопкой мыши. Например, я пытаюсь создать новую команду щелчка правой кнопкой мыши, например, HKEY_USERS\<some user account>\Software\Classes\Msi.Package\shell\RunAsAdmin\command .

Я понимаю, что могу удерживать нажатой клавишу shift и щелчок правой кнопкой мыши, чтобы использовать интерфейс оболочки для запуска от имени другого пользователя, однако использование runas из командной строки дает возможность использовать дополнительные параметры и переключатели параметров, такие как \noprofile и \savecred .

Начальная попытка

используя Руны напрямую, без экранирования

Вот что я пытался изначально использовать 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, чтобы заполнить переменные окружения, как я делал для целей отладки?

Рекомендации

  1. Использование обратной косой черты для экранирования символов в cmd.exe - Super User
  2. Руна не допускает сложных аргументов? - Переполнение стека
  3. Цитаты, символы Escape, разделители - Windows CMD - SS64
  4. Пакетные файлы - Побег Персонажи - Страницы сценариев Роба ван дер Вуде

1 ответ1

1

Если вы хотите использовать переменные среды внутри раздела реестра без необходимости использовать cmd для их расширения, вам нужно будет использовать тип раздела реестра REG_EXPAND_SZ, а не REG_SZ по умолчанию для значения реестра "(по умолчанию)".

Но редактор реестра не позволяет вам изменить тип значения реестра «(по умолчанию)», поэтому вам нужно будет использовать что-то вроде

reg add HKEY_CURRENT_USER\Software\Classes\Msi.Package\shell\RunAsAdmin\command /f /ve /t REG_EXPAND_SZ 

сначала создайте раздел реестра, а затем установите значение, которое вам нужно, и увеличьте переменные среды.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .