确定用户是否在UAC提示符中单击了NO

时间:2014-05-21 09:10:40

标签: batch-file vbscript

我的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的错误代码,而不是假脱机程序之后的错误代码。

我希望它运行如下:

  1. 没有提升权利
  2. 获得海拔,如果不是,则退出10
  3. 如果用户单击是:再次运行脚本
  4. 运行ELSE块中的代码,使用WScript.Quit 1退出
  5. END IF之后的代码永远不应该运行
  6. 编辑:

        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运行它时,它让我在单击是时创建一个文件。不过,无论是否单击是或否,错误代码始终相同。

3 个答案:

答案 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