De dentro de um arquivo em lote, gostaria de testar se estou executando com privilégios de administrador / elevados.
O nome de usuário não muda quando "Executar como administrador" é selecionado, então isso não funciona.
Se houvesse um comando disponível universalmente, que não tivesse efeito, mas exigisse privilégios administrativos, eu poderia executá-lo e verificar se há um código de erro para testar os privilégios. Até agora, não encontrei esse comando. Os comandos que encontrei parecem retornar um único código de erro não específico, que pode indicar qualquer coisa, e estão sujeitos a falhas por vários motivos.
Eu só me importo com o Windows 7, embora o suporte de sistemas operacionais anteriores fosse bom.
windows
command-line
cmd
Jeff
fonte
fonte
echo > somefile
em um diretório que exigiria privilégios de administrador. ele produziria um arquivo como um efeito colateral, mas você poderia verificar se há colisões e criar um nome de arquivo exclusivo como uma solução alternativa.Respostas:
ADENDO : Para Windows 8 isso não funcionará; veja esta excelente resposta em vez disso.
Encontre esta solução aqui: http://www.robvanderwoude.com/clevertricks.php
Supondo que isso não funcione, e como estamos falando de Win7, você pode usar o seguinte no Powershell, se for adequado:
Se não (e provavelmente não, já que você propôs explicitamente os arquivos em lote), você pode escrever o código acima em .NET e retornar um código de saída de um exe com base no resultado para seu arquivo em lote usar.
fonte
AT
não funciona no Windows 8, mas encontrei uma solução melhor. Eu postei como uma resposta a outra pergunta, aqui: stackoverflow.com/questions/4051883/… .ping
de substituir faltandosleep
:)Este truque requer apenas um comando: digite
net session
no prompt de comando.Se você NÃO for um administrador , receberá uma mensagem de acesso negado.
Se você É um administrador , receberá uma mensagem diferente, sendo a mais comum:
Da MS Technet :
fonte
There are no entries in the list.
no Windows 10 Pronet session >nul 2>&1 || (echo not admin&goto :eof)
Gosto da sugestão de Rushyo de usar AT, mas esta é outra opção:
Essa abordagem também permite que você faça a distinção entre um não administrador e um administrador não elevado, se desejar. Os administradores não elevados ainda têm BUILTIN \ Administradores na lista de grupos, mas não está habilitado.
No entanto, isso não funcionará em alguns sistemas de idioma diferente do inglês. Em vez disso, tente
(Isso deve funcionar no Windows 7, mas não tenho certeza sobre as versões anteriores.)
fonte
whoami/groups
e então escaneie as linhas manualmente. Não demoraria muito e o comando caberia em seu cérebro.Praticamente o que outros colocaram antes, mas como uma linha que pode ser colocada no início de um comando de lote. (Bem, geralmente após @echo off.)
fonte
A maneira mais fácil de fazer isso no Vista, Win 7 e superior é enumerar grupos de tokens e procurar o nível de integridade atual (ou o lado do administrador, se apenas a associação ao grupo for importante):
Verifique se estamos executando elevados:
Verifique se pertencemos a administradores locais:
Verifique se pertencemos a administradores de domínio:
O seguinte artigo lista os SIDs de nível de integridade usados pelas janelas: http://msdn.microsoft.com/en-us/library/bb625963.aspx
fonte
Aqui está uma ligeira modificação da resposta de Harry que se concentra no status elevado; Estou usando isso no início de um arquivo install.bat:
Isso definitivamente funcionou para mim e o princípio parece ser bom; de Chris Jackson da MSFT :
fonte
a solução:
não funciona no Windows 10
para todas as versões do Windows pode ser:
fonte
Eu li muitas (a maioria?) Das respostas, então desenvolvi um arquivo bat que funciona para mim no Win 8.1. Pensei em compartilhar.
Espero que alguém ache isso útil :)
fonte
Uma versão "not-a-one-liner" de https://stackoverflow.com/a/38856823/2193477
fonte
Eu sei que estou muito atrasado para esta festa, mas aqui está minha única linha para determinar a função administrativa.
Não depende do nível de erro, apenas de
systeminfo
:Ele retorna sim ou não, dependendo do status de administrador do usuário ...
Ele também define o valor da variável "admin" como igual a sim ou não, de acordo.
fonte
Se você estiver executando como um usuário com direitos de administrador, a variável de ambiente SessionName NÃO será definida e você ainda não tem direitos de administrador ao executar um arquivo em lote.
Você deve usar o comando "net session" e procurar um código de retorno de erro "0" para verificar os direitos do administrador.
Exemplo; - a primeira declaração de eco é o caractere de sino
net session >nul 2>&1 if not %errorlevel%==0 (echo echo You need to start over and right-click on this file, echo then select "Run as administrator" to be successfull. echo.&pause&exit)
fonte
Aqui está um método simples que usei no Windows 7 ao Windows 10. Basicamente, eu simplesmente uso o comando "IF EXIST" para verificar a pasta Windows \ System32 \ WDI \ LogFiles. A pasta WDI existe em todas as instalações do Windows, de pelo menos 7 em diante, e requer privilégios de administrador para acessá-la. A pasta WDI sempre tem uma pasta LogFiles dentro dela. Portanto, executar "IF EXIST" na pasta WDI \ LogFiles retornará verdadeiro se executado como administrador e falso se não for executado como administrador. Isso pode ser usado em um arquivo em lote para verificar o nível de privilégio e desviar para quaisquer comandos que você deseja com base nesse resultado.
Aqui está um breve trecho de código de exemplo:
Lembre-se de que este método assume que as permissões de segurança padrão não foram modificadas na pasta WDI (o que é improvável de acontecer na maioria das situações, mas consulte a advertência nº 2 abaixo). Mesmo nesse caso, é simplesmente uma questão de modificar o código para verificar se há um arquivo / pasta comum diferente que requer acesso de administrador (System32 \ config \ SAM pode ser um bom candidato alternativo), ou você pode até mesmo criar seu próprio especificamente para isso objetivo.
No entanto, existem duas advertências sobre esse método:
Desativar o UAC provavelmente irá quebrá-lo pelo simples fato de que tudo seria executado como administrador de qualquer maneira.
Tentar abrir a pasta WDI no Windows Explorer e clicar em "Continuar" quando solicitado adicionará direitos de acesso permanentes para essa conta de usuário, quebrando assim meu método. Se isso acontecer, pode ser corrigido removendo a conta do usuário das permissões de segurança da pasta WDI. Se, por algum motivo, o usuário PRECISA ser capaz de acessar a pasta WDI com o Windows Explorer, será necessário modificar o código para verificar uma pasta diferente (conforme mencionado acima, criar sua própria pasta especificamente para esse fim pode ser uma boa escolha) .
Portanto, admito que meu método não é perfeito, pois pode ser quebrado, mas é um método relativamente rápido e fácil de implementar, é igualmente compatível com todas as versões do Windows 7, 8 e 10, e desde que eu esteja ciente das advertências mencionadas foi 100% eficaz para mim.
fonte
Funciona para Win7 Enterprise e Win10 Enterprise
fonte