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.
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.
([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).
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.
[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é.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.
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.
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.