Vbscript détecter si UAC-élevé
-
04-07-2019 - |
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.
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:
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());