这是解决此问题的通用且最佳的解决方案:
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) 获得管理员权限后当前目录不变。
缺点:没人