web-dev-qa-db-fra.com

Comment lister les privilèges Windows pour n'importe quel utilisateur

J'essaie d'écrire un script pour répertorier les privilèges (par exemple, SeShutDownPrivilege etc.) de tous les comptes d'utilisateurs. Je préférerais que mon script soit exécuté en tant qu'utilisateur standard, mais je peux l'exécuter en tant que compte administrateur si nécessaire. Voici les approches que j'ai essayées jusqu'à présent:

  • using tokensz (à partir de https://blogs.technet.Microsoft.com/askds/2007/11/02/whats-in-a-token/ ): fonctionne (tokensz /compute_tokensize /dump_groups) pour l'élément actuellement connecté utilisateur. Mais lorsque je suis connecté même en tant qu'administrateur de domaine, lorsque j'essaie de trouver un autre utilisateur (tokensz /compute_tokensize /dump_groups /user:[another.user]), l'erreur SEC_E_LOGON_DENIED s'affiche.

  • whoami /all fonctionne mais uniquement pour l'utilisateur actuellement connecté

  • ntrights.exe ne semble pas pouvoir lister les privilèges, seulement ajouter et supprimer.

  • secedit /export /areas USER_RIGHTS /cfg out.txt: liste tous les privilèges et les SID qui ont ce privilège, mais cette liste semble incomplète; la sortie de tokensz montre un utilisateur John.Smith avec SeShutdownPrivilege, mais la sortie de secedit pour SeShutdownPrivilege répertorie les groupes dont John.Smith n'est pas membre.

Je peux utiliser des exécutables portables (par exemple, tokensz.exe, ntrights.exe) et des utilitaires intégrés, mais je ne pourrai pas installer d'applications ou d'extensions.

6
A G

Vous pouvez utiliser AccessChk pour accomplir cette tâche.

Accesschk “domain\user” -a * listera toutes les autorisations d'un utilisateur de domaine donné.

Vous pouvez appeler ce programme dans un script PowerShell, concaténer les résultats dans un fichier texte, puis filtrer uniquement les autorisations que vous souhaitez connaître.

3
Ramhound

Quiconque cherche un script PowerShell doit le faire:

gwmi Win32_UserProfile | foreach-object {
 $sid = New-Object System.Security.Principal.SecurityIdentifier($_.SID)
 $user = $sid.Translate([System.Security.Principal.NTAccount])
 $username = $user.Value
 $username
 $chkCmd = "accesschk """ + $username + """ -a * -q"
 iex $chkCmd
 ""
}

Il obtient la liste des utilisateurs qui ont un profil sur la machine locale , déterminent leurs noms à partir du SID et invoquent accesschk - comme recommandé par Ramhound - on leur. L'enregistrement de chaque utilisateur commence par le nom d'utilisateur au format DOMAIN\user, contient chaque droit sur une ligne et se termine par une ligne vierge. (Traduction de SID avec l'aimable autorisation de cet article .) Vous pouvez transférer son contenu dans un fichier à l'aide de l'opérateur de redirection, >.

AccessChk a une mise en garde: il semble produire une liste vide pour les utilisateurs de domaine qui ne disposent pas de droits d'administrateur local. Par conséquent, cette version qui produit les informations ci-dessus pour chaque utilisateur connu du domaine et de la machine est un peu boiteuse, mais peut devenir utile avec une future version de l'outil:

gwmi Win32_UserAccount | foreach-object {
 $username = $_.Caption
 $username
 $chkCmd = "accesschk """ + $username + """ -a * -q"
 iex $chkCmd
 ""
}

Si vous vous demandez de quoi parle secedit, vous obtenez simplement la liste des principaux (sous forme de SID) auxquels les droits ont été attribués dans l'attribution des droits utilisateur (voir secpol.msc). Par conséquent, vous verrez généralement les SID pour des groupes tels que Utilisateurs ou Administrateurs plutôt que des personnes spécifiques.

4
Ben N

Ce script peut vous aider. Il offre les fonctions suivantes, toutes utilisant PowerShell pur:

  • Grant-UserRight
  • Revoke-UserRight
  • Get-UserRightsGrantedToAccount
  • Get-AccountsWithUserRight
  • Grant-TokenPrivilege
  • Revoke-TokenPrivilege