是否有可能对vbscript有RUN AS提示符?

时间:2013-08-29 06:49:44

标签: vbscript

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

谢谢!

1 个答案:

答案 0 :(得分: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 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,您可以检查您的用户是否已具有管理员权限(从here采用的验证方法),否则使用带有“runas”动词的ShellExecute方法重新启动脚本:

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(错误)或custom password dialog(更好)提示输入凭据。无论哪种方式,您都需要通过runas.exe

重新启动脚本
Set sh = CreateObject("WScript.Shell")
sh.Run "runas /user:" & username & " cscript """ & WScript.ScriptFullName & """"

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