如何从 vbs 以管理员身份运行 vbs?
Posted
技术标签:
【中文标题】如何从 vbs 以管理员身份运行 vbs?【英文标题】:How to run vbs as administrator from vbs? 【发布时间】:2013-07-02 05:54:41 【问题描述】:谁能帮助我从它本身运行 vbs 但具有管理员权限? 我需要通过 VBScript 使用 Windows 8 重命名计算机,但只有通过管理员命令行运行我的脚本(CMD → 以管理员身份运行 → runScript.vbs)才有可能。如果我使用经典 CMD 启动脚本,则计算机不会重命名。
我的想法是我以用户权限启动脚本,不带参数,如果没有参数,脚本会以管理员权限和参数作为标识符“我是管理员”重新运行。
有人知道我该怎么做吗?
编辑:
我试过了:
If WScript.Arguments.Count = 0 Then
Set objShell = CreateObject("Shell.Application")
objShell.ShellExecute "wscript.exe", "c:\Users\admin\Documents\selfConfigure.vbs -1", "", runas", 1
End If
【问题讨论】:
检查海拔 powertoy blogs.technet.com/b/elevationpowertoys/archive/2010/06/20/… 这是很棒的代码,但我认为它不能解决我的问题。我的问题不是脚本是否以管理员身份运行。我需要以管理员身份可靠地运行它。此代码仅用于检查它,我是对的吗? nope "如果以下脚本尚未提升运行,它将“重新启动”提升自身" 代码会提升脚本,但您忘记了 runas 之前的引号。 【参考方案1】:如果在计算机上启用了 UAC,这样的事情应该可以工作:
If Not WScript.Arguments.Named.Exists("elevate") Then
CreateObject("Shell.Application").ShellExecute WScript.FullName _
, """" & WScript.ScriptFullName & """ /elevate", "", "runas", 1
WScript.Quit
End If
'actual code
【讨论】:
这与我尝试的几乎相同。但它不起作用。启用 UAC 究竟是什么意思?我已将其设置为“从不通知”,是否已禁用?如果我尝试将 UAC 更改为更高的选项,它没有帮助。 Win8 上的“从不通知”并没有完全禁用(您必须使用策略来完全禁用它),但差不多。当我在我的 Win7 测试箱上重新启用 UAC 时,代码对我来说运行良好。更改 UAC 级别后是否重新启动? 不,我没有,但不幸的是我不能使用启用的 UAC,因为这个脚本必须在没有用户的情况下工作。没有用户会等待请求访问。此脚本用于自动测试。没有其他选择吗? :// 那你不能把它作为一个计划任务运行吗? 对不起,你说得对。我没有退出第一个脚本,这造成了问题。 :) 现在好了。【参考方案2】:将此添加到文件的开头:
Set WshShell = WScript.CreateObject("WScript.Shell")
If WScript.Arguments.Length = 0 Then
Set ObjShell = CreateObject("Shell.Application")
ObjShell.ShellExecute "wscript.exe" _
, """" & WScript.ScriptFullName & """ RunAsAdministrator", , "runas", 1
WScript.Quit
End if
【讨论】:
@gronostaj 那么你的脚本路径显然有空格,因为这是这个答案和我的唯一区别。 你为什么这样做 WshShell = WScript.CreateObject("WScript.Shell") 然后从不使用对象? 为什么我们需要检查“If WScript.Arguments.Length = 0” ???我想发送论据....【参考方案3】:有趣的 lil 批处理文件
@set E=ECHO &set S=SET &set CS=CScript //T:3 //nologo %~n0.vbs /REALTIME^>nul^& timeout 1 /NOBREAK^>nul^& del /Q %~n0.vbs&CLS
@%E%off&color 4a&title %~n0&%S%CX=CLS^&EXIT&%S%BS=^>%~n0.vbs&%S%G=GOTO &%S%H=shell&AT>NUL
IF %ERRORLEVEL% EQU 0 (
%G%2
) ELSE (
if not "%minimized%"=="" %G%1
)
%S%minimized=true & start /min cmd /C "%~dpnx0"&%CX%
:1
%E%%S%%H%=CreateObject("%H%.Application"):%H%.%H%Execute "%~dpnx0",,"%CD%", "runas", 1:%S%%H%=nothing%BS%&%CS%&%CX%
:2
%E%%~dpnx0 fvcLing admin mode look up&wmic process where name="cmd.exe" CALL setpriority "realtime"& timeout 3 /NOBREAK>nul
:3
%E%x=msgbox("end of line" ,48, "%~n0")%BS%&%CS%&%CX%
【讨论】:
@Lizz 这是解释这一切的网站:e-learn.cn/content/wangluowenzhang/84740【参考方案4】:关于海拔选项的好文章 - http://www.novell.com/support/kb/doc.php?id=7010269
将应用程序配置为始终请求提升权限:
可以通过HKCU
下的注册表设置将程序配置为始终请求用户级别的提升。这些注册表设置即时生效,因此可以在启动特定应用程序之前立即设置它们,甚至可以在应用程序启动后立即删除,如果需要的话。只需在"HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
下创建一个"String Value"
以获取值为"RUN AS ADMIN"
的可执行文件的完整路径。以下是 CMD 的示例。
Windows Registry Editor Version 5.00
[HKEY_Current_User\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"c:\\windows\\system32\\cmd.exe"="RUNASADMIN"
【讨论】:
但我首先需要提升权限才能编辑该注册表设置,不是吗?有点违背了目的。 ***.com/questions/47895544/… 和 ***.com/questions/47902221/…【参考方案5】:`我的vbs文件路径:
D:\QTP Practice\Driver\Testany.vbs'
objShell = CreateObject("Shell.Application")
objShell.ShellExecute "cmd.exe","/k echo test", "", "runas", 1
set x=createobject("wscript.shell")
wscript.sleep(2000)
x.sendkeys "CD\"&"ENTER"&"cd D:"&"ENTER"&"cd "&"QTP Practice\Driver"&"ENTER"&"Testany.vbs"&"ENTER"
--来自谷歌搜索和一些调整,为我工作
【讨论】:
【参考方案6】:这是解决此问题的通用且最佳的解决方案:
If WScript.Arguments.Count <> 1 Then WScript.Quit 1
RunAsAdmin
Main
Sub RunAsAdmin()
Set Shell = CreateObject("WScript.Shell")
Set Env = Shell.Environment("VOLATILE")
If Shell.Run("%ComSpec% /C ""NET FILE""", 0, True) <> 0 Then
Env("CurrentDirectory") = Shell.CurrentDirectory
ArgsList = ""
For i = 1 To WScript.Arguments.Count
ArgsList = ArgsList & """ """ & WScript.Arguments(i - 1)
Next
CreateObject("Shell.Application").ShellExecute WScript.FullName, """" & WScript.ScriptFullName & ArgsList & """", , "runas", 5
WScript.Sleep 100
Env.Remove("CurrentDirectory")
WScript.Quit
End If
If Env("CurrentDirectory") <> "" Then Shell.CurrentDirectory = Env("CurrentDirectory")
End Sub
Sub Main()
'Your code here!
End Sub
优点:
1) 不能进行参数注入。 2)参数数量在提升到管理员后不会改变,然后您可以在提升自己之前检查它们。 3)如果脚本以管理员身份运行,您会立即知道。例如,如果您从控制面板卸载条目中调用它,RunAsAdmin 函数将不会不必要地运行,因为在这种情况下您已经是管理员。如果您从已提升为管理员的脚本中调用它,则同样如此。 4) 窗口应保持其当前大小和位置。 5) 获得管理员权限后当前目录不变。
缺点:没人
【讨论】:
谢谢你的回答帮助我回答这个question以上是关于如何从 vbs 以管理员身份运行 vbs?的主要内容,如果未能解决你的问题,请参考以下文章
错误 - 在Windows 7中使用“Git Bash Here”时,“文件扩展名.vbs没有脚本引擎”