我的VBScript文件:確定用戶是否在UAC NO點擊提示
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會返回任何錯誤代碼嗎?
問題是返回到蝙蝠的錯誤代碼始終是相同的(在本例中爲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的錯誤代碼,獲得提升權限後。無論我點擊否或是。當我點擊yes時,它按預期運行程序,並在啓動後臺打印程序後退出,但返回到該批次的錯誤代碼仍然是第一個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下它讓我創建一個文件,當我點擊是的。儘管如此,錯誤代碼總是一樣的,不管我點擊是或否。
好的,所以ShellExecute絕對沒有返回值。至於另一個:我不能使用它們,因爲那樣我就不能給劇本提升權利。我從System32運行了所有的東西:同樣的問題:它總是返回相同的錯誤代碼。看我的編輯。 – user3629873
嘗試在system32中創建一個文件。如果未加載,文件創建將失敗,並且拒絕訪問(5或0x80070005或2147942405)。服務命令不需要提升,因此啓動時不會出現錯誤。你可以判斷升高與否的唯一方法是嘗試需要提升的東西。你可以嘗試一下'whoamI/all'的私人信息比較:另外'wshshell.regwrite'比wmi更容易。嘗試在調試器中啓動腳本,可以安裝'cscript // x yourscript.vbs' – user3654095
好吧,我試過了,看看編輯(希望我正確理解你)。還有一件事:停止並啓動假脫機程序可能不需要提升權限,但設置註冊表項不會嗎?當我打開註冊表編輯器時,我也會得到一個UAC提示,並且我是管理員。我的問題並不是真正的服務命令,這是事實上,返回到蝙蝠的錯誤代碼始終是我第一次調用腳本。 – user3629873