Detectar si PowerShell se está ejecutando como administrador

36

¿Cómo puedo saber en mis scripts si PowerShell se ejecuta con privilegios de administrador?

Necesito saber porque estoy tratando de ejecutar un programa que requiere la capacidad de abrir puertos protegidos.

Bumerang
fuente
1
Puede considerar elevar los permisos como se describe en Cómo obtener privilegios de administrador en la respuesta de PowerShell
MiFreidgeim SO-deja de ser malo

Respuestas:

42
[bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-32-544")

Desglosando lo que esto hace:

  • [bool]- Lanzar el resultado final a a bool.
  • [System.Security.Principal.WindowsIdentity]::GetCurrent()- Recupera el WindowsIdentitypara el usuario actualmente en ejecución.
  • (...).groups- Acceda a la groupspropiedad de la identidad para averiguar de qué grupos de usuarios es miembro la identidad.
  • -match "S-1-5-32-544"comprueba si groupscontiene el SID conocido del grupo Administradores, la identidad solo lo contendrá si se utilizó "ejecutar como administrador".
RMazi
fuente
2
En lugar de simplemente publicar una línea de código, ¿puede explicar qué hace? Esto ayuda a los futuros visitantes a comprenderlo y adaptarlo, si es necesario.
slhck
BOOO Dele más votos a este hombre
Kolob Canyon
44
Prefiero la respuesta de @Bill_Stewart a continuación, ya que está libre de cadenas mágicas.
8DH
En lugar de usar -matchy encasillar:[Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544'
TheIncorrigible1
57
([Security.Principal.WindowsPrincipal] `
  [Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Esto recupera la identidad actual de Windows y devuelve True si la identidad actual tiene el rol de Administrador (es decir, se ejecuta elevado).

Bill_Stewart
fuente
13
Si bien la respuesta aceptada es correcta, esta respuesta es mucho más clara, especialmente para alguien que pueda leer su guión dentro de seis meses.
Patrick Seymour
46

En Powershell 4.0 puede usar require en la parte superior de su script:

#Requires -RunAsAdministrator

Salidas:

El script 'MyScript.ps1' no se puede ejecutar porque contiene una instrucción "#requires" para ejecutarse como Administrador. La sesión actual de Windows PowerShell no se ejecuta como Administrador. Inicie Windows PowerShell utilizando la opción Ejecutar como administrador e intente ejecutar el script nuevamente.

Eddiegroves
fuente
¿Qué sucede si desea una función que se cierra si no la ejecuta el administrador?
Kolob Canyon
1
@KolobCanyon: no existe tal cosa como ejecutar solo una función de PowerShell elevada; todo el proceso de PowerShell es elevado o no.
Bill_Stewart
@Bill_Stewart sí, pero puedes hacerlo returnsi el usuario no es administrador :)
Kolob Canyon
1
@KolobCanyon: solo puede elevar el proceso de PowerShell ; no puedes elevar una sola función . Por eso #Requires -RunAsAdministratores útil: evita que se ejecute todo el script si no está elevado.
Bill_Stewart
@Bill_Stewart Sí, tendré que usar eso en algún momento.
Kolob Canyon