349 votes

Exécuter une commande en tant qu'administrateur avec PowerShell ?

Vous savez que si vous êtes l'utilisateur administratif d'un système et que vous pouvez juste faire un clic droit, disons, sur un script batch et l'exécuter en tant qu'administrateur sans entrer le mot de passe administrateur ?

Je me demande comment faire cela avec un script PowerShell. Je ne veux pas avoir à saisir mon mot de passe, je veux juste imiter le clic droit. Exécuter en tant qu'administrateur méthode.

Tout ce que j'ai lu jusqu'à présent vous oblige à fournir le mot de passe de l'administrateur.

0 votes

Essayez gsudo . Un sudo open-source gratuit pour Windows qui permet d'exécuter en tant qu'administrateur à partir de la ligne de commande. Une fenêtre pop-up UAC apparaîtra.

382voto

Shay Levy Points 41404

Si la console actuelle n'est pas élevée et que l'opération que vous essayez d'effectuer nécessite des privilèges élevés, vous pouvez commencer par powershell avec le Exécuter en tant qu'administrateur option :

PS> Start-Process powershell -Verb runAs

Docs Microsoft : Démarrage du processus

0 votes

C'est un moyen simple et agréable de le faire fonctionner en tant qu'administrateur.

142voto

pgk Points 190

Voici un complément à la suggestion de Shay Levi (il suffit d'ajouter ces lignes au début d'un script) :

if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))  
{  
  $arguments = "& '" +$myinvocation.mycommand.definition + "'"
  Start-Process powershell -Verb runAs -ArgumentList $arguments
  Break
}

Il en résulte que le script actuel est transmis à un nouveau processus powershell en mode Administrateur (si l'utilisateur actuel a accès au mode Administrateur et que le script n'est pas lancé en tant qu'Administrateur).

0 votes

Facile à modifier pour qu'il y ait une erreur lorsqu'il n'est pas exécuté en tant qu'administrateur. Il suffit de prendre le if et mettre un throw à l'intérieur du bloc d'alors.

0 votes

La seule syntaxe qui a fonctionné pour moi est celle du message original, pas celle de G.Lombard ni celle d'anjdreas.

0 votes

Existe-t-il un moyen de supprimer Windows Si vous voulez exécuter powershell en tant qu'administrateur ? Pour les applications dans lesquelles vous devez l'exécuter en silence, le fait que l'on vous demande votre nom d'utilisateur peut être gênant.

15voto

manojlds Points 96599

Vous pouvez facilement ajouter quelques entrées de registre pour obtenir un menu contextuel "Exécuter en tant qu'administrateur" pour les éléments suivants .ps1 des fichiers :

New-Item -Path "Registry::HKEY_CLASSES_ROOT\Microsoft.PowershellScript.1\Shell\runas\command" `
-Force -Name '' -Value '"c:\windows\system32\windowspowershell\v1.0\powershell.exe" -noexit "%1"'

(mis à jour vers un script plus simple par @Shay)

En gros, à HKCR:\Microsoft.PowershellScript.1\Shell\runas\command définir la valeur par défaut pour invoquer le script en utilisant Powershell.

0 votes

Cela ne fonctionne pas, vous créez une clé "(par défaut)" et ne mettez pas à jour la valeur de la clé "(par défaut)". J'ai pu condenser le code en une seule ligne qui fonctionne pour moi. Pouvez-vous le tester ? New-Item -Path "Registre::HKEY_CLASSES_ROOT \Microsoft.PowershellScript.1\Sh ell \runas\command " -Force -Name '' -Value '"c : \windows\system32\windowspowershell\v1.0\powershell.exe " -noexit "%1"

0 votes

@Shay Levy - Salut Shay, merci pour la mise à jour. J'ai mis à jour la réponse avec elle. Elle fonctionne. Mais celle que j'avais fonctionnait aussi, bien qu'elle soit verbeuse. Je n'avais pas fait beaucoup d'édition de registre avec Powershell, mais le faire avec "(default)" était quelque chose que j'avais vu comme exemple. Cela n'a pas créé une nouvelle clé (ce que quelque chose comme default aurait fait) mais a mis à jour la clé par défaut comme prévu. L'avez-vous testé ou avez-vous simplement deviné à partir de l'exemple de l'utilisateur ? (default) partie ?

0 votes

J'ai essayé. Il a créé une clé '(default)' sous la clé de commande.

12voto

Abatonime Points 156

Le code posté par Jonathan et Shay Levy n'a pas fonctionné pour moi.

Veuillez trouver le code de travail ci-dessous :

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{   
#"No Administrative rights, it will display a popup window asking user for Admin rights"

$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process "$psHome\powershell.exe" -Verb runAs -ArgumentList $arguments

break
}
#"After user clicked Yes on the popup, your file will be reopened with Admin rights"
#"Put your code here"

2 votes

Solution très utile et pratique : je l'ai juste ajouté à mon script et ça marche.

3 votes

@Abatonime Et si vous souligniez plutôt les différences faciles à manquer pour le bénéfice de vos lecteurs ? Honnêtement, ce changement ne vaut pas plus qu'un commentaire sur l'autre réponse.

9voto

Rython Points 88

Vous devez réexécuter le script avec des privilèges administratifs et vérifier si le script a été lancé dans ce mode. Ci-dessous j'ai écrit un script qui a deux fonctions : DoElevatedOperations y DoStandardOperations . Vous devez placer votre code qui nécessite des droits d'administrateur dans le premier et les opérations standard dans le second. Le site IsRunAsAdmin La variable est utilisée pour identifier le mode d'administration.

Mon code est un extrait simplifié du script de Microsoft qui est automatiquement généré lorsque vous créez un paquet d'applications pour les applications du Windows Store.

param(
    [switch]$IsRunAsAdmin = $false
)

# Get our script path
$ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path

#
# Launches an elevated process running the current script to perform tasks
# that require administrative privileges.  This function waits until the
# elevated process terminates.
#
function LaunchElevated
{
    # Set up command line arguments to the elevated process
    $RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '" -IsRunAsAdmin'

    # Launch the process and wait for it to finish
    try
    {
        $AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru
    }
    catch
    {
        $Error[0] # Dump details about the last error
        exit 1
    }

    # Wait until the elevated process terminates
    while (!($AdminProcess.HasExited))
    {
        Start-Sleep -Seconds 2
    }
}

function DoElevatedOperations
{
    Write-Host "Do elevated operations"
}

function DoStandardOperations
{
    Write-Host "Do standard operations"

    LaunchElevated
}

#
# Main script entry point
#

if ($IsRunAsAdmin)
{
    DoElevatedOperations
}
else
{
    DoStandardOperations
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X