batch-file - 确定用户是否在 UAC 提示中单击了 NO

标签 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

我需要一种方法来确定用户是否单击了 NO 然后将错误代码返回到批处理文件。 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 的错误代码,而不是后台处理程序之后的错误代码。

我希望它运行如下:
  • 没有提升的权利
  • 获取海拔,如果没有,退出 10
  • 如果用户单击是:再次运行脚本
  • 运行 ELSE 块中的代码,使用 WScript.Quit 1 退出
  • END IF 之后的代码永远不应该运行

  • 编辑:
        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 运行它时,它让我在单击是时创建一个文件。尽管如此,错误代码始终相同,无论我单击是还是否。

    最佳答案

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

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

    对于你的方法。

    返回值

    No return value.
    

    WScript 有两个执行方法。两者都有不同的功能,所以请阅读文档。
    object.Exec(strCommand)
    

    Exec 方法返回一个 WshScriptExec 对象,该对象提供有关使用 Exec 运行的脚本以及对 StdIn、StdOut 和 StdErr channel 的访问的状态和错误信息。
    object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
    

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

    关于batch-file - 确定用户是否在 UAC 提示中单击了 NO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23778791/

    相关文章:

    batch-file - 视频合并中 .ts 文件的解决方法?

    sql - 如何在 VBScript 中使用带有 adArray 数据类型的 ADODB 参数化查询?

    vbscript - 从 VBScript 发送 Outlook 邮件时如何避免 Outlook 安全警报?

    vbscript - VBS脚本查找并删除文件

    html - 如何在 XPath 中使用变量?

    .net - svn hooks 会因为 .NET 的原因而读取 vbs、ruby 等脚本吗?

    batch-file - 为什么在 FOR 循环中使用通配符模式 *.xls 的相对路径指定的目录中找到的文件的完整路径是错误的?

    windows - 如何在命令行上将文件(不是内容)复制/剪切到 Windows 中的剪贴板?

    用于创建文件和日期的 csv 列表的 Windows 批处理文件

    batch-file - 如何创建批处理文件以管理员身份运行cmd