Windows 如何从vbs以管理员身份运行vbs?

Windows 如何从vbs以管理员身份运行vbs?,windows,vbscript,administrator,elevated-privileges,Windows,Vbscript,Administrator,Elevated Privileges,有人能帮助我从自身运行vbs,但要有管理员权限吗? 我需要通过VBScript使用Windows8重命名计算机,但只有通过管理员命令行(CMD)运行脚本才可能→ 以管理员身份运行→ runScript.vbs)。如果使用classic CMD启动脚本,则不会重命名计算机 我的想法是使用用户权限启动脚本,不带参数,如果没有参数,脚本将使用管理员权限重新运行,并将参数作为标识符“我是管理员” 有人知道我怎么做吗 编辑: 我试过这个: If WScript.Arguments.Count = 0 Th

有人能帮助我从自身运行vbs,但要有管理员权限吗? 我需要通过VBScript使用Windows8重命名计算机,但只有通过管理员命令行(CMD)运行脚本才可能→ 以管理员身份运行→ runScript.vbs)。如果使用classic 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

如果在计算机上启用了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,则类似的操作应该会起作用:

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

将以下内容添加到文件的开头:

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

将以下内容添加到文件的开头:

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

关于提升选项的好文章-

将应用程序配置为始终请求提升的权限:

通过
HKCU
下的注册表设置,可以将程序配置为始终在用户级别请求提升。这些注册表设置是动态有效的,因此可以在启动特定应用程序之前立即设置,甚至在启动应用程序后立即删除(如果需要)。只需在“HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers”下创建一个
“字符串值”
,以获取可执行文件的完整路径,该可执行文件的值为
“以管理员身份运行”
。下面是CMD的一个示例


关于提升选项的好文章-

将应用程序配置为始终请求提升的权限:

通过
HKCU
下的注册表设置,可以将程序配置为始终在用户级别请求提升。这些注册表设置是动态有效的,因此可以在启动特定应用程序之前立即设置,甚至在启动应用程序后立即删除(如果需要)。只需在“HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers”下创建一个
“字符串值”
,以获取可执行文件的完整路径,该可执行文件的值为
“以管理员身份运行”
。下面是CMD的一个示例

funlil批处理文件

@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%
funlil批处理文件

@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%
`我的vbs文件路径:

D:\QTP Practice\Driver\Testany.vbs'

--通过谷歌搜索和一些调整,为我工作

`我的vbs文件路径:

D:\QTP Practice\Driver\Testany.vbs'


--通过谷歌搜索和一些调整,为我工作

这是解决这一问题的通用最佳解决方案:

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
如果WScript.Arguments.Count为1,则WScript.Quit为1
RunAsAdmin
主要
Sub RunAsAdmin()
Set Shell=CreateObject(“WScript.Shell”)
Set Env=Shell.Environment(“VOLATILE”)
如果Shell.Run(“%ComSpec%/C”“NET FILE”“,0,True)0,则
Env(“CurrentDirectory”)=Shell.CurrentDirectory
ArgsList=“”
对于WScript.Arguments.Count的i=1
ArgsList=ArgsList&&WScript.Arguments(i-1)
下一个
CreateObject(“Shell.Application”).ShellExecute WScript.FullName“”&WScript.ScriptFullName&ArgsList&“,”runas“,5
WScript.Sleep 100
环境删除(“当前目录”)
WScript.Quit
如果结束
如果是Env(“CurrentDirectory”),那么Shell.CurrentDirectory=Env(“CurrentDirectory”)
端接头
副标题()
'您的代码在这里!
端接头
优点:

1) 无法进行参数注入。
2) 提升到管理员后,参数的数量不会更改,然后您可以在提升自己之前检查它们。
3) 如果脚本以管理员身份运行,您将立即了解到这一点。例如,如果从控制面板卸载条目调用它,RunAsAdmin函数将不会不必要地运行,因为在这种情况下,您已经是管理员。如果您从已提升为管理员的脚本调用它,也会发生同样的情况。
4) 窗口将保持其当前大小和位置,正如它应该的那样。
5) 获得管理权限后,当前目录不会更改


缺点:没有人

这是解决此问题的通用且最佳的解决方案:

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
如果WScript.Arguments.Count为1,则WScript.Quit为1
RunAsAdmin
主要
Sub RunAsAdmin()
Set Shell=CreateObject(“WScript.Shell”)
Set Env=Shell.Environment(“VOLATILE”)
如果Shell.Run(“%ComSpec%/C”“NET FILE”“,0,True)0,则
Env(“CurrentDirectory”)=Shell.CurrentDirectory
ArgsList=“”
对于WScript.Arguments.Count的i=1
ArgsList=ArgsList&&WScript.Arguments(i-1)
下一个
CreateObject(“Shell.Application”).ShellExecute WScript.FullName“”&WScript.ScriptFullName&ArgsList&“,”runas“,5
WScript.Sleep 100
环境删除(“当前目录”)
WScript.Quit
如果结束
如果是Env(“CurrentDirectory”),那么Shell.CurrentDirectory=Env(“CurrentDirectory”)
端接头
副标题()
'您的代码在这里!
端接头
优点:

1) 无法进行参数注入。
2) 提升到管理员后,参数的数量不会更改,然后您可以在提升自己之前检查它们。
3) 如果脚本以管理员身份运行,您将立即了解到这一点。例如,如果从控制面板卸载条目调用它,RunAsAdmin函数将不会不必要地运行,因为在这种情况下,您已经是管理员。如果您从已提升为管理员的脚本调用它,也会发生同样的情况。
4) 窗口将保持其当前大小和位置,正如它应该的那样。
5) 获得管理权限后,当前目录不会更改


缺点:没有人检查这个代码,但我认为它不能解决我的问题。我的问题是无法获取脚本是否以管理员身份运行。我需要