Détecter si PowerShell s'exécute en tant qu'administrateur

36

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

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

Boomerang
la source
1
Vous devez envisager d'élever les autorisations comme décrit dans Obtention des privilèges d'administrateur dans la réponse PowerShell
MiFreidgeim SO-stop étant maléfique

Réponses:

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

Briser ce que cela fait:

  • [bool]- Jetez le résultat final sur a bool.
  • [System.Security.Principal.WindowsIdentity]::GetCurrent()- Récupère le WindowsIdentitypour l'utilisateur en cours d'exécution.
  • (...).groups- Accédez à la groupspropriété de l'identité pour savoir à quels groupes d'utilisateurs l'identité appartient.
  • -match "S-1-5-32-544"vérifie s'il groupscontient le SID bien connu du groupe Administrateurs, l'identité ne le contiendra que si "exécuter en tant qu'administrateur" a été utilisé.
RMazi
la source
2
Au lieu de simplement publier une ligne de code, pouvez-vous expliquer ce qu'il fait? Cela aide les futurs visiteurs à le comprendre et à l'adapter, si nécessaire.
slhck
BOOO. Donnez plus de votes à cet homme
Kolob Canyon
4
Je préfère la réponse de @Bill_Stewart ci-dessous car elle est exempte de chaînes magiques.
8DH
Au lieu d'utiliser -matchet de transtyper:[Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544'
TheIncorrigible1
57
([Security.Principal.WindowsPrincipal] `
  [Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Cela récupère l'identité Windows actuelle et renvoie True si l'identité actuelle a le rôle Administrateur (c'est-à-dire qu'elle s'exécute avec des droits élevés).

Bill_Stewart
la source
13
Bien que la réponse acceptée soit correcte, cette réponse est beaucoup plus claire, en particulier pour quelqu'un qui pourrait lire votre script dans six mois.
Patrick Seymour
46

Dans Powershell 4.0, vous pouvez utiliser requiert en haut de votre script:

#Requires -RunAsAdministrator

Les sorties:

Le script 'MyScript.ps1' ne peut pas être exécuté car il contient une instruction "#requires" pour être exécuté en tant qu'administrateur. La session Windows PowerShell actuelle ne s'exécute pas en tant qu'administrateur. Démarrez Windows PowerShell à l'aide de l'option Exécuter en tant qu'administrateur, puis réessayez d'exécuter le script.

eddiegroves
la source
que faire si vous voulez une fonction qui se termine si elle n'est pas exécutée par l'administrateur?
Kolob Canyon
1
@KolobCanyon - Il n'y a rien de tel que d'exécuter uniquement une fonction PowerShell élevée; l'ensemble du processus PowerShell est élevé ou non.
Bill_Stewart
@Bill_Stewart oui, mais vous pouvez returnsi l'utilisateur n'est pas administrateur :)
Kolob Canyon
1
@KolobCanyon - vous ne pouvez élever que le processus PowerShell ; vous ne pouvez pas élever une seule fonction . C'est pourquoi le #Requires -RunAsAdministratorest utile: il empêche le script entier de s'exécuter si vous n'êtes pas élevé.
Bill_Stewart
@Bill_Stewart Ouais, je vais devoir l'utiliser à un moment donné.
Kolob Canyon