Compruebe si el símbolo del sistema actual se inició como administrador

21

Estoy buscando escribir un script que tome la entrada del usuario, luego haga cambios en todo el sistema. Necesito que esto sea muy genérico, pero simplemente, en la parte superior, lo necesito para verificar si se está ejecutando 'Como administrador'. Si no es así, entonces quiero mostrar un mensaje para decirles eso; si es así, quiero que continúe. ¿Hay una forma constante de verificar esto? No estoy buscando iniciar una nueva sesión como Administrador, solo quiero detectar si actualmente se ejecuta como administrador

El canadiense Luke REINSTATE MONICA
fuente
@ g-man ¿cómo se relaciona?
Canadian Luke REINSTATE MONICA
También está pidiendo comandos que se comporten de manera diferente si se ejecutan como administrador o no, o al menos los obtuvo como respuestas.
G-Man dice 'reinstalar a Monica'

Respuestas:

16

Encontré esto en Stack Overflow :

@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
Alex
fuente
¿Cuál fue la razón por la que se eliminó?
Canadian Luke REINSTATE MONICA
Esto funciona, tanto desde la cuenta de administrador, como cuando ejecuto como usuario limitado, pero elijo 'Ejecutar como administrador'
Canadian Luke REINSTATE MONICA
2
La misma idea, pero utilizando los operadores ejecución condicional: net session >nul 2>&1 && echo Success || echo Failure. Esta sintaxis compacta me parece más conveniente.
dbenham
66
Esto requiere que se ejecute el servicio "Servidor".
ivan_pozdeev
8

Esto verifica el alto nivel de integridad. (funciona para Windows Vista y superior)

@echo off

whoami /groups | find "S-1-16-12288" > nul

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)
semana
fuente
1
Whoami no es compatible con XP My Awnser es mejor compatible con todos los sistemas operativos desde Windows XP a Windows 8
Alex
2
Esto funciona si solo abro el Símbolo del sistema. Si ejecuto el CMD como administrador, todavía muestra que se ejecuta como un usuario
Canadian Luke REINSTATE MONICA
2
El soporte de @Alex para más sistemas operativos es excelente, pero este método es más confiable ya que consulta directamente los permisos otorgados a la sesión actual en lugar de tomar la ausencia de un negativo menos confiable para inferir un positivo.
Iszi
2
semana, whoami / groups tiene un caso límite en el que obtienes la información incorrecta. Ver stackoverflow.com/questions/4051883/…
zumalifeguard
1
@week whoamifalta en XP.
ivan_pozdeev
4

Muchas, muchas respuestas a esta y muchas otras preguntas en SE ( 1 , 2 , 3 , por nombrar algunas), todas las cuales son deficientes de esta forma u otra, han demostrado claramente que Windows no proporciona una utilidad incorporada confiable . Entonces, es hora de lanzar el tuyo.

Sin más trucos sucios:

Compile el siguiente programa (siga las instrucciones) u obtenga una copia precompilada . Esto solo debe hacerse una vez, luego puede copiarlo en .exetodas partes (por ejemplo, junto con Sysinternals Suite ).

El código funciona en Win2k + 1 , con y sin UAC, dominio, grupos transitivos, lo que sea, porque se usa de la misma manera que el sistema en sí mismo cuando verifica los permisos. chkadminimprime "Admin" o "No admin" y establece el código de salida en 0 o 1, respectivamente. La salida se puede suprimir con el /qinterruptor.

chkadmin.c:

#include <malloc.h>
#include <stdio.h>
#include <windows.h>
#pragma comment (lib,"Advapi32.lib")

int main(int argc, char** argv) {
    BOOL quiet = FALSE;
    DWORD cbSid = SECURITY_MAX_SID_SIZE;
    PSID pSid = _alloca(cbSid);
    BOOL isAdmin;

    if (argc > 1) {
        if (!strcmp(argv[1],"/q")) quiet=TRUE;
        else if (!strcmp(argv[1],"/?")) {fprintf(stderr,"Usage: %s [/q]\n",argv[0]);return 0;}
    }

    if (!CreateWellKnownSid(WinBuiltinAdministratorsSid,NULL,pSid,&cbSid)) {
        fprintf(stderr,"CreateWellKnownSid: error %d\n",GetLastError());exit(-1);}

    if (!CheckTokenMembership(NULL,pSid,&isAdmin)) {
        fprintf(stderr,"CheckTokenMembership: error %d\n",GetLastError());exit(-1);}

    if (!quiet) puts(isAdmin ? "Admin" : "Non-admin");
    return !isAdmin;
}

Para compilar, ejecute en el símbolo del sistema del SDK de Windows:

cl /Ox chkadmin.c

(si usa VS2012 +, se necesitan más ajustes si necesita apuntar a 2k / XP )


El método es cortesía de /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908

1 MSDN afirma que las API son XP + pero esto es falso. CheckTokenMembership es 2k + y el otro es aún más antiguo .

ivan_pozdeev
fuente
3

La forma más limpia de verificar los privilegios de administrador usando un script CMD, que he encontrado, es algo como esto:

@echo off

REM  Calling verify with no args just checks the verify flag,
REM   we use this for its side effect of setting errorlevel to zero
verify >nul

REM  Attempt to read a particular system directory - the DIR
REM   command will fail with a nonzero errorlevel if the directory is
REM   unreadable by the current process.  The DACL on the
REM   c:\windows\system32\config\systemprofile directory, by default,
REM   only permits SYSTEM and Administrators.
dir %windir%\system32\config\systemprofile >nul 2>nul

REM  Use IF ERRORLEVEL or %errorlevel% to check the result
if not errorlevel 1 echo has Admin privs
if     errorlevel 1 echo has only User privs

Este método solo usa CMD.exe incorporado, por lo que debería ser muy rápido. También verifica las capacidades reales del proceso en lugar de verificar SID o membresías de grupo, por lo que se prueba el permiso efectivo . Y esto funciona desde Windows 2003 y XP. Los procesos de usuario normales o los procesos sin elevación fallan en la sonda de directorio, donde como administrador o procesos elevados tienen éxito.

Esta prueba falla si el Everyone, BUILTIN\Usersu otro grupo similar recibe permiso de lectura para el sistema de perfiles. De acuerdo, esa es una configuración no estándar que no sea en máquinas configuradas como controladores de dominio de Windows que otorgan derechos de lectura / ejecución 'NT AUTHORITY \ Authenticated Users' para el perfil del sistema.

Guillermo
fuente
> verifique que VERIFY esté desactivado. > verificar /? Indica a cmd.exe si debe verificar que sus archivos estén escritos correctamente en un disco. VERIFICAR [ACTIVADO | OFF] Escriba VERIFY sin un parámetro para mostrar la configuración VERIFY actual. ¿Cómo ayuda este comando al script?
Canadian Luke REINSTATE MONICA
3
@Canadian Luke, algunos comandos de comandos integrados no borran el nivel de error si no hay ningún error. Por lo tanto, las personas se acostumbraron a borrar el nivel de error utilizando hacks como verify. cd .Tiendo a usar (cd space dot) que establece el nivel de error en 0, no produce salida y también es útil para crear un archivo de longitud cero a través de cd . >somefile. Dicho esto, probé 'dir' en Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 y 10. Para todos esos 'dir' borrará el nivel de error a 0 en caso de éxito si se ha configurado antes de 'dir'. Por lo tanto, no estoy seguro de por qué William usó 'verificar' para borrar primero el nivel de error.
user3347790