2014-05-21 30 views
3

我的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的錯誤代碼,而不是後臺打印程序之後的錯誤代碼。

我預計這將運行如下:

  1. 沒有提升權限
  2. 得到提升,如果沒有,用10
  3. 退出,如果用戶點擊是:運行該腳本再次
  4. 運行在ELSE塊中的代碼,退出WScript.Quit 1
  5. 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下它讓我創建一個文件,當我點擊是的。儘管如此,錯誤代碼總是一樣的,不管我點擊是或否。

回答

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(不能被解釋爲錯誤代碼)。

+0

好的,所以ShellExecute絕對沒有返回值。至於另一個:我不能使用它們,因爲那樣我就不能給劇本提升權利。我從System32運行了所有的東西:同樣的問題:它總是返回相同的錯誤代碼。看我的編輯。 – user3629873

+0

嘗試在system32中創建一個文件。如果未加載,文件創建將失敗,並且拒絕訪問(5或0x80070005或2147942405)。服務命令不需要提升,因此啓動時不會出現錯誤。你可以判斷升高與否的唯一方法是嘗試需要提升的東西。你可以嘗試一下'whoamI/all'的私人信息比較:另外'wshshell.regwrite'比wmi更容易。嘗試在調試器中啓動腳本,可以安裝'cscript // x yourscript.vbs' – user3654095

+0

好吧,我試過了,看看編輯(希望我正確理解你)。還有一件事:停止並啓動假脫機程序可能不需要提升權限,但設置註冊表項不會嗎?當我打開註冊表編輯器時,我也會得到一個UAC提示,並且我是管理員。我的問題並不是真正的服務命令,這是事實上,返回到蝙蝠的錯誤代碼始終是我第一次調用腳本。 – user3629873

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錯誤處理,它知道行號和列號。

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 
+0

我不知道嗎?看到我的第三個編輯。 – user3629873

+0

我不願意爲你寫腳本。你在工作,我不是。你沒有完全按照我所說的去做。看起來你是一個沒有程序工作模式的程序員。您需要開始閱讀您使用的每個功能的文檔,並且需要瀏覽文檔以獲得樂趣。另請閱讀vbs文章http://blogs.msdn.com/b/ericlippert/archive/tags/vbscript/。您需要了解COM自動化。大多數情況下,您需要了解Win32API的基本結構,這是程序的工作原理--vbs可能會看到事件,但發生的是消息。 – user3654095

+0

嘗試將您的命令放入MY,如果上面第二塊代碼中有塊。 – user3654095