Meilleure façon de savoir si un utilisateur dispose de privilèges administratifs à partir d'un script VBScript

StackOverflow https://stackoverflow.com/questions/301860

  •  08-07-2019
  •  | 
  •  

Question

Je dois vérifier si l'utilisateur qui exécute le script dispose des privilèges d'administrateur sur la machine.

J'ai spécifié l'utilisateur qui exécutait le script, car celui-ci aurait pu être exécuté avec un utilisateur autre que celui qui a ouvert la session en utilisant quelque chose de similaire à & "; Runas &";

.

@Javier: Les deux solutions fonctionnent sur un PC sur lequel une version anglaise de Windows est installée, mais pas si la version installée est dans une langue différente. En effet, le groupe Administrateurs n'existe pas, le nom est différent, par exemple en espagnol. J'ai besoin de la solution pour fonctionner dans toutes les configurations.

Était-ce utile?

La solution

Vous pouvez utiliser le script si vous souhaitez savoir si l'utilisateur connecté est un administrateur

Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
strUser = objNetwork.UserName

isAdministrator = false

Set objGroup = GetObject("WinNT://" & strComputer & "/Administrators")
For Each objUser in objGroup.Members
    If objUser.Name = strUser Then
        isAdministrator = true        
    End If
Next

If isAdministrator Then
    Wscript.Echo strUser & " is a local administrator."
Else
    Wscript.Echo strUser & " is not a local administrator."
End If

Je ne suis pas sûr de savoir comment le gérer lorsque le script est exécuté avec & "Runas &"; J'ai peur.

Autres conseils

Ce faisant, vous interrompez les scénarios dans lesquels l'utilisateur dispose des privilèges requis pour votre script mais n'appartient pas aux administrateurs. Au lieu de vérifier l’appartenance à un groupe, recherchez les capacités spécifiques dont vous avez besoin.

Qu'en est-il de la recherche de " \\ nom_ordinateur \ Admin $ \ system32 "?

function IsLoggedInAsAdmin()
    isAdmin = false
    set shell = CreateObject("WScript.Shell")
    computername = WshShell.ExpandEnvironmentStrings("%computername%")
    strAdmin = "\\" & computername & "\Admin$\System32"

    isAdmin = false

    set fso = CreateObject("Scripting.FileSystemObject")

    if fso.FolderExists(strAdmin) then
        isAdmin = true
    end if

    IsLoggedInAsAdmin = isAdmin
end function

J’ai essayé la solution Tim C sur une machine Windows 7 du réseau de mon entreprise, où j’ai effectivement les droits d’administrateur. Mais cela montre que mon utilisateur ne dispose pas des droits d’administrateur.

À la place, j’ai utilisé une méthode plus astucieuse, en appelant & "; défragmentation &"; dans l'invite de commande requiert un accès administrateur. Bien que cela fonctionne, méfiez-vous des codes de retour pour XP et 7 (et éventuellement les futures versions de Windows). Il existe peut-être des choix plus cohérents que la défragmentation, mais cela fonctionne pour le moment.

Function isAdmin
    Dim shell
    set shell = CreateObject("WScript.Shell")
    isAdmin = false
    errlvl = shell.Run("%comspec% /c defrag /?>nul 2>nul", 0, True)
    if errlvl = 0 OR errlvl = 2 Then '0 on Win 7, 2 on XP
        isAdmin = true
    End If
End Function

Je sais que ce fil de discussion est très ancien et qu’il est marqué comme ayant répondu, mais la réponse ne donne pas vraiment ce que le PO a demandé.

Pour ceux qui recherchent et trouvent cette page, voici une alternative qui établit un rapport basé sur les droits et non sur l'appartenance à un groupe. Par conséquent, l'administrateur Runas affiche les droits d'administrateur comme étant True.

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

Cet article contient une bonne partie du code expliquant comment énumérer les membres d'un groupe (copié ici pour plus de commodité et modifié pour ne pas utiliser d'adresse électronique):

Function RetrieveUsers(domainName,grpName)

dim GrpObj
dim mbrlist
dim mbr

'-------------------------------------------------------------------------------
' *** Enumerate Group Members ***
'-------------------------------------------------------------------------------

' Build the ADSI query and retrieve the group object
Set GrpObj = GetObject("WinNT://" & domainName & "/" & grpName & ",group")

' Loop through the group membership and build a string containing the names
for each mbr in GrpObj.Members
   mbrlist = mbrlist & vbTab & mbr.name & vbCrLf
Next

RetrieveUsers=mbrlist

End Function

Vous pouvez ensuite écrire une fonction pour voir si un utilisateur est dans la liste ...

Function IsAdmin(user)
    IsAdmin = InStr(RetrieveUsers("MachineName", "Administrators"), user) > 0
End Function

... et appelez-le comme ceci:

If IsAdmin("LocalAccount") Then
    Wscript.Echo "LocalAccount is an admin"
Else
    Wscript.Echo "LocalAccount is not an admin"
End If

Encore une autre méthode rapide et malpropre. Renvoie & Lt; & Gt; 0 Si IsNotAdmin

Function IsNotAdmin()
    With CreateObject("Wscript.Shell")
        IsNotAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
    End With
End Function

L'utilisateur n'est peut-être pas dans le groupe d'administrateurs locaux. Par exemple - administrateurs de domaine. UAC bloque généralement l’accès des administrateurs au registre, partage e.t.c. même pour les administrateurs (seul le manuel & "; exécuté en tant qu'administrateur &" a raison) ...

Voici ma façon folle:

Set Shell = CreateObject("WScript.Shell")
set fso = CreateObject("Scripting.FileSystemObject")
strCheckFolder = Shell.ExpandEnvironmentStrings("%USERPROFILE%") 
strCheckFolder = strCheckFolder+"\TempFolder"

if fso.FolderExists(strCheckFolder) then
        fso.DeleteFolder(strCheckFolder)
end if

fso.CreateFolder(strCheckFolder)
tempstr = "cmd.exe /u /c chcp 65001 | whoami /all >" & strCheckFolder & "\rights.txt"
Shell.run tempstr

tempstr = strCheckFolder & "\rights.txt"
WScript.Sleep 200
Set txtFile = FSO.OpenTextFile(tempstr,1)

IsAdmin = False

Do While Not txtFile.AtEndOfStream
  x=txtFile.Readline
  If InStr(x, "S-1-5-32-544") Then
      IsAdmin = True
  End If
Loop

txtFile.Close
Function isAdmin
    Dim shell
    Set shell = CreateObject("WScript.Shell")
    isAdmin = false
    errorLevel = shell.Run("%comspec% /c net session >nul 2>&1", 0, True)
    if errorLevel = 0
        isAdmin = true
    End If
End Function

Utilisation de & "localhost &" au lieu du nom d'hôte réel, le temps d'exécution du script augmente d'environ 10 fois!
Mon code final est le suivant:

' get_admin_status.vbs
Option Explicit

Dim oGroup:   Set oGroup   = GetObject("WinNT://localhost/Administrators,group")
Dim oNetwork: Set oNetwork = CreateObject("Wscript.Network")

Dim sSearchPattern: sSearchPattern = "WinNT://" & oNetwork.UserDomain & "/" & oNetwork.UserName

Dim sMember
For Each sMember In oGroup.Members
  If sMember.adsPath = sSearchPattern Then
    ' Found...
    Call WScript.Quit(0)
  End If
Next

' Not found...
Call WScript.Quit(1)

Ce script renvoie le code de sortie 0 si l'utilisateur actuel est un administrateur local.
Utilisation: cscript.exe get_admin_status.vbs

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top