Question

Comment mon vbscript peut-il détecter s'il fonctionne ou non dans un contexte élevé de contrôle de compte d'utilisateur?

Je n'ai aucun problème à détecter l'utilisateur et à voir s'il se trouve dans le groupe des administrateurs. Mais cela ne répond toujours pas à la question de savoir si le processus a élevé des privilèges, sous Vista ou Windows 2008. Veuillez noter que je n'ai besoin que de détecter cet état; n'essayez pas d'élever ou (euh ..) de réduire.

Était-ce utile?

La solution

La méthode que j'ai finalement choisie dépend du fait que Vista et Windows 2008 disposent de l'utilitaire whoami.exe, qui détecte le niveau d'intégrité de l'utilisateur propriétaire du processus. Quelques captures d’écran aident ici:

Sachant cela, voici le code que j'ai utilisé. Il vérifie essentiellement la version du système d’exploitation et, s’il s’agit de Vista ou Server 2008, appelle CheckforElevation, qui exécute whoami.exe / groups, et recherche la chaîne S-1-16-12288 dans le résultat. Dans cet exemple, je viens juste d’annoncer le statut; dans le script réel, je passe à différentes actions en fonction du résultat.

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

Autres conseils

Voici ma solution plus courte:

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

Cette fonction est autonome et n’affiche pas de fenêtre de console clignotante lorsqu’elle est exécutée.

La solution que je publie consiste en deux scripts VBS prêts à la production, qui exploitent whoami pour trouver cette information. Une bonne chose à leur sujet est qu’ils travaillent avec XP (pour les informations disponibles sur XP) si vous placez une copie de la version du Kit de ressources de whoami.exe à côté du script (ou dans le dossier system32 de chaque ordinateur).

CSI_IsSession.vbs contient une fonction unique qui peut vous dire à peu près tout ce que vous voulez. pour en savoir plus sur le contrôle de compte d'utilisateur ou la session en cours sous laquelle le script est exécuté.

VBScriptUACKit.vbs (qui utilise CSI_IsSession.vbs) vous permet de sélectionner de manière sélective le contrôle de compte d'utilisateur dans un script en se relancant. A été conçu et débogué pour fonctionner avec de nombreux scénarios d'exécution.

Les deux scripts contiennent un exemple de code qui montre comment utiliser le code de script principal.

un peu plus court dans 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());
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top