windows - puedo - ¿Cómo detectar si CMD se está ejecutando como Administrador/tiene privilegios elevados?
no puedo ejecutar cmd como administrador (11)
Desde dentro de un archivo por lotes, me gustaría probar si estoy ejecutando privilegios de Administrador / elevado.
El nombre de usuario no cambia cuando se selecciona "Ejecutar como administrador", por lo que no funciona.
Si hubiera un comando disponible universalmente, que no tiene ningún efecto, pero requiere privilegios administrativos, entonces podría ejecutar eso y buscar un código de error para probar los privilegios. Hasta ahora, no he encontrado tal comando. Los comandos que he encontrado parecen devolver un solo código de error no específico, que podría indicar cualquier cosa, y son propensos a fallar por una variedad de razones.
Solo me importa Windows 7, aunque el soporte de los sistemas operativos anteriores sería agradable.
Aquí hay una pequeña modificación de la respuesta de Harry que se enfoca en un estado elevado; Estoy usando esto al comienzo de un archivo install.bat:
set IS_ELEVATED=0
whoami /groups | findstr /b /c:"Mandatory Label/High Mandatory Level" | findstr /c:"Enabled group" > nul: && set IS_ELEVATED=1
if %IS_ELEVATED%==0 (
echo You must run the command prompt as administrator to install.
exit /b 1
)
Esto definitivamente funcionó para mí y el principio parece ser sólido; de Chris Jackson de MSFT :
Cuando te estás ejecutando elevado, tu token contiene un ACE llamado Mandatory Label / High Mandatory Level.
Este truco solo requiere un comando: escriba net session
en el símbolo del sistema.
Si no eres administrador, obtienes un mensaje de denegación de acceso.
De MS Technet :
Si se usa sin parámetros, la sesión de red muestra información sobre todas las sesiones con la computadora local.
La forma más fácil de hacerlo en Vista, Win 7 y superior es enumerar grupos de tokens y buscar el nivel de integridad actual (o el sid de los administradores, si solo la pertenencia a un grupo es importante):
Verifica si estamos funcionando elevados:
whoami /groups | find "S-1-16-12288" && Echo I am running elevated, so I must be an admin anyway ;-)
Compruebe si pertenecemos a los administradores locales:
whoami /groups | find "S-1-5-32-544" && Echo I am a local admin
Verifica si pertenecemos a los administradores de dominio:
whoami /groups | find "-512 " && Echo I am a domain admin
El siguiente artículo enumera el nivel de integridad que usa Windows SID: http://msdn.microsoft.com/en-us/library/bb625963.aspx
Leí muchas (la mayoría?) De las respuestas, luego desarrollé un archivo bat que funciona para mí en Win 8.1. Pensé que lo compartiría.
setlocal
set runState=user
whoami /groups | findstr /b /c:"Mandatory Label/High Mandatory Level" > nul && set runState=admin
whoami /groups | findstr /b /c:"Mandatory Label/System Mandatory Level" > nul && set runState=system
echo Running in state: "%runState%"
if not "%runState%"=="user" goto notUser
echo Do user stuff...
goto end
:notUser
if not "%runState%"=="admin" goto notAdmin
echo Do admin stuff...
goto end
:notAdmin
if not "%runState%"=="system" goto notSystem
echo Do admin stuff...
goto end
:notSystem
echo Do common stuff...
:end
Espero que alguien encuentre esto útil :)
Más o menos lo que otros han puesto antes, pero como un trazador de líneas que se puede poner al principio de un comando por lotes. (Bueno, generalmente después de @echo off)
net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
Me gusta la sugerencia de Rushyo de usar AT, pero esta es otra opción:
whoami /groups | findstr /b BUILTIN/Administrators | findstr /c:"Enabled group" && goto :isadministrator
Este enfoque también le permitiría distinguir entre un administrador no administrador y uno no elevado si así lo desea. Los administradores no elevados todavía tienen BUILTIN / Administrators en la lista de grupos, pero no está habilitado.
Sin embargo, esto no funcionará en algunos sistemas de idiomas que no están en inglés. En cambio, prueba
whoami /groups | findstr /c:" S-1-5-32-544 " | findstr /c:" Enabled group" && goto :isadministrator
(Esto debería funcionar en Windows 7, pero no estoy seguro acerca de las versiones anteriores).
No estoy seguro de por qué, pero ninguna de las otras soluciones aquí me ha funcionado. Así que pensé que podría valer la pena compartir que este de Super User hizo el truco.
Sé que llegué muy tarde a esta fiesta, pero aquí está mi único trazador de líneas para determinar la administración.
No depende del nivel de error, solo en systeminfo
:
for /f "tokens=1-6" %%a in (''"net user "%username%" | find /i "Local Group Memberships""'') do (set admin=yes & if not "%%d" == "*Administrators" (set admin=no) & echo %admin%)
Devuelve sí o no, según el estado de administración del usuario ...
También establece el valor de la variable "admin" para que iguale sí o no en consecuencia.
Una versión de "no-uno-liner" de https://.com/a/38856823/2193477
@echo off
net.exe session 1>NUL 2>NUL || goto :not_admin
echo SUCCESS
goto :eof
:not_admin
echo ERROR: Please run as a local administrator.
exit /b 1
la solución:
at >nul
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )
no funciona en Windows 10
para todas las versiones de Windows pueden hacerlo:
openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )
ADDENDUM : para Windows 8 esto no funcionará; ver esta excelente respuesta en su lugar.
Encontré esta solución aquí: http://www.robvanderwoude.com/clevertricks.php
AT > NUL
IF %ERRORLEVEL% EQU 0 (
ECHO you are Administrator
) ELSE (
ECHO you are NOT Administrator. Exiting...
PING 127.0.0.1 > NUL 2>&1
EXIT /B 1
)
Suponiendo que no funciona y dado que estamos hablando de Win7, podría usar lo siguiente en Powershell si es adecuado:
$principal = new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
$principal .IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
Si no (y probablemente no, ya que explícitamente propuso los archivos por lotes), entonces puede escribir lo anterior en .NET y devolver un código de salida de un exe en función del resultado que utilice su archivo por lotes.