我的VBScript文件:
If Not WScript.Arguments.Named.Exists("elevate") Then
Set objShellApp = CreateObject("Shell.Application")
objShellApp.ShellExecute(WScript.FullName, WScript.ScriptFullName & " /elevate", "", "runas", 0)
WScript.Quit 2
WScript.Echo("Done 1")
Else
我需要一种方法来确定用户是否单击否,然后将错误代码返回到批处理文件。 ShellExecute是否会返回任何错误代码?
问题是返回到bat的错误代码总是相同的(在这种情况下为2),无论我是否单击是或否。
编辑:
Dim objShell, objWMIService, servSpooler, objReg, objShellApp, result, oShell
Dim whoami, strWhoamiOutput, whoamiOutput
Const PrinterPort = "NUL:"
Const HKLM = &h80000002
If Not WScript.Arguments.Named.Exists("elevate") Then
Set objShellApp = CreateObject("Shell.Application")
objShellApp.ShellExecute WScript.FullName, WScript.ScriptFullName & " /elevate", "", "runas", 0
WScript.Quit 10
WScript.Echo("Done 1")
Else
Set oShell = CreateObject("WScript.Shell")
Set whoami = oShell.Exec("whoami /groups")
Set whoamiOutput = whoami.StdOut
strWhoamiOutput = whoamiOutput.ReadAll
If InStr(1, strWhoamiOutput, "S-1-16-12288", vbTextCompare) Then
Wscript.Echo("ADMIN")
WScript.Echo("Port")
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
set servSpooler = objWMIService.Get("Win32_Service.Name='spooler'")
Set objReg = GetObject("winmgmts:root\default:StdRegProv")
servSpooler.StopService
objReg.SetStringValue HKLM, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports", PrinterPort, ""
servSpooler.StartService
WScript.Quit 1
End if
WScript.Echo("Done 2")
End If
WScript.Quit 2
WScript.Echo("Done 3")
在获得提升权限后,它只会返回第一个WScript.Quit的错误代码。无论我是否点击否或是。当我单击是时,它按预期运行程序,并在启动假脱机程序后退出,但返回到批处理的错误代码仍然是第一个Wscript.Quit的错误代码,而不是假脱机程序之后的错误代码。
我希望它运行如下:
编辑:
If Not WScript.Arguments.Named.Exists("elevate") Then
Set objShellApp = CreateObject("Shell.Application")
objShellApp.ShellExecute WScript.FullName, WScript.ScriptFullName & " /elevate", "", "runas", 0
WScript.Quit 10
WScript.Echo("Done 1")
Else
Dim fso, MyFile
Set fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = fso.CreateTextFile("testfile.txt", True)
MyFile.WriteLine("This is a test.")
MyFile.Close
End If
WScript.Quit 2
WScript.Echo("Done 3")
当我从... / System32运行它时,它让我在单击是时创建一个文件。不过,无论是否单击是或否,错误代码始终相同。
答案 0 :(得分:1)
尝试在c:\ windows \ system32中创建一个文件并测试错误代码。
只有标记为RequireAdmin的程序在执行时才会失败。其他一切都将以有限的用户身份开始。
对于你的方法。
返回值
No return value.
WScript有两种执行方法。两者都有不同的功能,所以阅读文档。
object.Exec(strCommand)
Exec方法返回一个WshScriptExec对象,该对象提供有关使用Exec运行的脚本的状态和错误信息,以及对StdIn,StdOut和StdErr通道的访问。
object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
bWaitOnReturn 可选的。布尔值,指示脚本是否应该等待程序完成执行,然后再继续执行脚本中的下一个语句。如果设置为true,则脚本执行将暂停,直到程序完成,Run将返回程序返回的任何错误代码。如果设置为false(默认值),Run方法在启动程序后立即返回,自动返回0(不被解释为错误代码)。
答案 1 :(得分:0)
您的一个问题是您的代码编写不正确。
您必须拥有On Error Resume Next
或您的脚本已崩溃。您可以将此语句用于希望在出现错误时继续运行的简单脚本。在实际脚本中,它表示您正在处理错误而不是vbs。所以你需要像这样编码。
servSpooler.StartService
If err.number <> 0 then
'print error, exit script
wscript.echo err.number & " " & err.description & " in " & err.source
err.clear
wscript.quit
End If
但是如果使用vbs错误处理它就知道行号和列号。
答案 2 :(得分:0)
Noooooooo - 在代码中创建文件。
On Error Resume Next
'Should fail for everyone so simulates being a user for an admin
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateTextFile "C:\System Volume Information\test.txt", vbtrue
msgbox err.number & " " & err.description & " " & err.source
If err.number = 70 then
msgbox "access denied - not an admin"
err.clear
Elseif err.number <> 0 then
Msgbox "Unspecified error"
err.clear
Else
Msgbox "Is an admin"
End If
'Should succeed for admins
fso.CreateTextFile "c:\windows\system32\test.txt", vbtrue
msgbox err.number & " " & err.description & " " & err.source
If err.number = 70 then
msgbox "access denied - not an admin"
err.clear
Elseif err.number <> 0 then
Msgbox "Unspecified error"
err.clear
Else
Msgbox "Is an admin"
End If