Verifique se o Prompt de Comando atual foi iniciado como o Administrador

20

Eu estou olhando para escrever um script que leva a entrada do usuário e, em seguida, faz alterações em todo o sistema. Eu preciso que isso seja muito genérico, mas basta colocar, no topo, eu preciso verificar para ver se ele está sendo executado como 'Administrador'. Se não for, quero exibir uma mensagem para dizer isso; se for, quero que continue. Existe uma maneira constante de verificar isso? Eu não estou olhando para iniciar uma nova sessão como o administrador, eu só quero detectar se atualmente é executado como administrador

    
por Canadian Luke 31.10.2013 / 00:12

4 respostas

14

Encontrou isto em 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
    
por 31.10.2013 / 10:35
6

Isso verifica o alto nível de integridade. (funciona para o Windows Vista e superior)

@echo off

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

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)
    
por 31.10.2013 / 00:52
4

Muitas, muitas respostas para isso e várias outras perguntas em SE ( 1 , 2 , 3 para citar alguns), todos os quais são deficientes, de uma forma ou de outra, mostraram claramente que o Windows não fornece um utilitário interno confiável. Então, é hora de lançar o seu próprio.

Sem mais hacks sujos:

Compile o seguinte programa (instruções a seguir) ou obtenha uma cópia pré-compilada . Isso só precisa ser feito uma vez, então você pode copiar o .exe em todos os lugares (por exemplo, junto com o Sysinternals Suite ) .

O código funciona no Win2k + 1 , com ou sem o UAC, domínio, grupos transitivos, o que quer que seja - porque ele usa o mesmo sistema quando está verificando as permissões. chkadmin imprime "Admin" ou "Não administrador" e define o código de saída como 0 ou 1, respectivamente. A saída pode ser suprimida com a opção /q .

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, execute no prompt de comando do SDK do Windows:

cl /Ox chkadmin.c

(se estiver usando o VS2012 +, mais ajustes são necessários se você precisa atingir 2k / XP )

O método é cortesia de link

1 O MSDN afirma que as APIs são XP +, mas isso é falso. CheckTokenMembership é 2k + e o outro é ainda mais antigo .

    
por 04.12.2016 / 15:40
3

A maneira mais limpa de verificar privilégios de administrador usando um script CMD, que eu encontrei, é algo assim:

@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 usa apenas builtins CMD.exe, por isso deve ser muito rápido. Ele também verifica as capacidades reais do processo, em vez de verificar se há SIDs ou membros de grupos, portanto, a permissão eficaz é testada. E isso funciona desde o Windows 2003 e XP. Processos de usuário normais ou processos não elevados falham no probe de diretório, onde processos Admin ou elevados são bem-sucedidos.

Esse teste falhará se Everyone , BUILTIN\Users ou outro grupo semelhante receber permissão de leitura para systemprofile. Concedido, essa é uma configuração não padrão diferente das máquinas configuradas como controladores de domínio do Windows que fornecem direitos de leitura / execução de 'AUTORIDADE NT \ Usuários autenticados' ao systemprofile.

    
por 07.09.2016 / 21:20