Dans un script PowerShell, comment puis-je vérifier si j'utilise des privilèges d'administrateur?


Réponses:


36
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

(à partir des astuces de sécurité de la ligne de commande )


2
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ()) & {if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole]) & Administrateur) {(obtenir) host) .UI.RawUI.Backgroundcolor = "hôte de l'hôte d'écriture sur l'hôte effacé de DarkRed" Avertissement: PowerShell s'exécute en tant qu'administrateur
— `n

Première ligne: dernière accolade fermante) est manquant. Je ne peux pas le réparer car il y a moins de 6 caractères.
— Xavier Nicollet

57

Dans Powershell 4.0, vous pouvez utiliser des exigences 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" à exécuter 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 essayez à nouveau d'exécuter le script.


Pas exactement ce que je cherchais mais toujours très utile. Merci Eddie!
— Michael Kelley

33
function Test-Administrator  
{  
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

Exécutez la fonction ci-dessus. SI le résultat est True, l'utilisateur dispose des privilèges d'administrateur.


4
Cela détermine uniquement si l'utilisateur qui exécute le script est un administrateur de la machine, et non si le script est en cours d' exécution avec des privilèges d'administrateur . En d'autres termes, cela retournera toujours vrai même si l'utilisateur n'a pas utilisé "exécuter en tant qu'administrateur" pour lancer le shell de commande.
— Développeur holistique

2
@ HolisticDeveloper, c'est incorrect. Si vous n'êtes pas élevé, il retournera false
— charleswj81

@ charleswj81 à partir de maintenant, j'observe le comportement décrit par Holistic Developer.
— Samedi

Je ne pense pas que vous ayez besoin du point-virgule ... mais cela dit, je ne pense pas qu'il jette une erreur non plus.
— Kolob Canyon

Cela fonctionne pour moi sur Win10 à partir de 2018. Renvoie False si le compte d'utilisateur actuel n'est pas élevé, renvoie True si Powershell s'exécute en mode Elevé.
— arberg

0

Cela vérifiera si vous êtes un administrateur, sinon, il rouvrira dans PowerShell ISE en tant qu'administrateur.

J'espère que cela t'aides!

    $ver = $host | select version
    if ($ver.Version.Major -gt 1)  {$Host.Runspace.ThreadOptions = "ReuseThread"}

    # Verify that user running script is an administrator
    $IsAdmin=[Security.Principal.WindowsIdentity]::GetCurrent()
    If ((New-Object Security.Principal.WindowsPrincipal $IsAdmin).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) -eq $FALSE)
    {
      "`nERROR: You are NOT a local administrator.  Run this script after logging on with a local administrator account."
        # We are not running "as Administrator" - so relaunch as administrator

        # Create a new process object that starts PowerShell
        $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell_ise";

        # Specify the current script path and name as a parameter
        $newProcess.Arguments = $myInvocation.MyCommand.Definition;

        # Indicate that the process should be elevated
        $newProcess.Verb = "runas";

        # Start the new process
        [System.Diagnostics.Process]::Start($newProcess);

        # Exit from the current, unelevated, process
        exit
    }

0

en combinant les réponses ci-dessus, vous pouvez utiliser quelque chose comme ceci au début de votre script:

# todo: put this in a dedicated file for reuse and dot-source the file
function Test-Administrator  
{  
    [OutputType([bool])]
    param()
    process {
        [Security.Principal.WindowsPrincipal]$user = [Security.Principal.WindowsIdentity]::GetCurrent();
        return $user.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator);
    }
}

if(-not (Test-Administrator))
{
    # TODO: define proper exit codes for the given errors 
    Write-Error "This script must be executed as Administrator.";
    exit 1;
}

$ErrorActionPreference = "Stop";

# do something

Une autre méthode consiste à démarrer votre script avec cette ligne, ce qui empêchera son exécution s'il n'est pas démarré avec des droits d'administrateur.

#Requires -RunAsAdministrator

1
Malheureusement, ça ne marche pas. Si le script n'est pas exécuté avec des droits élevés, il ne se charge même pas et votre message d'erreur personnalisé ne s'affiche pas.
— JamesQMurphy

Merci. J'ai corrigé ma réponse ci-dessus.
— MovGP0
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.