Como verifico se o script em lote atual tem direitos de administrador?
Eu sei como fazê-lo se chamar com runas, mas não como verificar os direitos de administrador. As únicas soluções que eu vi são trabalhos de hackers ou usar programas externos. Bem, na verdade não me importo se é um trabalho de hack, desde que funcione no Windows XP e mais recente.
windows
batch-file
cmd
admin
flacs
fonte
fonte
Respostas:
Problemas
A solução da blak3r / Rushyo funciona bem para tudo, exceto o Windows 8. A execução
AT
no Windows 8 resulta em:(veja a captura de tela 1) e retornará
%errorLevel%
1
.Pesquisa
Então, procurei outros comandos que exigem permissões elevadas. O racionallyparanoid.com tinha uma lista de alguns, então eu executei cada comando nos dois extremos opostos dos sistemas operacionais Windows atuais (XP e 8) na esperança de encontrar um comando que teria acesso negado nos dois sistemas operacionais quando executado com permissões padrão.
Eventualmente, eu encontrei um -
NET SESSION
. Uma solução verdadeira , limpa e universal que não envolve:FOR
loopsAT
(Windows 8 incompatível) ouWHOAMI
(Windows XP incompatível).Cada um deles tem seus próprios problemas de segurança, usabilidade e portabilidade.
Teste
Confirmei independentemente que isso funciona em:
(veja a captura de tela # 2)
Implementação / Uso
Portanto, para usar esta solução, basta fazer algo assim:
Disponível aqui, se você for preguiçoso: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat
Explicação
NET SESSION
é um comando padrão usado para "gerenciar conexões do computador servidor. Usado sem parâmetros, [it] exibe informações sobre todas as sessões com o computador local".Então, aqui está o processo básico da minha implementação:
@echo off
goto check_Permissions
:check_Permissions
bloco de códigonet session >nul 2>&1
STDOUT
fluxo de saída padrão (identificador numérico 1 / ) paranul
STDERR
) para o mesmo destino que identificador numérico 1if %errorLevel% == 0
%errorLevel%
) for0
, isso significa que nenhum erro ocorreu e, portanto, o comando anterior imediato foi executado com êxitoelse
%errorLevel%
) não for0
, isso significa que ocorreram erros e, portanto, o comando anterior imediato foi executado sem êxitoScreenshots
Windows 8
AT
%errorLevel%
:NET SESSION
no Windows XP x86 - Windows 8 x64 :Obrigado, @Tilka, por alterar sua resposta aceita à minha. :)
fonte
net session
êxito (ERRORLEVEL = 0) - mas na verdade não possui direitos de administrador. O usoopenfiles
(veja a resposta de Lucrécio abaixo) não tem esse problema.A solução da Anders funcionou para mim, mas eu não tinha certeza de como invertê-la para obter o oposto (quando você não era administrador).
Aqui está a minha solução. Ele tem dois casos, um caso IF e ELSE, e alguma arte ascii para garantir que as pessoas realmente o leiam. :)
Versão mínima
Rushyo postou esta solução aqui: Como detectar se o CMD está sendo executado como administrador / tem privilégios elevados?
Versão que adiciona mensagens de erro, pausas e saídas
Funciona no WinXP -> Win8 (incluindo versões de 32/64 bits).
EDIT: 28/8/2012 Atualizado para suportar o Windows 8. @BenHooper apontou isso em sua resposta abaixo. Voto por favor sua resposta.
fonte
AT
não funciona no Windows 8, mas encontrei uma solução melhor. Eu postei como resposta aqui, na verdade: stackoverflow.com/questions/4051883/… (ou você pode simplesmente rolar para baixo, o que for).Mais problemas
Conforme indicado pelo @Lectrode, se você tentar executar o
net session
comando enquanto o serviço do servidor estiver parado, você receberá a seguinte mensagem:Nesse caso, a
%errorLevel%
variável será definida como2
.Nota O serviço do servidor não é iniciado enquanto estiver no modo de segurança (com ou sem rede).
Procurando uma alternativa
Algo que:
Então, eu inicializei uma máquina virtual do Windows XP e comecei a percorrer a lista de aplicativos na
C:\Windows\System32
pasta, tentando obter algumas idéias. Após tentativas e erros, esta é a abordagem suja (trocadilhos) que eu criei:O
fsutil dirty
comando requer direitos de administrador para executar e falhará de outra forma.%systemdrive%
é uma variável de ambiente que retorna a letra da unidade em que o sistema operacional está instalado. A saída é redirecionada paranul
, portanto, ignorada. A%errorlevel%
variável será configurada para0
somente após a execução bem-sucedida.Aqui está o que a documentação diz:
Mais pesquisa
Embora a solução acima funcione a partir do Windows XP, vale a pena acrescentar que o Windows 2000 e o Windows PE (Ambiente Pré-instalado) não são fornecidos
fsutil.exe
; portanto, precisamos recorrer a outra coisa.Durante meus testes anteriores, notei que executar o
sfc
comando sem nenhum parâmetro resultaria em:Ou seja: sem parâmetros, sem partido . A idéia é que podemos analisar a saída e verificar se temos algo além de um erro:
A saída de erro é redirecionada primeiro para a saída padrão, que é canalizada para o
find
comando. Neste ponto, temos de olhar para a única parâmetro que é suportado em todas as versões do Windows desde o Windows 2000:/SCANNOW
. A pesquisa não diferencia maiúsculas de minúsculas e a saída é descartada redirecionando-a paranul
.Aqui está um trecho da documentação:
Uso da amostra
Aqui estão alguns exemplos de colar e executar:
Windows XP e posterior
Windows 2000 / Windows PE
Aplica-se a
---
fonte
SFC
verificação em todos os sistemas, é preciso ser um pouco criativo. Por alguma razão, a partir do Windows 8SFC
gera apenas caracteres únicos. Para analisar com êxito a saída, faça o seguinte:setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%s in ('sfc 2^>^&1^|MORE') do @set "output=!output!%%s"
echo "%output%"|findstr /I /C:"/scannow">nul 2>&1
(3 linhas separadas). Isso deve funcionar no Windows 2000 através do Windows 2012 R2. Em uma nota lateral, eu prefiro o FINDSTR porque geralmente processa as coisas mais rapidamente do que o FIND.fsutil
solução pessoalmente , mas, pelo que vejo, ela parece muito mais flexível do que minha solução. Embora, não tão elegante, talvez. ;) Fico feliz em ver que, entre nós, estamos recebendo uma excelente, fácil e flexível solução de detecção de administrador. :)fsutil dirty query >nul
quando elevado este retorna algum texto de ajuda e% errorlevel% = 0fsutil dirty query >nul
, no entantofsutil dirty query %systemdrive% >nul
ainda funcionamais duas maneiras - rápida e compatível com versões anteriores.
fltmc
O comando está disponível em todos os sistemas Windows desde o XP, portanto deve ser bastante portátil.Uma solução mais muito rápido testado em
XP
,8.1
,7
- há uma variável específica=::
que é apresentada apenas se a sessão de console não tem privileges.As de administração não é tão fácil criar variável que contém=
nele próprio nome este é o caminho relativamente confiável para verificar se há administrador permissão (não chama executáveis externos, por isso funciona bem)Se você deseja usá-lo diretamente através da linha de comando, mas não a partir de um arquivo em lotes, você pode usar:
fonte
=::
variável é sim um bug - que representa uma unidade não existente, então provavelmente foi fixado em win10.=::
é definida para não administrador CMD no Windows 10 1709. De qualquer forma, não é uma maneira confiável, você pode facilmente forçá-lo a ser definida, mesmo em sessões CMD de administração:subst :: c:\ & for %a in (::) do %a & set,
fonte
solução alternativa:
fonte
openfiles
e verificar ERRORLEVEL é suficiente.openfiles.exe
não funciona no WinPE, portanto, o script sempre retornará que o usuário não é administrador.1>
e2>&1
são explicados em microsoft.com/resources/documentation/windows/xp/all/proddocs/… .nul
refere-se ao dispositivo nuloNão apenas verifique, mas GETTING automaticamente os direitos de administrador,
também conhecido como Automatic UAC for Win 7/8 / 8.1 ff. : A seguir, é muito legal, com mais um recurso: Este snippet de lote não verifica apenas os direitos de administrador, mas os obtém automaticamente! (e testes antes, se estiver vivendo em um sistema operacional compatível com UAC.)
Com esse truque, você não precisa mais clicar com o botão direito do mouse no seu arquivo em lotes "com direitos de administrador". Se você esqueceu, para iniciá-lo com direitos elevados, o UAC aparece automaticamente! Além disso, no início, ele é testado, se o sistema operacional precisar / fornecer UAC, para que se comporte corretamente, por exemplo, no Win 2000 / XP até Win 8.1 - testado.
O snippet mescla alguns bons padrões de lote, especialmente (1) o teste de administrador neste segmento por Ben Hooper e (2) a ativação do UAC lida no BatchGotAdmin e citada no site do lote por robvanderwoude (respeito). (3) Para a identificação do SO pelo "padrão VER | FINDSTR", simplesmente não encontro a referência.)
(No que diz respeito a algumas restrições muito pequenas, quando "NET SESSION" não funcionar como mencionado em outra resposta, sinta-se à vontade para inserir outro desses comandos. Para mim, a execução no modo de segurança do Windows ou em serviços padrão especiais desativados e esses casos de uso não são importantes - para alguns administradores, talvez sejam.)
fonte
start
- ele abre o script em uma nova janela. Se você quiser ver os resultados, adicione umpause
no final do seu script. Além disso, é difícil detectar quando estamos "elevados" e quando há uma nova execução. Você pode usar um argumento de linha de comando para que: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/...Eu tenho duas maneiras de verificar o acesso privilegiado, ambos são bastante confiáveis e muito portáteis em quase todas as versões do Windows.
1. Método
* Funciona no XP e posterior
2. Método
* Funciona no XP e posterior
Exemplo de trabalho
Um script que limpa a pasta temporária
Mostrar snippet de código
fonte
No script em lote Elevate.cmd (veja este link ), que escrevi para obter direitos de administrador , fiz da seguinte maneira:
Isso foi testado no Windows 7, 8, 8.1, 10 e até no Windows XP e não precisa de nenhum recurso, como um diretório, arquivo ou chave de registro especial.
fonte
A maneira mais limpa de verificar os privilégios de administrador usando um script CMD, que eu encontrei, é algo como isto:
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 os processos Admin ou elevados são bem-sucedidos.
fonte
A seguir, tente criar um arquivo no diretório do Windows. Se for bem-sucedido, ele será removido.
Observe que 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 é um GUID que foi gerado hoje e é considerado improvável que entre em conflito com um nome de arquivo existente.
fonte
was generated today and it is assumed to be improbable to conflict with an existing filename.
exceto se duas pessoas usar este códigoO whoami / grupos não funciona em um caso. Se você tiver o UAC totalmente desativado (não apenas a notificação desativada) e você iniciou a partir de um prompt de Administrador, emitiu:
você estará executando não-elevado, mas emitindo:
dirá que você está elevado. Está errado. Aqui está o porquê de estar errado:
Ao executar nesse estado, se IsUserAdmin ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa376389(v=vs.85).aspx ) retornará FALSE e o UAC estiver totalmente desabilitado e GetTokenInformation retorna TokenElevationTypeDefault ( http://blogs.msdn.com/b/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a-securable-object-in-windows-vista.aspx ), o processo não está sendo executado elevado, mas
whoami /groups
afirma que é.realmente, a melhor maneira de fazer isso a partir de um arquivo em lotes é:
Você deve fazer
net session
duas vezes, porque se alguém fez umaat
mão antes, obterá as informações erradas.fonte
whoami /groups
não está fornecendo as informações erradas. É exatamente isso que orunas /trustlevel
coloca em um lugar inesperado: executando sem privilégios de administrador, mas com alto nível de integridade. Você pode confirmar isso com o Process Explorer. (Este pode ser um bug norunas
, mas não é um bug nowhoami
.)runas /trustlevel
Quando você é um administrador local e o UAC está desativado, emitir esse comando runas a partir de um prompt de administrador o colocará em um contexto de segurança de "usuário básico". Enquanto estiver nesse modo, você não poderá executar operações administrativas. Tente "net session", ou fsutil "ou qualquer outro utilitário que exija acesso de administrador. No entanto," whoami / groups "indica que você está elevado. Quando não está. O fato de chamar GetTokenInformation retorna" TokenElevationTypeDefault "indica isso.fonte
whoami
não há suporte no Windows XP.Alguns servidores desabilitam os serviços exigidos pelo comando "net session". Isso resulta na verificação de administrador sempre dizendo que você não tem direitos de administrador quando pode.
fonte
Edit: copyitright apontou que isso não é confiável. A aprovação do acesso de leitura com o UAC permitirá que o dir seja bem-sucedido. Eu tenho um pouco mais de script para oferecer outra possibilidade, mas não é somente leitura.
Resposta antiga abaixo
Aviso: não confiável
Com base em várias outras boas respostas aqui e pontos levantados por and31415, achei que sou fã do seguinte:
Poucas dependências e rápido.
fonte
Nota: A verificação com cacls para \ system32 \ config \ system SEMPRE falhará no WOW64 (por exemplo, de% systemroot% \ syswow64 \ cmd.exe / Total Commander de 32 bits) para que os scripts executados no shell de 32 bits no sistema de 64 bits sejam executados para sempre ... Melhor seria verificar os direitos no diretório Prefetch:
Win XP to 7 testado, no entanto, falha no WinPE como no Windows 7 install.wim não existe tal dir nem cacls.exe
Também no winPE AND wow64 falha, verifique com o openfiles.exe:
No Windows 7, o nível de erro será "1" com informações de que "O sistema de destino precisa ser um sistema operacional de 32 bits"
A verificação provavelmente também falhará no console de recuperação.
O que funciona no Windows XP - 8 32/64 bits, no WOW64 e no WinPE são: testes de criação de diretórios (se o administrador não forneceu o diretório do Windows bombardeado com permissões para todos ...) e
e
Verificações.
Além disso, mais uma observação em alguns Windows XP (e em outras versões provavelmente também, dependendo dos ajustes do administrador), dependendo das entradas do registro que chamam diretamente bat / cmd do script .vbs falharão com a informação de que os arquivos bat / cmd não estão associados a nada ...
Chamar cmd.exe com o parâmetro do arquivo bat / cmd, por outro lado, funciona bem:
fonte
Literalmente, dezenas de respostas nesta e em perguntas vinculadas e em outras partes do SE, todas deficientes dessa maneira ou de outra, mostraram claramente que o Windows não fornece um utilitário de console interno confiável. Então, é hora de lançar o seu próprio.
O código C a seguir, com base em Detectar se o programa está sendo executado com todos os direitos de administrador , funciona no Win2k + 1 , em qualquer lugar e em todos os casos (UAC, domínios, grupos transitivos ...) - porque faz o mesmo que o próprio sistema quando verifica permissões. Ele sinaliza o resultado tanto com uma mensagem (que pode ser silenciada com um comutador) quanto com o código de saída.
Ele só precisa ser compilado uma vez, para que você possa copiar
.exe
todos os lugares - depende apenaskernel32.dll
eadvapi32.dll
( enviei uma cópia ).chkadmin.c
:1 O MSDN afirma que as APIs são XP +, mas isso é falso.
CheckTokenMembership
é 2k + e o outro é ainda mais antigo . O último link também contém uma maneira muito mais complicada que funcionaria mesmo no NT.fonte
Alguém do PowerShell?
fonte
Aqui está outro para adicionar à lista ;-)
(tente criar um arquivo no local do sistema)
O
MODE CON
reinicializa a tela e suprime qualquer texto / erro quando não há permissão para gravar no local do sistema.fonte
Alternativa: use um utilitário externo projetado para essa finalidade, por exemplo, IsAdmin.exe (freeware irrestrito).
Códigos de saída:
0 - Usuário atual não membro do grupo Administradores
1 - Membro usuário atual de Administradores e com desempenho elevado
2 - Membro atual do usuário Administradores, mas não executando elevado
fonte
fonte
Vou explicar o código linha por linha:
Os usuários ficarão irritados com muitas mais de 1 linhas sem isso.
Ponto onde o programa inicia.
Defina o nome do arquivo do diretório a ser criado.
Cria o diretório
<DL>:\Windows
(substitua <DL> pela letra da unidade).Se a variável de ambiente ERRORLEVEL for zero, ecoará a mensagem de sucesso.
Vá para o final (não continue mais).
Se ERRORLEVEL for um, ecoe a mensagem de falha e vá para o final.
Caso o nome do arquivo já exista, recrie a pasta (caso contrário, o
goto end
comando não permitirá que isso seja executado).Especifique o ponto final
Remova o diretório criado.
Faça uma pausa para que o usuário possa ver a mensagem.
Nota : Os filtros
>nul
e2>nul
estão filtrando a saída desses comandos.fonte
net user %username% >nul 2>&1 && echo admin || echo not admin
fonte
admin
Eu acho que a maneira mais simples é tentar alterar a data do sistema (que requer direitos de administrador):
Se a
%date%
variável puder incluir o dia da semana, basta obter a data da última parte doDATE
comando:fonte
:(
Encontrei um usuário que pode usar
net session
mesmo que não seja administrador. Eu não olhei para o porquê. Minha solução alternativa é testar se o usuário pode criar uma pasta na pasta do Windows.Aqui está o meu código:
fonte
Uma coleção dos quatro métodos aparentemente mais compatíveis desta página. O primeiro é realmente bastante genial. Testado a partir do XP. Confuso, porém, que não há comando padrão disponível para verificar os direitos de administrador. Eu acho que eles estão simplesmente se concentrando no PowerShell agora, o que é realmente inútil para a maior parte do meu trabalho.
Chamei o lote 'exit-if-not-admin.cmd', que pode ser chamado de outros lotes para garantir que eles não continuem a execução se os direitos de administrador necessários não forem concedidos.
fonte
Aqui estão os meus 2 centavos no valor de:
Eu precisava de um lote para executar em um ambiente de Domínio durante o processo de login do usuário, em um ambiente de 'sala de trabalho', vendo os usuários aderirem a uma política de "bloqueio" e a uma exibição restrita (principalmente distribuída por conjuntos de GPO).
Um conjunto de GPO de domínio é aplicado antes de um script de logon vinculado ao usuário do AD A criação de um script de logon do GPO estava muito madura porque os "novos" perfis dos usuários não haviam sido criados / carregados / ou prontos a tempo de aplicar uma "remoção e / ou Fixar "na barra de tarefas e nos itens do menu Iniciar vbscript + adicione alguns arquivos locais.
Por exemplo: o ambiente de perfil 'usuário padrão' proposto requer um atalho ".URL '(.lnk) colocado no"% ProgramData% \ Microsoft \ Windows \ Menu \ Programas \ MyNewOWA.url * "e" C: \ Users \ Public \ Desktop \ * MyNewOWA.url * "locais, entre outros itens
Os usuários têm várias máquinas no domínio, em que apenas esses PCs de 'sala de trabalho' definidos exigem essas políticas.
Essas pastas exigem direitos de 'Admin' para serem modificadas e, embora o 'Usuário de Domínio' faça parte do grupo local 'Admin' - o UAC foi o próximo desafio.
Encontrou várias adaptações e amalgamadas aqui. Também tenho alguns usuários com dispositivos BYOD que exigiram outros arquivos com problemas de permissão. Não testei no XP (um sistema operacional um pouco antigo), mas o código está presente, gostaria de receber feedback.
Os PCs de domínio devem ser governados o máximo possível por conjuntos de GPO. Máquinas de grupo de trabalho / independentes podem ser controladas por esse script.
Lembre-se de que um prompt do UAC será exibido pelo menos uma vez com um PC do grupo de trabalho BYOD (assim que a primeira elevação para 'Admin perms' for necessária), mas como a política de segurança local for modificada para uso do administrador a partir deste momento, o pop-ups desaparecerão.
Um PC de domínio deve ter a política "ConsentPromptBehaviorAdmin" do GPO definida na política de "Bloqueio" criada 'já' - conforme explicado na seção 'REFERÊNCIAS' do script.
Novamente, execute a importação secedit.exe do arquivo '.inf' padrão se você estiver travado no debate "To UAC or Not to UAC" :-).
btw: @boileau Verifique sua falha no:
Executando apenas "% SYSTEMROOT% \ system32 \ cacls.exe" ou "% SYSTEMROOT% \ system32 \ config \ system" ou ambos no prompt de comando - elevado ou não, verifique o resultado em geral.
fonte
Outra maneira de fazer isso.
fonte