2009-10-21 7 views
2

Je voudrais vérifier (par VBScript) si le contexte dans lequel le script s'exécute me permet d'effectuer des tâches administratives.VBScript: Vérifie si le script a des permissions administratives

Exigences:

  • La solution devrait fonctionner sur tous les systèmes d'exploitation Windows Server 2003. commençant par (Cette règle des solutions qui vérifient juste pour l'appartenance au groupe Administrateurs - rappelez-vous qu'il ya UAC dans Vista et Windows 7!)
  • La solution doit être simple. Une solution 50 LOC qui vérifie les appartenances au groupe Windows (de façon récursive, bien sûr, puisque l'utilisateur peut être membre d'un groupe membre d'un groupe ... qui est membre du groupe Administrateurs) et effectue ensuite des contrôles supplémentaires pour Vista UAC est pas simple.
  • La solution peut être un peu sale, donc quelque chose le long des lignes de this solution serait ok.
  • Il ne devrait pas être trop sale. Écrire un fichier dans C: \ Windows ou écrire une clé de registre est trop sale à mon avis, puisqu'il modifie le système. (EDIT: Ce qui pourrait ne pas fonctionner de toute façon: par exemple, lors de l'utilisation VBScript dans une HTA, coups de pied de redirection du CCU à.)

question connexe: https://stackoverflow.com/questions/301860 (toutes les réponses que je (présence de a) ignorer la question UAC et (b) sont défectueux car ils ignorent la possibilité qu'un utilisateur ait des permissions administratives bien qu'il ne soit pas membre direct dans le groupe Administrateurs)

Répondre

1

Peut-être combiner ceci (WhoAmI from VBscript) avec ceci (UAC Turned On).

Voici le code, le pré-requis regrettable pour XP est "whoami.exe", trouvé dans un kit de ressources ou d'outils de support pour XP (Wikipedia) - Je voudrais toujours trouver un moyen de le faire sans .

If UserPerms("Admin") Then 
Message = "Good to go" 
Else 
Message = "Non-Admin" 
End If 

If UACTurnedOn = true Then 
Message = Message & ", UAC Turned On" 
Else 
Message = Message & ", UAC Turned Off (Or OS < Vista)" 
End If 

Wscript.echo Message 

Function UserPerms (PermissionQuery)   
UserPerms = False ' False unless proven otherwise   
Dim CheckFor, CmdToRun   

Select Case Ucase(PermissionQuery)   
'Setup aliases here   
Case "ELEVATED"   
    CheckFor = "S-1-16-12288"   
Case "ADMIN"   
    CheckFor = "S-1-5-32-544"   
Case "ADMINISTRATOR"   
    CheckFor = "S-1-5-32-544"   
Case Else     
    CheckFor = PermissionQuery     
End Select   

CmdToRun = "%comspec% /c whoami /all | findstr /I /C:""" & CheckFor & """" 

Dim oShell, returnValue   
Set oShell = CreateObject("WScript.Shell") 
returnValue = oShell.Run(CmdToRun, 0, true)  
If returnValue = 0 Then UserPerms = True     
End Function 

Function UACTurnedOn() 
On Error Resume Next 

Set oShell = CreateObject("WScript.Shell") 
If oShell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA") = 0 Then 
     UACTurnedOn = false 
Else 
     UACTurnedOn = true 
End If 
End Function 
+0

Approche intéressante; vous devez ajouter >> Si UserPerms ("Elevated") Then Message = Message & ", mais en cours d'exécution" << après la ligne "UAC Turned On". Le whoami.exe est un réel inconvénient, d'autant plus que je ne suis pas sûr que vous ayez le droit de le redistribuer (et vous ne pouvez pas vous attendre à ce qu'un client télécharge lui-même un tel fichier). – Heinzi

+0

Oui, j'aime cette addition. Je ne peux pas trouver un moyen de WMI autre que l'itinéraire déjà exploré avec l'appartenance de groupe (et imbriquée). Il peut toujours y avoir un composant COM qui permet à vbscript de vérifier rapidement le statut de l'administrateur. –

1

Le code ci-dessus qui exige "whoami" est de notre script IfUserPerms à CSI-Windows.com/toolkit/ifuserperms. Après avoir lu votre message ici, j'ai créé un nouveau code de script qui vérifie les droits d'administrateur avec du code rapide, petit, efficace, passif (sans changement) dans les deux VBS (9 lignes) et CMD/BAT (3 lignes) . Il fonctionne également avec UAC en signalant false si l'utilisateur n'est pas élevé.

Vous pouvez trouver le code ici: http://csi-windows.com/toolkit/csi-isadmin

+1

Merci, c'est très utile. Cela vous dérangerait-il de poster les neuf lignes de code ici? – Heinzi

+1

'requête reg HKEY_USERS \ S-1-5-20 \ Environnement/v TEMP 2> NUL 1> & 2 && echo Oui || echo No' – RolKau

1

J'ai ajouté deux kits de script supplémentaires qui améliorent considérablement le code original ci-dessus qui est venu de ifuserperms.vbs.

CSI_IsSession.vbs peut vous indiquer à peu près tout ce que vous voulez savoir sur l'UAC ou sur la session en cours dans laquelle le script s'exécute. (Qui utilise CSI_IsSession.vbs) vous permet d'inviter sélectivement UAC dans un script en se relançant. A été conçu et débogué pour fonctionner dans de nombreux scénarios d'exécution.

0

Voici le meilleur moyen de faire un fichier de script ou tout autre fichier exécuter en tant qu'administrateur:

Créez d'abord votre script VBS de tout ce que vous devez faire. Dans mon cas, il s'agissait d'un registre modifier vbs pour me permettre de connecter automatiquement puis lorsque la machine a été redémarré, un autre fichier a été exécuté pour assurer que la connexion automatique n'a plus été activée. Une fois que vous avez créé votre fichier, vous devez créer un raccourci d'invite de commande cmd. Suivant Cliquez avec le bouton droit de la souris sur le raccourci et modifiez les propriétés pour qu'elles s'exécutent en tant qu'administrateur.

Collez votre chemin de fichier comme ceci: D: \ WINDOWS \ system32 \ cmd.exe/c "D: \ dump \ Scripts \ StartUp.vbs"

Le 'C' signifie qu'il fermera après la fin Si vous voulez qu'il reste ouvert, utilisez 'K'

J'espère que cela aidera quelqu'un d'autre.

1

Je sais que ce fil est très ancien et marqué comme étant une réponse, mais c'est une méthode plus simple qui a toujours fonctionné pour moi. L'utilisateur S-1-5-19 est l'autorité NT locale, donc l'accès à la clé prend des droits d'administrateur. Cela fonctionne s'il est exécuté via l'élévation.

Option Explicit 

msgbox isAdmin(), vbOkonly, "Am I an admin?" 

Private Function IsAdmin() 
    On Error Resume Next 
    CreateObject("WScript.Shell").RegRead("HKEY_USERS\S-1-5-19\Environment\TEMP") 
    if Err.number = 0 Then 
     IsAdmin = True 
    else 
     IsAdmin = False 
    end if 
    Err.Clear 
    On Error goto 0 
End Function 
Questions connexes