Script por lotes: cómo comprobar los derechos de administrador
¿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.
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
FOR
bucles - buscando cadenas para "Administrador"
- usando
AT
(Windows 8 incompatible) oWHOAMI
(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 SESSION
es 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:
@echo off
- Deshabilitar la visualización de comandos
goto check_Permissions
- Saltar al
:check_Permissions
bloque de código
- Saltar al
net session >nul 2>&1
- Ejecutar comando
- Ocultar la salida visual del comando mediante
- Redirigir la secuencia de salida estándar (identificador numérico 1 /
STDOUT
) anul
- Redirigir el flujo de salida de error estándar (identificador numérico 2 /
STDERR
) al mismo destino que el identificador numérico 1
- Redirigir la secuencia de salida estándar (identificador numérico 1 /
if %errorLevel% == 0
- Si el valor del código de salida (
%errorLevel%
) es0
entonces esto significa que no ha ocurrido ningún error y, por lo tanto, el comando inmediatamente anterior se ejecutó exitosamente.
- Si el valor del código de salida (
else
- Si el valor del código de salida (
%errorLevel%
) no es0
entonces esto significa que se han producido errores y, por lo tanto, el comando inmediatamente anterior se ejecutó sin éxito.
- Si el valor del código de salida (
- El código entre los paréntesis respectivos se ejecutará dependiendo del criterio que se cumpla.
Capturas de pantalla
Ventanas 8AT
%errorLevel%
:
NET SESSION
en Windows XP x86 - Windows 8 x64 :
Gracias, @Tilka, por cambiar tu respuesta aceptada por la mía. :)
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.