Como definir uma função do PowerShell que requer elevação?

20

Desde que eu não consigo encontrar nenhuma alternativa para o Linux ' sudo comando de elevação, tenho a seguinte pergunta:

Como definir uma função do PowerShell que requer elevação? Quero dizer o prompt do UAC.

Diga, essa função segue:

function system-check {
    SFC /ScanNow
}

Sistema:

Windows 8.1 Pro de 64 bits

PowerShell:

Major  Minor  Build  Revision
-----  -----  -----  --------
5      0      10586  117

EDIT1:

Para ser 100% compreensível, deixe-me reformular:

  1. Eu corro o PowerShell como usuário
  2. Eu corro a função acima mencionada system-check
  3. Eu quero a função para elevar a fim de poder executar o comando; note que eu quero que o prompt do UAC apareça
Vlastimil
fonte
Observe que muitos comandos e comandos integrados do PowerShell adicionados pelos módulos da Microsoft (como os comandos MSOL) geralmente exigem elevação, mas não fornecem assistência na elevação de privilégios. Eles simplesmente falham com mensagens de erro enigmáticas. Se você criar um prompt de elevação em seus scripts, estará fornecendo mais facilidade de uso do que a própria Microsoft.
Todd Wilcox

Respostas:

32

Para executar um comando específico a partir de uma janela elevada:

Start-Process -FilePath powershell.exe -ArgumentList {$ScriptBlock} -verb RunAs

Por exemplo:

Start-Process -FilePath powershell.exe -ArgumentList {
    SFC /scannow
} -verb RunAs

Para executar um script específico a partir de uma janela elevada:

Start-Process powershell -ArgumentList '-noprofile -file MyScript.ps1' -verb RunAs

Para executar uma sessão inteira do PowerShell solicitando o UAC:

Start-Process powershell.exe -Verb runAs

Uma função para retornar $ True ou $ False se a janela atual estiver sendo executada com permissões elevadas:

function isadmin
 {
 #Returns true/false
   ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
 }

Para garantir que um script seja executado apenas como administrador, adicione isso ao início:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
 {
  Echo "This script needs to be run As Admin"
  Break
 }

No PowerShell v4.0, os itens acima podem ser simplificados usando uma instrução #Requires:

#Requires -RunAsAdministrator

Fonte: Executar com permissões elevadas

Ashton
fonte