从vbscript获取bat的错误级别

时间:2014-05-14 08:03:00

标签: windows batch-file vbscript

我正在尝试确定用户是否在UAC提示符中单击了NO,如果是,则不设置nul-port。

我将此脚本称为批处理文件,如果用户点击否,我想退出。

VBScript:

选项明确

Main 

Sub Main

    Dim oShell, objWMIService, servSpooler, objReg, objShellApp, result

    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 
    End If

    result = isElevated()

    If result = True Then
        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
    Else
        WScript.Quit 1
    End If

End Sub

Function isElevated
    Dim shell, whoami, whoamiOutput, strWhoamiOutput

    Set shell = CreateObject("WScript.Shell")
    Set whoami = shell.Exec("whoami /groups")
    Set whoamiOutput = whoami.StdOut
    strWhoamiOutput = whoamiOutput.ReadAll

    If InStr(1, strWhoamiOutput, "S-1-16-12288", vbTextCompare) Then
        isElevated = True
    Else
        isElevated = False
    End If
End Function

批次:

cscript "set_port.vbs"
IF ERRORLEVEL 1 (
    ECHO FAIL
    PAUSE
    EXIT
)

现在,我查看了这个页面:

http://www.robvanderwoude.com/errorlevel.php

和其他一些人,我觉得我尝试了所有可能的组合。可能,我还没有正确的组合。一些提示和帮助将受到高度赞赏!

基本目标:确定用户是否在UAC提示符中单击了NO,然后结束VBScript和批处理文件。

更新:

好的,感谢目前为止的所有答案。我现在很确定它是剧本。我在批处理文件中再次使用errorlevel,现在它工作得很好。

至于VBScript: 当用户在UAC提示符中单击“否”(意味着当前文件未提升)时,为了让错误代码为1,我需要这样说:

If result = True Then
    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(0)
Else
    WScript.Quit(1)
End If

但是:在WScript.Quit之后的第一个ShellExecute中,我还需要放WScript.Quit(1),对吧?因为否则我永远不会将错误传递给errorlevel(或至少不大于0)。

所以:

    objShellApp.ShellExecute WScript.FullName, WScript.ScriptFullName & " /elevate", "", "runas", 0
    WScript.Quit(1)

我认为,最大的问题是,在UAC promtp上单击NO并不会导致错误,所以我需要将WSCript.Quit(1)放在那里。

或者我反过来说:WScript.Quit(1)当用户点击“是”并且脚本被提升并将WScript.Quit(0)放在其他地方时。{/ p>

然而,在第一种情况下,我总是得到错误级别1,在第二种情况下,总是得到错误级别0。

-----------更新:

我的VBScript文件现在看起来像这样:

    Option Explicit

    Main 

    Sub Main

    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")
    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

    End Sub

测试批次:

@echo off
cscript "test.vbs"
ECHO %errorlevel%
PAUSE

错误级别输出是10而不是1,尽管脚本按预期退出并且消息"完成"永远不会出现。

1 个答案:

答案 0 :(得分:0)

调试技术:

编写一个只设置错误级别并退出的VBS脚本 - 并使其与批处理脚本一起使用。

然后你可以按摩完整的vbs脚本。