94 votes

comment exécuter un script powershell comme administrateur

Sur mon bureau Windows 7, j'ai script.ps1, qui nécessite des privilèges d'administrateur (il démarre un service). Je veux cliquer sur ce script et l'exécuter avec des privilèges d'administrateur.

Quel est le moyen le plus simple d'y parvenir ?

75voto

zobie Points 539

Voici une façon de le faire, à l'aide d'une icône supplémentaire sur votre bureau. Je suppose que vous pourriez déplacer le script quelqu'un d'autre si vous vouliez n'avoir qu'une seule icône sur votre bureau.

  1. Créez un raccourci vers votre script Powershell sur votre bureau.
  2. Cliquez avec le bouton droit de la souris sur le raccourci et cliquez sur Propriétés
  3. Cliquez sur le bouton Raccourci onglet
  4. Cliquez sur Avancé
  5. Sélectionnez Exécuter en tant qu'administrateur

Vous pouvez maintenant exécuter le script élevé en double-cliquant simplement sur le nouveau raccourci sur votre bureau.

39voto

MDMoore313 Points 5492

Sur les systèmes activés par UAC, pour s'assurer qu'un script s'exécute avec des privilèges d'administrateur complets, ajoutez ce code au début de votre script :

param([switch]$Elevated)

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

if ((Test-Admin) -eq $false)  {
    if ($elevated) {
        # tried to elevate, did not work, aborting
    } else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
    }
    exit
}

'running with full privileges'

Maintenant, lors de l'exécution de votre script, il s'appellera à nouveau lui-même et tentera d'élever les privilèges avant de s'exécuter. Le commutateur -elevated l'empêche de répéter si quelque chose échoue.

Vous pouvez retirer le -noexit si le terminal doit se fermer automatiquement lorsque le script se termine.

18voto

mjsr Points 6247

Si vous êtes dans le même powershell vous pouvez faire ceci :

Start-Process powershell -verb runas -ArgumentList "-file fullpathofthescript"

4voto

badp Points 3567

Puisqu'il se trouve sur votre bureau, je dirais que le moyen le plus simple d'y parvenir est de le faire glisser dans le dossier de l'ordinateur. gadget d'élévation .

Sinon, vous pourriez faire un script séparé en utilisant le site elevate 命令 sur votre ps1 script.

Ou bien, vous pouvez appliquer elevate juste pour le bit de démarrage du service.

2voto

Jonas Taulien Points 21

En plus de Réponse de MDMoore313 ci-dessus :

Si nous voulons exécuter les commandes dans le même répertoire de travail que celui dans lequel nous nous trouvons actuellement, nous devons ajouter quelques éléments :

#### START ELEVATE TO ADMIN #####
param(
    [Parameter(Mandatory=$false)]
    [switch]$shouldAssumeToBeElevated,

    [Parameter(Mandatory=$false)]
    [String]$workingDirOverride
)

# If parameter is not set, we are propably in non-admin execution. We set it to the current working directory so that
#  the working directory of the elevated execution of this script is the current working directory
if(-not($PSBoundParameters.ContainsKey('workingDirOverride')))
{
    $workingDirOverride = (Get-Location).Path
}

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

# If we are in a non-admin execution. Execute this script as admin
if ((Test-Admin) -eq $false)  {
    if ($shouldAssumeToBeElevated) {
        Write-Output "Elevating did not work :("

    } else {
        #                                                         vvvvv add `-noexit` here for better debugging vvvvv 
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -file "{0}" -shouldAssumeToBeElevated -workingDirOverride "{1}"' -f ($myinvocation.MyCommand.Definition, "$workingDirOverride"))
    }
    exit
}

Set-Location "$workingDirOverride"
##### END ELEVATE TO ADMIN #####

# Add actual commands to be executed in elevated mode here:
Write-Output "I get executed in an admin PowerShell"

SistemesEz.com

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.

Powered by:

X