Mon but était de créer un script WSH (donc pas d’API) permettant de savoir si un utilisateur à les droits administrateur (local ou domaine), sans avoir à questionner Active Directory via LDAP ou autre. Les Scripting Guys apportent une partie de réponse avec cet article. Sinon sur Windows Server 2003 il existe un objet COM ManageYourServer (je n’ai pas testé).

Bon du coup j'ai concocté 2 scripts :

Le 1er inspiré par un script où l’auteur test les droits de l’utilisateur en mappant un lecteur réseau (Une lettre de lecteur doit être réservée à l’usage de ce script ).
Le mien est plus discret puisqu’il teste le droit de lecture d’une clé système dans le registre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Const HKEY_USERS = &H80000003
Const READ_CONTROL = &H20000
 
Set objRegistry=GetObject("winmgmts:root\default:StdRegProv")
objRegistry.CheckAccess HKEY_USERS, "S-1-5-19", READ_CONTROL, blnIsAdmin
 
If blnIsAdmin = true Then
    WScript.Echo "Admin"
Else
    WScript.Echo "Pas admin"
End If
Pas convaincu ? Voilà un moyen plus fin (mais également plus long et complexe) de vérifier les droits d’un utilisateur en fonction des SID des groupes auxquels il appartient (S-1-5-32-544 pour le groupe Administrateurs).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Option Explicit
 
wscript.echo "Admin : " & IsAdmin()
 
Function IsAdmin()
    'On Error Resume Next
 
    'Résultat à déterminer
    IsAdmin = False
 
    'Les ruches utilisées
    Const HKEY_CURRENT_USER = &H80000001
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const HKEY_USERS = &H80000003 
 
    'Identifiant utilisateur (User ID)
    Dim strRegKey, strRegValue, strCurrentUserID, strUserID
    strRegKey = "Identities"
    strRegValue = "Default User ID"
 
    'SID utilisateur
    Dim strSID, arrSID
 
    'Groupes auxquels l'utilisateur appartient
    Dim strRegGroupPolicy, strRegGroupMembership, strGroup, arrGroup, strGroupSID
    strRegGroupPolicy = "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\"
    strRegGroupMembership = "\GroupMembership"
 
    'Accès au registre
    Dim objRegistry : Set objRegistry=GetObject("winmgmts:root\default:StdRegProv")
 
    'Récupère l'identifiant (User ID) de l'utilisateur connecté
    objRegistry.GetStringValue HKEY_CURRENT_USER, strRegKey, strRegValue, strCurrentUserID
    'pour le comparer aux comptes enregistrés et ainsi déterminer le SID de l'utilisateur
    objRegistry.EnumKey HKEY_USERS, "", arrSID
 
    'Parcours des comptes enregistrés
    For Each strSID In arrSID
 
        'Omission des comptes systèmes ainsi que des comptes suffixés par _Classes
        If strSID <> ".DEFAULT" And strSID <> "S-1-5-18" And _
           strSID <> "S-1-5-19" And strSID <> "S-1-5-20" And _
           Right(strSID, 8) <> "_Classes" Then
 
              'Récupére le UserID du compte qui est peut être celui de l'utilisateur connecté
              objRegistry.GetStringValue HKEY_USERS, strSID & "\" & strRegKey, strRegValue, strUserID
 
              'Vérifie si les UserID correspondent 
              'et donc si le SID du compte parcouru est bien celui de l'utilisateur connecté
              If strCurrentUserID = strUserID Then
 
                  'Liste les SID des groupes auquels appartient l'utilisateur
                  objRegistry.EnumValues HKEY_LOCAL_MACHINE, strRegGroupPolicy & strSID & strRegGroupMembership, arrGroup
                  For Each strGroup In arrGroup
 
                      'Regarde parmis les SID si le groupe Administrateurs (S-1-5-32-544) y figure
                      objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strRegGroupPolicy & strSID & strRegGroupMembership, strGroup, strGroupSID
                      If strGroupSID = "S-1-5-32-544" Then
                          'Si oui l'utilisateur peut être considéré comme administrateur 
                          IsAdmin = True
                          Exit Function
                      End If
                  Next
 
                  'Quitte, Admin ou pas, puisque le compte de l'utilisateur a bien été vérifié
                  Exit Function
              End If           
        End If
    Next 
End Function
Peut être que ça pourrait faire un point de la FAQ non ?