Verifique se o prompt de comando atual foi iniciado como administrador

21

Estou procurando escrever um script que aceite a entrada do usuário e faça alterações em todo o sistema. Eu preciso que isso seja muito genérico, mas basta colocar, na parte superior, a verificação para ver se está sendo executado como administrador. Se não estiver, quero exibir uma mensagem para dizer isso a eles; se for, quero que continue. Existe uma maneira constante de verificar isso? Não estou querendo iniciar uma nova sessão como administrador, só quero detectar se ela está sendo executada atualmente como administrador

O canadense Luke REINSTATE MONICA
fonte
@ g-man, como isso está relacionado?
Canadian Luke REINSTATE MONICA
Também está pedindo comandos que se comportarão de maneira diferente se executados como Administrador ou não - ou pelo menos os obtiveram como respostas.
G-Man diz 'Reinstate Monica'

Respostas:

16

Encontrei isso no 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
fonte
Qual foi o motivo pelo qual ele foi excluído?
Canadian Luke REINSTATE MONICA
Isso funciona, tanto na conta do administrador quanto quando eu executo como um usuário limitado, mas escolha 'Executar como administrador'
canadense Luke REINSTATE MONICA
2
Mesma idéia, mas usando operadores execução condicional: net session >nul 2>&1 && echo Success || echo Failure. Acho essa sintaxe compacta mais conveniente.
dbenham
6
Isso requer que o serviço "Servidor" esteja em execução.
Ivan_pozdeev 5/12/16
8

Isso verifica o alto nível de integridade. (funciona para 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
)
semana
fonte
11
whoami não é suportado no xp minha awnser é melhor suporta todos os OS a partir do Windows XP para o Windows 8
Alex
2
Isso funciona se eu apenas abrir o prompt de comando. Se eu executar o CMD como administrador, ele ainda mostra que é executado como usuário
canadense Luke REINSTATE MONICA
2
O suporte do @Alex para mais SOs é ótimo, mas esse método é mais confiável, pois consulta diretamente as permissões concedidas à sessão atual, em vez de tirar a ausência de um negativo menos confiável para inferir um positivo.
Iszi 10/09
2
semana, whoami / groups tem um caso extremo em que você obtém as informações erradas. Veja stackoverflow.com/questions/4051883/…
zumalifeguard
11
O @week whoamiestá ausente no XP.
Ivan_pozdeev 5/12/16
4

Muitas, muitas respostas para essa e várias outras perguntas no SE ( 1 , 2 , 3 , para citar algumas), todas deficientes dessa maneira 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 programa a seguir (instruções a seguir) ou obtenha uma cópia pré-compilada . Isso precisa ser feito apenas uma vez, para que você possa copiar .exetodos os lugares (por exemplo, ao lado do Sysinternals Suite ).

O código funciona no Win2k + 1 , com e sem UAC, domínio, grupos transitivos, seja o que for - porque usa da mesma maneira que o próprio sistema ao verificar as permissões. chkadminimprime "Admin" ou "Non-admin" e define o código de saída como 0 ou 1, respectivamente. A saída pode ser suprimida com o /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, execute no prompt de comando do Windows SDK:

cl /Ox chkadmin.c

(se você estiver usando o VS2012 +, serão necessários mais ajustes se precisar segmentar 2k / XP )


O método é cortesia de /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908

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

ivan_pozdeev
fonte
3

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

@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

Esse método usa apenas os recursos internos do CMD.exe, portanto deve ser muito rápido. Ele também verifica os recursos reais do processo, em vez de verificar SIDs ou participações em grupos, para que a permissão efetiva seja testada. E isso funciona desde o Windows 2003 e XP. Processos normais do usuário ou processos não elevados falham na análise do diretório, onde processos administrativos ou elevados são bem-sucedidos.

Este teste falhará se a Everyone, BUILTIN\Usersou outro grupo semelhante é dada a permissão de leitura para systemprofile. É verdade que essa é uma configuração não padrão, exceto em máquinas configuradas como controladores de domínio do Windows, que concedem direitos de leitura / execução de 'NT AUTHORITY \ Authenticated Users' ao perfil do sistema.

William
fonte
> verifique se VERIFY está desativado. > verificar /? Informa ao cmd.exe se deve verificar se seus arquivos foram gravados corretamente em um disco. VERIFIQUE [ATIVADO | OFF] Digite VERIFY sem um parâmetro para exibir a configuração VERIFY atual. Como esse comando ajuda o script?
Canadian Luke REINSTATE MONICA
3
@Canadian Luke, Alguns comandos de comandos internos não limpam o nível de erro se não houver erro. Assim, as pessoas adquiriram o hábito de limpar o nível de erro usando hacks como verify. Eu costumo usar cd .(cd space dot) que define o nível de erro como 0, não produz saída e também é útil para criar um arquivo de tamanho zero via cd . >somefile. Dito isso, testei 'dir' no Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 e 10. Para todos esses 'dir', o nível de erro será zerado para 0 em caso de sucesso, se ele tiver sido definido antes da instalação. 'dir'. Portanto, não sei por que o william usou 'Verifique' para limpar primeiro o nível de erro.
user3347790