我有这个更改注册表值的vbscript,我希望它能够在标准的Windows用户帐户中作为另一个帐户(具有管理员权限)运行。是否可以对其进行编码,以便当您双击vbscript时,它会询问您的Windows帐户名和密码,然后您可以使用该帐户权限运行脚本吗?
谢谢!
答案 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
输入密码(这本身就是一个坏主意)。