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

47

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

Michael Kelley
la source
1
Recherchez les références

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 )

davey
la source
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.

Eddiegroves
la source
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.

Shay Levy
la source
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
    }
blayderunner123
la source
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
MovGP0
la source
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