Script por lotes: cómo comprobar los derechos de administrador

Resuelto flacs asked hace 14 años • 26 respuestas

¿Cómo verifico si el script por lotes actual tiene derechos de administrador?

Sé cómo hacer que se llame a sí mismo con runas, pero no cómo verificar los derechos de administrador. Las únicas soluciones que he visto son trabajos de piratería burdos o el uso de programas externos. Bueno, en realidad no me importa si es un trabajo de pirateo, siempre y cuando funcione en Windows XP y versiones posteriores.

flacs avatar Oct 29 '10 19:10 flacs
Aceptado

Asuntos

La solución de blak3r / RushyoAT funciona bien para todo excepto para Windows 8. La ejecución en Windows 8 da como resultado:

The AT command has been deprecated. Please use schtasks.exe instead.

The request is not supported.

(ver captura de pantalla n.° 1) y regresará %errorLevel% 1.

 

Investigación

Entonces, busqué otros comandos que requieran permisos elevados. racionallyparanoid.com tenía una lista de algunos, así que ejecuté cada comando en los dos extremos opuestos de los sistemas operativos Windows actuales (XP y 8) con la esperanza de encontrar un comando al que se le negaría el acceso en ambos sistemas operativos cuando se ejecutara con permisos estándar.

Al final encontré uno NET SESSION... Una solución verdadera , limpia y universal que no implica:

  • la creación o interacción con datos en ubicaciones seguras
  • analizar datos devueltos por FORbucles
  • buscando cadenas para "Administrador"
  • usando AT(Windows 8 incompatible) o WHOAMI(Windows XP incompatible).

Cada uno de los cuales tiene sus propios problemas de seguridad, usabilidad y portabilidad.

 

Pruebas

He confirmado de forma independiente que esto funciona en:

  • Windows XP, x86
  • Windows XP, x64
  • Windows Vista, x86
  • Windows Vista, x64
  • Windows 7, x86
  • Windows 7, x64
  • Windows 8, x86
  • Windows 8, x64
  • Windows 10 v1909, x64

(ver captura de pantalla n.° 2)

 

Implementación / Uso

Entonces, para utilizar esta solución, simplemente haga algo como esto:

@echo off
goto check_Permissions

:check_Permissions
    echo Administrative permissions required. Detecting permissions...
    
    net session >nul 2>&1
    if %errorLevel% == 0 (
        echo Success: Administrative permissions confirmed.
    ) else (
        echo Failure: Current permissions inadequate.
    )
    
    pause >nul

 

Explicación

NET SESSIONes un comando estándar utilizado para "administrar las conexiones de la computadora servidor. Usado sin parámetros, [muestra] información sobre todas las sesiones con la computadora local".

Entonces, aquí está el proceso básico de mi implementación dada:

  1. @echo off
    • Deshabilitar la visualización de comandos
  2. goto check_Permissions
    • Saltar al :check_Permissionsbloque de código
  3. net session >nul 2>&1
    • Ejecutar comando
    • Ocultar la salida visual del comando mediante
      1. Redirigir la secuencia de salida estándar (identificador numérico 1 / STDOUT) anul
      2. Redirigir el flujo de salida de error estándar (identificador numérico 2 / STDERR) al mismo destino que el identificador numérico 1
  4. if %errorLevel% == 0
    • Si el valor del código de salida ( %errorLevel%) es 0 entonces esto significa que no ha ocurrido ningún error y, por lo tanto, el comando inmediatamente anterior se ejecutó exitosamente.
  5. else
    • Si el valor del código de salida ( %errorLevel%) no es 0 entonces esto significa que se han producido errores y, por lo tanto, el comando inmediatamente anterior se ejecutó sin éxito.
  6. El código entre los paréntesis respectivos se ejecutará dependiendo del criterio que se cumpla.

 

Capturas de pantalla

Ventanas 8AT %errorLevel% :

[imagen]

 

NET SESSIONen Windows XP x86 - Windows 8 x64 :

[imagen]

 

Gracias, @Tilka, por cambiar tu respuesta aceptada por la mía. :)

mythofechelon avatar Aug 16 '2012 21:08 mythofechelon

La solución de Anders funcionó para mí, pero no estaba seguro de cómo invertirla para obtener lo contrario (cuando no eras administrador).

Aquí está mi solución. Tiene dos casos, IF y ELSE, y algo de arte ascii para garantizar que la gente realmente lo lea. :)

Versión mínima

Rushyo publicó esta solución aquí: ¿ Cómo detectar si CMD se está ejecutando como administrador/tiene privilegios elevados?

NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
    ECHO NOT AN ADMIN!
)

Versión que agrega mensajes de error, pausas y salidas.

@rem ----[ This code block detects if the script is being running with admin PRIVILEGES If it isn't it pauses and then quits]-------
echo OFF
NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
   echo ######## ########  ########   #######  ########  
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ######   ########  ########  ##     ## ########  
   echo ##       ##   ##   ##   ##   ##     ## ##   ##   
   echo ##       ##    ##  ##    ##  ##     ## ##    ##  
   echo ######## ##     ## ##     ##  #######  ##     ## 
   echo.
   echo.
   echo ####### ERROR: ADMINISTRATOR PRIVILEGES REQUIRED #########
   echo This script must be run as administrator to work properly!  
   echo If you're seeing this after clicking on a start menu icon, then right click on the shortcut and select "Run As Administrator".
   echo ##########################################################
   echo.
   PAUSE
   EXIT /B 1
)
@echo ON

Funciona en WinXP --> Win8 (incluidas las versiones de 32/64 bits).

EDITAR: 28/8/2012 Actualizado para admitir Windows 8. @BenHooper señaló esto en su respuesta a continuación. Por favor vota su respuesta.

blak3r avatar Jan 24 '2012 22:01 blak3r