Domanda

Come può il mio vbscript rilevare se è in esecuzione in un contesto elevato di Controllo dell'account utente?

Non ho problemi a rilevare l'utente e vedere se l'utente fa parte del gruppo Amministratori. Ma questo non risponde ancora alla domanda se il processo abbia privilegi elevati o meno, quando si esegue in Vista o Windows 2008. Si noti che ho solo bisogno di rilevare questo stato; non tentare di elevare o (err.) de-elevare.

È stato utile?

Soluzione

Il metodo su cui ho finalmente deciso dipende dal fatto che Vista e Windows 2008 dispongono dell'utilità whoami.exe e rileva il livello di integrità dell'utente proprietario del processo. Un paio di schermate aiutano qui:

Sapendo questo, ecco il codice che ho usato. In sostanza controlla la versione del sistema operativo e, se è Vista o Server 2008, chiama CheckforElevation che esegue whoami.exe / group e cerca la stringa S-1-16-12288 nell'output. In questo esempio echo solo lo stato; nella sceneggiatura reale mi dirigo verso diverse azioni in base al risultato.

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

Altri suggerimenti

Ecco la mia soluzione più breve:

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

Questa funzione è indipendente e non verrà visualizzata alcuna finestra console lampeggiante quando eseguita.

La soluzione che sto postando è un paio di script VB pronti per la produzione che sfruttano il whoami per trovare queste informazioni. Una cosa interessante è che funzionano con XP (per informazioni disponibili su XP) se si inserisce una copia della versione del Resource Kit di whoami.exe accanto allo script (o nella cartella system32 di ogni macchina).

CSI_IsSession.vbs contiene una singola funzione che può dirti quasi tutto quello che vuoi per conoscere l'UAC o la sessione corrente in cui è in esecuzione lo script.

VBScriptUACKit.vbs (che utilizza CSI_IsSession.vbs) ti consente di richiedere selettivamente UAC in una sceneggiatura rilanciandosi. È stato progettato e sottoposto a debug per funzionare in molti scenari di esecuzione.

Entrambi gli script contengono un codice di esempio che dimostra come utilizzare il codice dello script principale.

un po 'più breve 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());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top