¿Cómo definir una función de PowerShell que requiere elevación?

20

Como no puedo encontrar ninguna alternativa al sudocomando de elevación de Linux , tengo la siguiente pregunta:

¿Cómo definir una función de PowerShell que requiere elevación? Me refiero a la solicitud de UAC.

Digamos, tal función sigue:

function system-check {
    SFC /ScanNow
}

Sistema:

Windows 8.1 Pro de 64 bits

Potencia Shell:

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

EDITAR1:

Para ser 100% comprensible, permítanme reformular:

  1. Ejecuto PowerShell como usuario
  2. Ejecuto la función mencionada anteriormente system-check
  3. Quiero que la función se eleve para poder ejecutar el comando; tenga en cuenta que quiero que aparezca la solicitud de UAC
LinuxSecurityFreak
fuente
Tenga en cuenta que muchos comandos integrados de PowerShell y comandos agregados por módulos de Microsoft (como los comandos MSOL) a menudo requieren elevación, pero de ninguna manera brindan asistencia en la elevación de privilegios. Simplemente fallan con mensajes de error crípticos. Si crea un mensaje de elevación en sus scripts, proporcionará más facilidad de uso que Microsoft.
Todd Wilcox

Respuestas:

33

Para ejecutar un comando específico desde una ventana elevada:

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

Por ejemplo:

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

Para ejecutar un script específico desde una ventana elevada:

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

Para ejecutar una sesión completa de PowerShell que solicite UAC:

Start-Process powershell.exe -Verb runAs

Una función para devolver $ True o $ False si la ventana actual se ejecuta con permisos elevados:

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

Para asegurarse de que un script solo se ejecute como administrador, agregue esto al principio:

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

En PowerShell v4.0, lo anterior se puede simplificar usando una instrucción #Requires:

#Requires -RunAsAdministrator

Fuente: ejecución con permisos elevados

Ashton
fuente