Frage

Wie kann meine Vbscript erkennen, ob es in einem UAC erhöhten Kontext ausgeführt wird?

Ich habe kein Problem, den Benutzer zu erfassen, und zu sehen, ob der Benutzer in der Gruppe Administratoren ist. Aber dies noch keine Antwort auf die Frage, ob der Prozess erhöht privs hat oder nicht, wenn sie unter Vista oder Windows 2008 ausgeführt Bitte beachten Sie, ich brauche nur zu erkennen Dieser Status; Versuchen Sie nicht, zu erheben oder (err ..) de-elevate.

War es hilfreich?

Lösung

Die Methode, die ich auf endgültig entschieden ist abhängig von der Tatsache, dass Vista und Windows 2008 das whoami.exe Dienstprogramm, und es erkennt die Integritätslevel des Benutzers, der den Prozess besitzt. Ein paar Screenshots helfen hier:

WHOAMI, normal und erhöht, auf Vista http://lh3.ggpht.com/_Svunm47buj0/SQ6ql4iNjPI/AAAAAAAAAeA/iwbcSrAZqRg/whoami%20-%20adminuser%20-%20groups%20-%20cropped.png?imgmax=512

Sie sehen, dass, wenn cmd erhöht läuft, whoami / groups meldet einen „High“ obligatorischen Integritätslevel und einen anderen SID als beim Laufen nicht erhöht. Im Bild ist die Top-Sitzung ist normal, das man unter nach UAC-Prompt erhöht ausgeführt wird.

das Wissen, hier ist der Code, den ich verwendet. Es prüft im Wesentlichen die OS-Version, und wenn es Vista oder Server 2008, ruft CheckforElevation die whoami.exe / Gruppen ausgeführt wird, und sucht nach der Zeichenfolge S-1-16-12288 in der Ausgabe. In diesem Beispiel echo ich gerade Status; in der realen Skript verzweigen ich auf verschiedene Aktionen basierend auf dem Ergebnis.

sub GetOSVersion
Dim strComputer, oWMIService, colOSInfo, oOSProperty, strCaption, strOSFamily
strComputer = "."
Set oWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colOSInfo = oWMIService.ExecQuery("Select * from Win32_OperatingSystem")
'I hate looping through just to get one property. But dunno another way!
For Each oOSProperty in colOSInfo 
  strCaption = oOSProperty.Caption 
Next
If InStr(1,strCaption, "Vista", vbTextCompare) Then strOSFamily = "Vista"
If InStr(1,strCaption, "2008", vbTextCompare) Then strOSFamily = "2008"
If InStr(1,strCaption, "XP", vbTextCompare) Then strOSFamily = "XP"
If InStr(1,strCaption, "2003", vbTextCompare) Then strOSFamily = "2003"
If InStr(1,strCaption, "2000", vbTextCompare) Then strOSFamily = "2000"
If strOSFamily = "" Then 
    Wscript.Echo "No known OS found. (Script can detect Windows 2000, 2003, XP, Vista, 2008.)" 
Else 
    Wscript.Echo "OS Family = " & strOSFamily
End If
Select Case strOSFamily 'if Vista/2008 then call CheckforElevation
Case "Vista"
    CheckforElevation
Case "2008"
    CheckforElevation
Case Else
    Exit Sub
End Select
end sub

sub CheckforElevation 'test whether user has elevated token 
Dim oShell, oExecWhoami, oWhoamiOutput, strWhoamiOutput, boolHasElevatedToken
Set oShell = CreateObject("WScript.Shell")
Set oExecWhoami = oShell.Exec("whoami /groups")
Set oWhoamiOutput = oExecWhoami.StdOut
strWhoamiOutput = oWhoamiOutput.ReadAll
If InStr(1, strWhoamiOutput, "S-1-16-12288", vbTextCompare) Then boolHasElevatedToken = True
If boolHasElevatedToken Then
    Wscript.Echo "Current script is running with elevated privs."
Else
    Wscript.Echo "Current script is NOT running with elevated privs."
End If
end sub

Andere Tipps

Hier ist meine kürzere Lösung:

Function IsElevated
    IsElevated = CreateObject("WScript.Shell").Run("cmd.exe /c ""whoami /groups|findstr S-1-16-12288""", 0, true) = 0
End function 

Diese Funktion wird allein stehen, und wird jedes blinkende Konsolenfenster nicht angezeigt, wenn sie ausgeführt werden.

Die Lösung, die ich Entsendung bin ein paar Produktion bereit VBScripts dass Hebelwirkung whoami diese Informationen zu finden. Eine coole Sache über sie ist, dass sie mit XP (für Informationen, die auf XP verfügbar ist), wenn Sie eine Kopie der Resource Kit platzieren Version von whoami.exe neben dem Skript (oder im System32-Ordner jeder Maschine).

CSI_IsSession.vbs enthält eine einzige Funktion, die man fast alles sagen können, Sie wollen über UAC oder die aktuelle Sitzung wissen, das Skript unter ausgeführt wird.

VBScriptUACKit.vbs (die CSI_IsSession.vbs verwendet) können Sie selektiv für UAC aufzufordern in einem Skript selbst von der Neubelebung. entwickelt und ausgetestet wurde unter vielen Ausführungsszenarien zu arbeiten.

Beide Skripte enthalten Beispielcode, der zeigt, wie das Kern Script-Code verwenden.

ein wenig kürzer in WSH JScript

function isElevated(){
    var strCaption  = "";
    for (var enumItems=new Enumerator(GetObject("winmgmts:\\\\.\\root\\CIMV2").ExecQuery("Select * from Win32_OperatingSystem")); !enumItems.atEnd(); enumItems.moveNext()) {
        strCaption  +=  enumItems.item().Caption;
    }
    if(/Vista|2008|Windows\s7|Windows\s8/.test(strCaption)){
        return (new ActiveXObject("WScript.Shell").run('cmd.exe /c "whoami /groups|findstr S-1-16-12288"', 0, true)) == 0;
    }else{return true}
}    

WScript.Echo(isElevated());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top