如何在 runas 命令中调用环境变量以进行右键单击上下文菜单

如何在 runas 命令中调用环境变量以进行右键单击上下文菜单

runas我在使用注册表中的命令作为右键单击上下文菜单命令时,无法使用环境变量。我尝试了不同的方法来转义变量,但runas有一些不同的语法没有得到清楚的解释。

我正在使用注册表中的自定义命令来执行右键单击上下文菜单项。例如,我正在尝试创建一个新的右键单击命令,例如HKEY_USERS\<some user account>\Software\Classes\Msi.Package\shell\RunAsAdmin\command

我意识到我可以按住 shift 并右键单击以使用 shell 界面以其他用户身份运行,但是runas从命令行使用可以使用附加选项和参数开关,例如\noprofile\savecred

初次尝试

直接使用 runas,无需转义

这是我最初尝试使用鲁纳斯 直接地

runas /noprofile /user:Administrator "\"%SystemRoot%\System32\msiexec.exe\" /i \"%1\" %*"

首先使用 cmd,未转义

为了调试目的,我发送了命令第一的命令(可选择不关闭窗口),然后鲁纳斯

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\%命令 第一的或发送至鲁纳斯 直接地

\"我也尝试在环境变量周围加上引号(例如\"%SystemRoot\"%),但那也不起作用。

解决方法

首先使用 cmd,用百分号转义

我发现发送到后以下内容有效命令 第一的进而鲁纳斯

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 /noprofile /user:Administrator "\"%%SystemRoot%%\System32\msiexec.exe\" /i \"%1\" %*"

这一结果表明鲁纳斯在命令提示符窗口快速关闭之前不替换环境变量(如下所示)

Attempting to start "%SystemRoot%\System32\msiexec.exe" /i "D:\Downloads\somePackage.msi" as user "Administrator" ...

正确的 runas 语法?

直接使用 runas,语法正确吗?

是否有正确的方法来逃避或调用环境变量鲁纳斯 直接地当使用右键单击上下文菜单注册表命令时?

(这似乎与资源管理器以不同方式发送命令/参数或 Runas 以不同方式解释命令/参数有关。)

或者我必须发送至命令 第一的进而鲁纳斯获取环境变量以进行填充,就像我为了调试目的所做的那样?

参考

  1. 在 cmd.exe 中使用反斜杠转义字符 - 超级用户
  2. runas 不允许复杂参数? - 堆栈内存溢出
  3. 引号、转义符、分隔符 - Windows CMD - SS64
  4. 批处理文件 - 转义字符 - Rob van der Woude 的脚本页面

答案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 

首先创建注册表项,然后将值设置为您需要的值并扩展环境变量。

相关内容