1

我有这个更改注册表值的 vbscript,我希望它能够在标准 Windows 用户帐户中作为另一个帐户(具有管理员权限)运行。是否可以对其进行编码,以便当您双击 vbscript 时,它会询问您的 Windows 帐户名和密码,然后您就可以使用该帐户权限运行脚本?

谢谢!

4

1 回答 1

1

在过去,您可以将runas密钥添加到注册表中的相应文件类型:

reg add "HKCR\VBSFile\Shell\runas\Command" /ve /t REG_EXPAND_SZ ^
  /d "\"%"SystemRoot"%\system32\wscript.exe\" \"%1\" %*" /f

这会在上下文菜单中添加一个Run as...条目,提示您输入凭据。

不幸的是,微软在引入 UAC 时改变了“runas”行为。现在,注册表项在上下文菜单中添加了以管理员身份运行的条目,该条目仅适用于启用 UAC 的情况。

Sysinternals 救援(一如既往):您可以重新启用上下文菜单条目,以便使用ShellRunas以不同的用户身份运行。下载存档,将可执行文件解压缩到您的目录%PATH%并运行ShellRunas.exe /reg以注册程序。不过,这将为可执行文件添加一个Run as different user...上下文菜单条目。要为 VBScript 文件添加此条目,您需要自己添加相关的注册表项/值,例如:

reg add "HKCR\VBSFile\Shell\runasuser" /ve /t REG_SZ /d "@shell32.dll,-50944" /f
reg add "HKCR\VBSFile\Shell\runasuser\command" /v DelegateExecute /t REG_SZ ^
  /d "{ea72d00e-4960-42fa-ba92-7792a7944c1d}" /f

或通过合并这样的 .reg 文件:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\VBSFile\Shell\runasuser]
@="@shell32.dll,-50944"

[HKEY_CLASSES_ROOT\VBSFile\Shell\runasuser\command]
"DelegateExecute"="{ea72d00e-4960-42fa-ba92-7792a7944c1d}"


但是,没有一种优雅的方式可以将其合并到 VBScript 中。如果您的系统启用了 UAC,您可以检查您的用户是否已经具有管理员权限(从此处ShellExecute采用的验证方法),否则使用带有“runas”动词的方法重新启动脚本:

Set reg = GetObject("winmgmts://./root/default:StdRegProv")
rc = reg.GetStringValue(&h80000003, "S-1-5-19\Environment", "TEMP", val)
If rc = 5 Then
  'return code 5 == access denied
  're-launch script only when it was run without arguments, so we don't go
  'in circles when admin privileges can't be acquired
  If WScript.Arguments.Count = 0 Then
    're-launch as administrator; the additional argument is a guard to make
    'sure the script is re-launched only once
    CreateObject("Shell.Application").ShellExecute "wscript.exe" _
      , Chr(34) & WScript.ScriptFullName & Chr(34) & " relaunch", "", "runas", 1
    WScript.Quit 0
  Else
    WScript.Echo "Cannot acquire admin privileges."
    WScript.Quit 1
  End If
Else
  'your code here
End If

禁用 UAC 后,您需要通过InputBox(错误)或自定义密码对话框(更好)提示输入凭据。无论哪种方式,您都需要通过重新启动脚本runas.exe

Set sh = CreateObject("WScript.Shell")
sh.Run "runas /user:" & username & " cscript """ & WScript.ScriptFullName & """"

并通过输入密码SendKeys(这本身就是一个坏主意)。

于 2013-08-29T13:16:35.127 回答