Batch file 确定用户是否在UAC提示中单击了“否”

Batch file 确定用户是否在UAC提示中单击了“否”,batch-file,vbscript,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)

我的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),无论我单击的是还是否

编辑:

它仅在获得提升权限后返回第一个WScript.Quit的错误代码。无论单击“否”还是“是”。当我单击“是”时,它会按预期运行程序,并在启动后台处理程序后退出,但返回到批处理的错误代码仍然是第一个Wscript.quit的错误代码,而不是后台处理程序之后的错误代码

我预计其运行情况如下:

  • 没有提升的权利
  • 获取高程,如果否,则以10退出
  • 如果用户单击“是”:请再次运行脚本
  • 运行ELSE块中的代码,使用WScript退出。退出1
  • 结束IFs后的代码不应运行
  • 编辑:


    当我从…/System32运行此命令时,它允许我在单击“是”时创建一个文件。尽管如此,无论单击“是”还是“否”,错误代码始终相同。

    尝试在c:\windows\system32中创建一个文件并测试错误代码

    只有标记为RequireAdmin的程序在执行时才会失败。其他一切都将以受限用户的身份启动

    谢谢你的方法

    返回值

    No return value.
    
    WScript有两个执行方法。两者都有不同的功能,所以请阅读文档

    object.Exec(strCommand)
    
    Exec方法返回wshscript Exec对象,该对象提供有关使用Exec运行的脚本的状态和错误信息,以及对StdIn、StdOut和StdErr通道的访问

    object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
    
    bWaitOnReturn
    可选。布尔值,指示脚本在继续执行脚本中的下一条语句之前是否应等待程序完成执行。如果设置为true,脚本执行将停止,直到程序完成,Run将返回程序返回的任何错误代码。如果设置为false(默认值),则Run方法在启动程序后立即返回,并自动返回0(不能解释为错误代码)。

    您的问题之一是代码编写不正确

    您必须在下一步恢复出错时执行
    ,否则您的脚本将崩溃。您可以将此语句用于简单脚本,以便在出现错误时继续执行这些脚本。在实际脚本中,它表示您正在处理错误,而不是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
    
    servSpooler.StartService
    如果错误号为0,则
    '打印错误,退出脚本
    wscript.echo err.number&&&err.description&“in”&err.source
    清楚
    wscript.quit
    如果结束
    

    但是如果使用vbs错误处理,它会知道行和列的编号。

    nooooooo-用代码创建文件

    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
    
    出错时继续下一步
    '对于每个人都应该失败,因此模拟成为管理员的用户
    设置fso=CreateObject(“Scripting.FileSystemObject”)
    fso.CreateTextFile“C:\System Volume Information\test.txt”,vbtrue
    msgbox err.number&&err.description&&err.source
    如果err.number=70,则
    msgbox“访问被拒绝-不是管理员”
    清楚
    否则错误号为0
    Msgbox“未指定错误”
    清楚
    其他的
    Msgbox“是管理员”
    如果结束
    “管理员应该成功
    fso.CreateTextFile“c:\windows\system32\test.txt”,vbtrue
    msgbox err.number&&err.description&&err.source
    如果err.number=70,则
    msgbox“访问被拒绝-不是管理员”
    清楚
    否则错误号为0
    Msgbox“未指定错误”
    清楚
    其他的
    Msgbox“是管理员”
    如果结束
    
    好的,所以ShellExecute肯定没有返回值。至于另一个:我不能使用它们,因为这样我就不能赋予脚本提升的权限。我从System32运行了整个程序:同样的问题:它总是返回相同的错误代码。请参阅我的编辑。尝试在system32中创建文件。如果未关联,文件创建将失败,访问被拒绝(5或0x80070005或2147942405)。services命令不需要提升,因此启动它不会出错。判断是否升高的唯一方法是尝试需要升高的东西。您可以尝试对
    whoamI/all
    PS进行privilege比较:另外
    wshshell.regwrite
    比wmi更简单。尝试在调试器中启动脚本,其中一个可能已安装
    cscript//x yourscript.vbs
    好的,我尝试过,请参见编辑(希望我正确理解您的意思)。还有一件事:停止和启动后台处理程序可能不需要提升权限,但设置reg键可以,不是吗?我打开regedit时也会收到UAC提示,我是管理员。我的问题不是真正的服务命令,而是返回到bat的错误代码总是我第一次调用脚本时的错误代码。这是因为有限的用户可以做一些事情,他们通常可以列出。仅仅因为一个程序需要管理员权限来做事情并不意味着它不能运行。它就是做不到它应该做的。如果清单上显示
    level=“requireAdministrator”
    ,程序将拒绝运行的唯一时间。如果没有或没有清单,程序将愉快地运行。您只需在c:\windows\system32中创建一个文件。这将告诉你,如果你是管理员。我不愿意为你写脚本。你在工作,我没有。你没有完全按照我说的去做。看来你是一个程序员,没有一个程序工作的模型。您需要开始阅读您使用的每个功能的文档,并且需要浏览文档以获得乐趣。也可以在这里阅读vbs文章。您需要了解COM自动化。最重要的是,您需要了解Win32API的基本结构,这是程序的工作方式-vbs可能会看到事件,但正在发生的是消息。请尝试将您的命令放到上面第二块代码中的“我的if”块中。
    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
    
    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