56 votes

Détecter si PowerShell est exécuté en tant qu'administrateur

Comment puis-je savoir dans mes scripts si PowerShell s'exécute avec des privilèges d'administrateur ?

J'ai besoin de le savoir car j'essaie d'exécuter un programme qui nécessite la possibilité d'ouvrir des ports protégés.

86voto

Bill_Stewart Points 1132
([Security.Principal.WindowsPrincipal] `
  [Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Ceci récupère l'identité Windows actuelle et renvoie $true si l'identité actuelle a le rôle d'administrateur (c'est-à-dire s'il s'agit d'une exécution élevée).

58voto

aleksandar Points 319

Dans Powershell 4.0, vous pouvez utiliser nécessite en haut de votre script :

#Requires -RunAsAdministrator

Sorties :

Le script 'MyScript.ps1' ne peut pas être exécuté parce qu'il contient une instruction "#requires" pour l'exécution en tant qu'administrateur. La session Windows PowerShell actuelle n'est pas exécutée en tant qu'administrateur. Démarrez Windows PowerShell en utilisant l'option Exécuter en tant qu'administrateur, puis essayez à nouveau d'exécuter le script.

55voto

RMazi Points 682
[bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-32-544")

Démontrer ce que ça fait :

  • [bool] - Transférer le résultat final dans un bool .
  • [System.Security.Principal.WindowsIdentity]::GetCurrent() - Récupère le WindowsIdentity pour l'utilisateur en cours d'exécution.
  • (...).groups - Accéder à la groups de l'identité pour savoir de quels groupes d'utilisateurs l'identité est membre.
  • -match "S-1-5-32-544" vérifie si groups contient le SID bien connu du groupe Administrateurs, l'identité ne le contiendra que si "run as administrator" a été utilisé.

1voto

npocmaka Points 1141

D'une autre manière :

${env:=::} -eq $null

la variable d'environnement =:: est présenté uniquement si vous n'exécutez PAS le programme en tant qu'administrateur.

Cette vérification devrait être très rapide car il s'agit uniquement d'une comparaison de valeurs variables. De plus, il n'est pas si facile de définir une variable dont le nom commence par une lettre. = en raison des règles syntaxiques, ce qui est également fiable.

0voto

Ben Points 1

Votre code :


invoke-command -computername cavl-ghwwsc3 -command { ([Security.Principal.WindowsPrincipal] 
  [Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)}

fonctionne bien mais comment le lancer à distance dans la session de l'utilisateur actuel (pas dans powershell elevate admin rights parce qu'il renvoie la valeur isadmin de mon administrateur à l'ordinateur distant, pas à l'utilisateur actuel du journal si cet utilisateur isadmin.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X