Script em lote: como verificar os direitos de administrador

280

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.

flacs
fonte
2
depois de alterar o direito: [Como solicitar acesso de administrador dentro de um arquivo em lotes] [1] [1]: stackoverflow.com/questions/1894967/…
Alban
Veja também: superuser.com/questions/667607/…
ivan_pozdeev 4/16/16

Respostas:

465

Problemas

A solução da blak3r / Rushyo funciona bem para tudo, exceto o Windows 8. A execução ATno Windows 8 resulta em:

The AT command has been deprecated. Please use schtasks.exe instead.

The request is not supported.

(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:

  • a criação ou interação com dados em locais seguros
  • analisando dados retornados de FORloops
  • pesquisando cadeias de caracteres "Administrador"
  • usando AT(Windows 8 incompatível) ou WHOAMI(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:

  • Windows XP, x86
  • Windows XP, x64
  • Windows Vista, x86
  • Windows Vista, x64
  • Windows 7, x86
  • Windows 7, x64
  • Windows 8, x86
  • Windows 8, x64
  • Windows 10 v1909, x64

(veja a captura de tela # 2)

 

Implementação / Uso

Portanto, para usar esta solução, basta fazer algo assim:

@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

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:

  1. @echo off
    • Desativar exibição de comandos
  2. goto check_Permissions
    • Ir para o :check_Permissionsbloco de código
  3. net session >nul 2>&1
    • Comando de execução
    • Ocultar saída visual de comando por
      1. Redirecionando o STDOUTfluxo de saída padrão (identificador numérico 1 / ) paranul
      2. Redirecionando o fluxo de saída de erro padrão (identificador numérico 2 / STDERR) para o mesmo destino que identificador numérico 1
  4. if %errorLevel% == 0
    • Se o valor do código de saída ( %errorLevel%) for 0 , isso significa que nenhum erro ocorreu e, portanto, o comando anterior imediato foi executado com êxito
  5. else
    • Se o valor do código de saída ( %errorLevel%) não for 0 , isso significa que ocorreram erros e, portanto, o comando anterior imediato foi executado sem êxito
  6. O código entre os respectivos parênteses será executado dependendo de quais critérios forem atendidos

 

Screenshots

Windows 8AT %errorLevel% :

[imgur]

 

NET SESSIONno Windows XP x86 - Windows 8 x64 :

[imgur]

 

Obrigado, @Tilka, por alterar sua resposta aceita à minha. :)

mythofechelon
fonte
12
+1 trabalho impressionante! Boa pesquisa. Sua postagem deve merecer uma nova resposta aceita.
blak3r
13
Essa solução normalmente funciona muito bem, mas se o serviço "Servidor" (LanmanServer) for interrompido, o código de erro para "O serviço do servidor não foi iniciado" será o mesmo código de erro obtido para "Acesso negado", resultando em falso negativo . Em outras palavras, há casos em que você pode executar essa verificação com privilégios administrativos e ela retornará o mesmo erro que ocorreria sem esses privilégios.
Lectrode
3
@Lectrode Publiquei uma solução alternativa que não tem o mesmo problema: stackoverflow.com/questions/4051883/…
and31415
8
Este código retorna um falso positivo (pelo menos no Windows 7) se o usuário for um usuário avançado. Um usuário avançado também pode "elevar" e executar com net sessionêxito (ERRORLEVEL = 0) - mas na verdade não possui direitos de administrador. O uso openfiles(veja a resposta de Lucrécio abaixo) não tem esse problema.
EM0 14/0115
1
Isso interrompe o prompt se o dispositivo de rede não estiver funcionando totalmente (por exemplo: depuração do Windows). fltmc> nul 2> & 1 funciona melhor nesse sentido.
kevinf 21/09/18
80

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?

NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
    ECHO NOT AN ADMIN!
)

Versão que adiciona mensagens de erro, pausas e saídas

@rem ----[ This code block detects if the script is being running with admin PRIVILEGES If it isn't it pauses and then quits]-------
echo OFF
NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
   echo ######## ########  ########   #######  ########  
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ######   ########  ########  ##     ## ########  
   echo ##       ##   ##   ##   ##   ##     ## ##   ##   
   echo ##       ##    ##  ##    ##  ##     ## ##    ##  
   echo ######## ##     ## ##     ##  #######  ##     ## 
   echo.
   echo.
   echo ####### ERROR: ADMINISTRATOR PRIVILEGES REQUIRED #########
   echo This script must be run as administrator to work properly!  
   echo If you're seeing this after clicking on a start menu icon, then right click on the shortcut and select "Run As Administrator".
   echo ##########################################################
   echo.
   PAUSE
   EXIT /B 1
)
@echo ON

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.

blak3r
fonte
1
ATnã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).
Mythofechelon
1
Gostaria de saber se duas linhas de se% errorLevel% == / EQU no primeiro bloco de código é um TYPO .. por favor corrija.
Ujjwal Singh
@UjjwalSingh Com certeza foi. Obrigado por pegar. Eu atualizei.
blak3r
Pode querer substituir o "Rushyo postou esta solução aqui" pelo seu comentário sobre mim agora que você está usando a minha solução? :)
mythofechelon
Não funciona para o grupo de administradores de domínio adicionado ao grupo de administradores na máquina local e efetue login com o usuário administrador de domínio.
MCRohith
46

Mais problemas

Conforme indicado pelo @Lectrode, se você tentar executar o net sessioncomando enquanto o serviço do servidor estiver parado, você receberá a seguinte mensagem:

The Server service is not started.

More help is available by typing NET HELPMSG 2114

Nesse caso, a %errorLevel%variável será definida como 2.

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:

  • pode ser executado imediatamente no Windows XP e posterior (32 e 64 bits);
  • não toca no registro ou em nenhum arquivo / pasta do sistema;
  • funciona independentemente da localidade do sistema;
  • fornece resultados corretos, mesmo no modo de segurança.

Então, eu inicializei uma máquina virtual do Windows XP e comecei a percorrer a lista de aplicativos na C:\Windows\System32pasta, tentando obter algumas idéias. Após tentativas e erros, esta é a abordagem suja (trocadilhos) que eu criei:

fsutil dirty query %systemdrive% >nul

O fsutil dirtycomando 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 para nul, portanto, ignorada. A %errorlevel%variável será configurada para 0somente após a execução bem-sucedida.

Aqui está o que a documentação diz:

Fsutil sujo

Consulta ou define o bit sujo de um volume. Quando o bit sujo de um volume é definido, o autochk verifica automaticamente o volume quanto a erros na próxima vez que o computador for reiniciado.

Sintaxe

fsutil dirty {query | set} <VolumePath>

Parâmetros

query           Queries the specified volume's dirty bit.
set             Sets the specified volume's dirty bit.
<VolumePath>    Specifies the drive name followed by a colon or GUID.

Observações

O bit sujo de um volume indica que o sistema de arquivos pode estar em um estado inconsistente. O bit sujo pode ser definido porque:

  • O volume está on-line e possui alterações excelentes.
  • Foram feitas alterações no volume e o computador foi desligado antes que as alterações fossem confirmadas no disco.
  • Foi detectada corrupção no volume.

Se o bit sujo estiver definido quando o computador reiniciar, o chkdsk será executado para verificar a integridade do sistema de arquivos e tentar corrigir quaisquer problemas com o volume.

Exemplos

Para consultar o bit sujo na unidade C, digite:

fsutil dirty query C:

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 sfccomando sem nenhum parâmetro resultaria em:

  • um erro, se você não tiver privilégios suficientes;
  • uma lista dos parâmetros disponíveis e seu uso.

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:

sfc 2>&1 | find /i "/SCANNOW" >nul

A saída de erro é redirecionada primeiro para a saída padrão, que é canalizada para o findcomando. 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 para nul.

Aqui está um trecho da documentação:

Sfc

Verifica e verifica a integridade de todos os arquivos protegidos do sistema e substitui as versões incorretas pelas versões corretas.

Observações

Você deve fazer logon como membro do grupo Administradores para executar o sfc.exe .

Uso da amostra

Aqui estão alguns exemplos de colar e executar:

Windows XP e posterior

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b

Windows 2000 / Windows PE

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
sfc 2>&1 | find /i "/SCANNOW" >nul
exit /b

Aplica-se a

  • Windows 2000
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
  • Windows 8.1
    ---
  • Windows PE
and31415
fonte
1
+1 Excelentes soluções. A solução SFC, em particular, parece ser uma verificação confiável para todos os sistemas operacionais em questão. Se me deparar com algum problema usando um desses, os relatarei aqui.
Lectrode
1
Para quem deseja usar a SFCverificação em todos os sistemas, é preciso ser um pouco criativo. Por alguma razão, a partir do Windows 8 SFCgera 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.
Letrode
Bom trabalho, @ and31415! Ainda não testei sua fsutilsoluçã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. :)
mythofechelon 23/01/19
1
Ao executar fsutil você pode deixar de fora a letra da unidade e só correr fsutil dirty query >nulquando elevado este retorna algum texto de ajuda e% errorlevel% = 0
SS64
4
@ SS64 Windows 10 não retorna um nível de erro diferente de zero para fsutil dirty query >nul, no entanto fsutil dirty query %systemdrive% >nulainda funciona
bcrist
19

mais duas maneiras - rápida e compatível com versões anteriores.

fltmc >nul 2>&1 && (
  echo has admin permissions
) || (
  echo has NOT admin permissions
)

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)

setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! ( 
   echo has NOT admin permissions
) else (
   echo has admin permissions
)

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:

set ^"|find "::"||echo has admin permissions
npocmaka
fonte
Épico ... A solução "dv == ::" definida tem algumas desvantagens / limitações?
script'n'code
Bem, por alguma razão, o! Dv! O método sempre diz que sou administrador, enquanto não clicou com o botão direito do mouse em "Executar como administrador" no arquivo em lotes (Windows 10). Eu realmente pensei que esse método era perfeito. Adorei esse método porque não depende de programas externos. Agora estou triste e não sei o que está fazendo isso falhar / não é confiável para mim :(
script'n'code
1
@copyitright - Eu não tinha máquina win10 para testá-lo lá :( Embora existência de. =::variável é sim um bug - que representa uma unidade não existente, então provavelmente foi fixado em win10.
npocmaka
Eles provavelmente corrigiram isso sim. Foi divertido enquanto durou.
Script # n'code
1
Eu vejo =::é 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,
sst
17
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)
Anders
fonte
1
Parece que, em alguns casos, o teste sempre falhava, mesmo após ser elevado. No meu caso, quando o script foi chamado pelo meu aplicativo.
boileau
15

solução alternativa:

@echo off
pushd %SystemRoot%
openfiles.exe 1>nul 2>&1
if not %errorlevel% equ 0 (
    Echo here you are not administrator!
) else (
    Echo here you are administrator!
)
popd
Pause
Lucrécio
fonte
7
Você poderia adicionar uma explicação para sua resposta?
bjb568
4
Embora esse código possa responder à pergunta, você deve adicionar uma explicação sobre o motivo.
PlasmaHH
2
Sim! Isso funciona corretamente mesmo quando o usuário é um usuário avançado (diferente da "sessão de rede"). Não há necessidade de pushd / popd, no entanto. Basta executar openfilese verificar ERRORLEVEL é suficiente.
EM0 14/0115
2
Eu tenho usado esta solução e está funcionando bem. O problema é que openfiles.exenão funciona no WinPE, portanto, o script sempre retornará que o usuário não é administrador.
quer
A documentação do openfiles.exe pode ser encontrada em technet.microsoft.com/de-de/library/bb490961.aspx . 1>e 2>&1são explicados em microsoft.com/resources/documentation/windows/xp/all/proddocs/… . nulrefere-se ao dispositivo nulo
user1460043
13

Nã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.

@echo off
REM Quick test for Windows generation: UAC aware or not ; all OS before NT4 ignored for simplicity
SET NewOSWith_UAC=YES
VER | FINDSTR /IL "5." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO
VER | FINDSTR /IL "4." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO


REM Test if Admin
CALL NET SESSION >nul 2>&1
IF NOT %ERRORLEVEL% == 0 (

    if /i "%NewOSWith_UAC%"=="YES" (
        rem Start batch again with UAC
        echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
        echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
        "%temp%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
    )

    rem Program will now start again automatically with admin rights! 
    rem pause
    goto :eof
)

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.)

Philm
fonte
Isso é ótimo! Observe uma coisa - chamá-lo do Visual Basic funciona assim start- ele abre o script em uma nova janela. Se você quiser ver os resultados, adicione um pauseno 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/...
Tomasz Gandor
@Film: E se o UAC exigir que o usuário digite sua senha? Eu suponho que este código não vai dar-lhes direitos de administrador automaticamente sem que o usuário digitar sua senha primeiro ;-)
script'n'code
@copyitright. Não, claro que não. Mas se a senha necessária ou não não é uma diferença aqui: é claro que o que eu quis dizer com "automaticamente" é que o script aciona o Windows para pedir automaticamente os direitos, não mais. Sem uma construção como essa, o script em lote falharia se iniciado com um clique duplo ou similar. Para evitar isso, o usuário precisaria saber com antecedência que o script requer direitos elevados e teve que iniciá-lo assim.
Philm
Portanto, meu script apenas permite que o autor de um lote de arquivos mude o momento da elevação necessária para um ponto durante a execução do lote que ele deseja. Ou, em outras palavras: Para permitir uma execução mais conveniente com o "clique duplo" normal. Como considerei esses arquivos em lote normalmente usados ​​por profissionais ou usuários com muito bom conhecimento da tecnologia subjacente do Windows, não expliquei isso em detalhes.
Philm
12

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

set guid=%random%%random%-%random%-%random%-%random%-%random%%random%%random%

mkdir %WINDIR%\%guid%>nul 2>&1
rmdir %WINDIR%\%guid%>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

Esse é um dos métodos mais confiáveis, devido à sua simplicidade, e é improvável que o comportamento desse comando muito primitivo mude. Esse não é o caso de outras ferramentas CLI internas, como a sessão de rede, que pode ser desabilitada pelas políticas de administrador / rede, ou comandos como fsutils, que alteraram a saída no Windows 10.

* Funciona no XP e posterior

2. Método

REG ADD HKLM /F>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

Às vezes, você não gosta da idéia de tocar no disco do usuário, mesmo que seja tão inofensivo quanto usar fsutils ou criar uma pasta vazia, é improvável, mas pode resultar em uma falha catastrófica se algo der errado. Nesse cenário, você pode apenas verificar o registro para obter privilégios.

Para isso, você pode tentar criar uma chave em HKEY_LOCAL_MACHINE usando as permissões padrão. Você terá acesso negado e o ERRORLEVEL == 1, mas se você executar como Admin, ele imprimirá "comando executado com sucesso" e ERRORLEVEL == 0. Como a chave já existe, ela não tem efeito no registro. Esta é provavelmente a maneira mais rápida, e o REG está lá há muito tempo.

* Não está disponível no pré-NT (Win 9X).

* Funciona no XP e posterior


Exemplo de trabalho

Um script que limpa a pasta temporária

Vitim.us
fonte
1
Eu realmente gosto do método de registro. Na verdade, eu me lembro, não preciso procurar toda vez que uso.
precisa
8

No script em lote Elevate.cmd (veja este link ), que escrevi para obter direitos de administrador , fiz da seguinte maneira:

:checkPrivileges
  NET FILE 1>NUL 2>NUL
  if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

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.

Matt
fonte
6

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 os processos Admin ou elevados são bem-sucedidos.

William
fonte
1
direitos autorais apontaram que isso não é confiável. Se você visitar% windir% \ system32 \ config \ systemprofile em uma janela do Explorer e aprovar com o UAC, a janela do CMD poderá direcionar o conteúdo com êxito. Levando você a pensar que tem elevação quando não tem.
Tyler Szabo
5

A seguir, tente criar um arquivo no diretório do Windows. Se for bem-sucedido, ele será removido.

copy /b/y NUL %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1
if errorlevel 1 goto:nonadmin
del %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1
:admin
rem here you are administrator
goto:eof
:nonadmin
rem here you are not administrator
goto:eof

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.

Benoit
fonte
+1 porque a resposta aceita fez com que infinitas janelas de comando fossem abertas quando o script foi chamado do meu aplicativo.
boileau
was generated today and it is assumed to be improbable to conflict with an existing filename.exceto se duas pessoas usar este código
Vitim.us
4

O 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:

runas /trustlevel:0x20000 cmd

você estará executando não-elevado, mas emitindo:

whoami /groups

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 /groupsafirma que é.

realmente, a melhor maneira de fazer isso a partir de um arquivo em lotes é:

net session >nul 2>nul
net session >nul 2>nul
echo %errorlevel%

Você deve fazer net sessionduas vezes, porque se alguém fez uma atmão antes, obterá as informações erradas.

zumalifeguard
fonte
whoami /groupsnão está fornecendo as informações erradas. É exatamente isso que o runas /trustlevelcoloca 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 no runas, mas não é um bug no whoami.)
Harry Johnston
Harry, eu ouvi o que você está dizendo, mas você pode elaborar isso? Não entendo o comentário sobre 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.
zumalifeguard
Não sei ao certo o que você entende por "whoami / groups diz que você está elevado"; literalmente não gera a string "você está elevado", não é? Que parte da produção de whoami / grupos você está vendo?
Harry Johnston,
Harry, vejo que não estava claro. Primeiro plano de fundo, então você e eu estamos na mesma página. existem alguns truques que as pessoas usam para determinar se um prompt de comando está sendo executado no momento em um estado que tenha acesso de administrador. Técnicas comuns são usar o comando construído, como fsutil, at, whoami e "net session". O uso de "at" foi preterido. Se você pesquisar nesta página, verá exemplos usando fsutil, whoami e "net session". Veja aqui para mais exemplos de whoami: stackoverflow.com/questions/7985755/…
zumalifeguard
Além disso, o uso da frase "execução elevada" não está exatamente correto. O que eu (e outros) devo dizer "executando com privilégios de administrador". Se o UAC estiver desativado, isso simplesmente será executado enquanto você estiver conectado como administrador local, mas não reduzirá explicitamente o nível de confiança, como nas runas. Quando o UAC está ativado, isso significa que o usuário está executando em um prompt elevado.
zumalifeguard
2
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)
Totonga
fonte
2
O problema aqui é que você verifica se o usuário possui direitos de administrador. Mas o script em lote pode ser executado sem direitos de administrador.
tanascius
2
Além disso, whoaminão há suporte no Windows XP.
Mythofechelon
Também whoami / groups tem um caso extremo em que você obtém as informações erradas. Veja stackoverflow.com/questions/4051883/…
zumalifeguard
2

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.

Dan
fonte
2

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.

reg query "HKLM\SOFTWARE\Foo" >NUL 2>NUL && goto :error_key_exists
reg add "HKLM\SOFTWARE\Foo" /f >NUL 2>NUL || goto :error_not_admin
reg delete "HKLM\SOFTWARE\Foo" /f >NUL 2>NUL || goto :error_failed_delete
goto :success

:error_failed_delete
  echo Error unable to delete test key
  exit /b 3
:error_key_exists
  echo Error test key exists
  exit /b 2
:error_not_admin
  echo Not admin
  exit /b 1
:success
  echo Am admin

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:

dir "%SystemRoot%\System32\config\DRIVERS" 2>nul >nul || echo Not Admin

Poucas dependências e rápido.

Tyler Szabo
fonte
1
Essa solução costumava funcionar para mim, mas desde que naveguei até o local e acessei a pasta para a qual você precisa de privilégios elevados, o código ERRORLEVEL / exit é sempre 0 agora, apesar de executar o script como usuário padrão.
script'n'code
1

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:

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\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:

OPENFILES > nul

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

net session

e

reg add HKLM /F

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 ...

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo

Chamar cmd.exe com o parâmetro do arquivo bat / cmd, por outro lado, funciona bem:

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/C %~s0", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo
user2902818
fonte
1

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 .exetodos os lugares - depende apenas kernel32.dlle advapi32.dll( enviei uma cópia ).

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;
}

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.

ivan_pozdeev
fonte
1

Alguém do PowerShell?

param (
    [string]$Role = "Administrators"
)

#check for local role

$identity  = New-Object Security.Principal.WindowsIdentity($env:UserName)
$principal = New-Object Security.Principal.WindowsPrincipal($identity)

Write-Host "IsInRole('$Role'): " $principal.IsInRole($Role)

#enumerate AD roles and lookup

$groups = $identity::GetCurrent().Groups
foreach ($group in $groups) {
    $trans = $group.Translate([Security.Principal.NTAccount]);
    if ($trans.Value -eq $Role) {
       Write-Host "User is in '$Role' role"
    }
}
Ostati
fonte
1

Aqui está outro para adicionar à lista ;-)

(tente criar um arquivo no local do sistema)

CD.>"%SystemRoot%\System32\Drivers\etc\_"
MODE CON COLS=80 LINES=25

IF EXIST "%SystemRoot%\System32\Drivers\etc\_" (

  DEL "%SystemRoot%\System32\Drivers\etc\_"

  ECHO Has Admin privileges

) ELSE (

  ECHO No Admin privileges

)

O MODE CONreinicializa a tela e suprime qualquer texto / erro quando não há permissão para gravar no local do sistema.

script'n'code
fonte
0

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

Bill_Stewart
fonte
0
@echo off
ver
set ADMDIR=C:\Users\Administrator
dir %ADMDIR% 1>nul 2>&1
echo [%errorlevel%] %ADMDIR%
if "%errorlevel%"=="0" goto main
:: further checks e.g. try to list the contents of admin folders
:: wherever they are stored on older versions of Windows
echo You need administrator privileges to run this script: %0
echo Exiting...
exit /b

:main
echo Executing with Administrator privileges...
cmd
fonte
0
@echo off
:start
set randname=%random%%random%%random%%random%%random%
md \windows\%randname% 2>nul
if %errorlevel%==0 (echo You're elevated!!!
goto end)
if %errorlevel%==1 (echo You're not elevated :(:(
goto end)
goto start
:end
rd \windows\%randname% 2>nul
pause >nul

Vou explicar o código linha por linha:

@echo off

Os usuários ficarão irritados com muitas mais de 1 linhas sem isso.

:start

Ponto onde o programa inicia.

set randname=%random%%random%%random%%random%%random%

Defina o nome do arquivo do diretório a ser criado.

md \windows\%randname% 2>nul

Cria o diretório <DL>:\Windows(substitua <DL> pela letra da unidade).

if %errorlevel%==0 (echo You're elevated!!!
goto end)

Se a variável de ambiente ERRORLEVEL for zero, ecoará a mensagem de sucesso.
Vá para o final (não continue mais).

if %errorlevel%==1 (echo You're not elevated :(:(
goto end)

Se ERRORLEVEL for um, ecoe a mensagem de falha e vá para o final.

goto start

Caso o nome do arquivo já exista, recrie a pasta (caso contrário, o goto endcomando não permitirá que isso seja executado).

:end

Especifique o ponto final

rd \windows\%randname% 2>nul

Remova o diretório criado.

pause >nul

Faça uma pausa para que o usuário possa ver a mensagem.

Nota : Os filtros >nule 2>nulestão filtrando a saída desses comandos.

EKons
fonte
Sim, eu sei que quando você estiver logado como usuário administrador (não um usuário com o tipo de conta de administrador), você estará sempre elevado, mas isso não é um bug!
EKons
0

net user %username% >nul 2>&1 && echo admin || echo not admin

herege
fonte
Este parece ser errado, ele mostra se o usuário tem direitos de administrador, mas isso não está relacionado com a questão se o cmd.exe atual é executado com direitos de administrador
jeb
não, mostra se o cmd.exe atual tem acesso administrativo ao banco de dados dos usuários ou não, portanto, funciona mesmo no caso em que a "sessão de rede" não. Como alternativa, "net config> nul 2> & 1 && echo admin || eco não administrador" faz o trabalho. Ambas as construções testadas com sucesso no windows xp em contas guest, user avançado e administrativas com LanmanServer interrompidas (errorlevel 2 for cmd.exe executado em guest e user avançado, errorlevel 0 for cmd.exe sob direitos de administrador). Será que vai funcionar no Vista e, posteriormente, com os problemas acima mencionados do UAC - eu não sei, por isso seria bom se alguém pudesse testá-lo.
heretic
2
Testei com duas janelas cmd (win7x64), iniciei com e sem direitos de administrador. Em ambos os casos, mostraadmin
jeb 11/11
0

Eu acho que a maneira mais simples é tentar alterar a data do sistema (que requer direitos de administrador):

date %date%
if errorlevel 1 (
   echo You have NOT admin rights
) else (
   echo You have admin rights
)

Se a %date%variável puder incluir o dia da semana, basta obter a data da última parte do DATEcomando:

for /F "delims=" %%a in ('date ^<NUL') do set "today=%%a" & goto break
:break
for %%a in (%today%) do set "today=%%a"
date %today%
if errorlevel 1 ...
Aacini
fonte
3
Não posso deixar de votar um "conselho" tão destrutivo.
Ivan_pozdeev 4/16/16
2
Mesmo deixando de lado que a alteração da hora do sistema sem uma boa razão é dar um tiro no pé (todos os tipos de efeitos estranhos no software) - se você estiver usando a hora atual, ainda estará distorcendo quando o comando estiver sendo executado.
Ivan_pozdeev 4/16/16
2
@ivan_pozdeev: Talvez você possa descrever apenas um dos "efeitos estranhos no software" que podem acontecer quando a data é alterada para a mesma data em uma sessão do cmd.exe ...
#
1
Consulte também superuser.com/questions/27263/…
ivan_pozdeev
@ivan_pozdeev: Nenhum dos seus links está relacionado remotamente ao meu método. Eu acho que você não entendeu minha solução. Esse método pode ter apenas um dos dois resultados possíveis: nada é alterado (se o usuário não tiver direitos de administrador) ou DATA é alterado PARA O MESMO VALOR (se o usuário tiver direitos de administrador). Meu método não muda o tempo ! Convido você a reler minha resposta e explicar em inglês simples as razões do seu :(
voto negativo
0

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:

::::::: :testadmin function START :::::::
:: this function tests if current user is admin.  results are returned as "true" or "false" in %isadmin%
:: Test "%isadmin" after calling this function
:: Usage: "call :testadmin"
echo Your script entered the :testadmin function by error.  Usage: "call :testadmin"
pause
exit /b
:testadmin

 rd %windir%\local_admin_test > nul 2> nul
 md %windir%\local_admin_test > nul 2> nul
 if [%errorlevel%]==[0] set isadmin=true
 if not [%errorlevel%]==[0] set isadmin=false
 rd %windir%\local_admin_test > nul 2> nul

 if [%isadmin%]==[true] (
   echo User IS admin.
 )
 if not [%isadmin%]==[true] (
   echo User IS NOT admin.
   timeout 30
   :: or use "pause" instead of "timeout"
   exit /b
 )
exit /b
:::::: :testadmin function END ::::::
Grallen
fonte
0

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.

rem Sun May 03, 2020

rem Methods for XP+ used herein based on:
rem /programming/4051883/batch-script-how-to-check-for-admin-rights
goto method1

:method1
setlocal enabledelayedexpansion
set "dv==::"
if defined !dv! goto notadmin
goto admin

:method2
call fsutil dirty query %SystemDrive% >nul
if %ERRORLEVEL%==0 goto admin
goto notadmin

:method3
net session >nul 2>&1
if %ERRORLEVEL%==0 goto admin
goto notadmin

:method4
fltmc >nul 2>&1 && goto admin
goto notadmin

:admin
echo Administrator rights detected
goto end

:notadmin
echo ERROR: This batch must be run with Administrator privileges
pause
exit /b
goto end

:end```
bolas de subida
fonte
-1

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.

    :: ------------------------------------------------------------------------
    :: You have a royalty-free right to use, modify, reproduce and distribute
    :: the Sample Application Files (and/or any modified version) in any way
    :: you find useful, provided that you agree that the author provides
    :: no warranty, obligations or liability for any Sample Application Files.
    :: ------------------------------------------------------------------------

    :: ********************************************************************************
    ::* Sample batch script to demonstrate the usage of RunAs.cmd
    ::*
    ::* File:           RunAs.cmd
    ::* Date:           12/10/2013
    ::* Version:        1.0.2
    ::*
    ::* Main Function:  Verifies status of 'bespoke' Scripts ability to 'Run As - Admin'
    ::*                 elevated privileges and without UAC prompt
    ::*
    ::* Usage:          Run RunAs.cmd from desired location
    ::*         Bespoke.cmd will be created and called from C:\Utilities location
    ::*         Choose whether to delete the script after its run by removing out-comment
    ::*                 (::) before the 'Del /q Bespoke.cmd' command
    ::*
    ::* Distributed under a "GNU GPL" type basis.
    ::*
    ::* Revisions:
    ::* 1.0.0 - 08/10/2013 - Created.
    ::* 1.0.1 - 09/10/2013 - Include new path creation.
    ::* 1.0.2 - 12/10/2013 - Modify/shorten UAC disable process for Admins
    ::*
    ::* REFERENCES:
    ::* Sample "*.inf" secpol.msc export from Wins 8 x64 @ bottom, 
    ::* Would be default but for 'no password complexities'
    ::*
    ::* To recreate UAC default: 
    ::* Goto:Secpol, edit out Exit, modify .inf set, export as "Wins8x64.inf" 
    ::* and import using secedit cmd provided
    ::*
    :: ********************************************************************************

    @echo off & cls
    color 9F
    Title RUN AS
    Setlocal
    :: Verify local folder availability for script
    IF NOT EXIST C:\Utilities (
        mkdir C:\Utilities & GOTO:GenBatch
    ) ELSE (
        Goto:GenBatch
    )
    :GenBatch
    c:
    cd\
    cd C:\Utilities
    IF NOT EXIST C:\Utilities\Bespoke.cmd (
        GOTO:CreateBatch
    ) ELSE (
        Goto:RunBatch
    )
    :CreateBatch
    Echo. >Bespoke.cmd
    Echo :: ------------------------------------------------------------------------ >>Bespoke.cmd
    Echo :: You have a royalty-free right to use, modify, reproduce and distribute >>Bespoke.cmd
    Echo :: the Sample Application Files (and/or any modified version) in any way >>Bespoke.cmd
    Echo :: you find useful, provided that you agree that the author provides >>Bespoke.cmd
    Echo :: has no warranty, obligations or liability for any Sample Application Files. >>Bespoke.cmd
    Echo :: ------------------------------------------------------------------------ >>Bespoke.cmd
    Echo. >>Bespoke.cmd
    Echo :: ******************************************************************************** >>Bespoke.cmd
    Echo ::* Sample batch script to demonstrate the usage of Bespoke.cmd >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* File:           Bespoke.cmd >>Bespoke.cmd
    Echo ::* Date:           10/10/2013 >>Bespoke.cmd
    Echo ::* Version:        1.0.1 >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Main Function:  Allows for running of Bespoke batch with elevated rights and no future UAC 'pop-up' >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Usage:          Called and created by RunAs.cmd run from desired location >>Bespoke.cmd
    Echo ::*                 Found in the C:\Utilities folder >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Distributed under a "GNU GPL" type basis. >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Revisions: >>Bespoke.cmd
    Echo ::* 1.0.0 - 09/10/2013 - Created. >>Bespoke.cmd
    Echo ::* 1.0.1 - 10/10/2013 - Modified, added ability to temp disable UAC pop-up warning. >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* REFERENCES: >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Exit code (%%^ErrorLevel%%) 0 - No errors have occurred, i.e. immediate previous command ran successfully >>Bespoke.cmd
    Echo ::* Exit code (%%^ErrorLevel%%) 1 - Errors occurred, i.e. immediate previous command ran Unsuccessfully >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* MS OS version check >>Bespoke.cmd
    Echo ::* http://msdn.microsoft.com/en-us/library/windows/desktop/ms724833%28v=vs.85%29.aspx >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Copying to certain folders and running certain apps require elevated perms >>Bespoke.cmd
    Echo ::* Even with 'Run As ...' perms, UAC still pops up. >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* To run a script or application in the Windows Shell >>Bespoke.cmd
    Echo ::* http://ss64.com/vb/shellexecute.html >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Machines joined to a corporate Domain should have the UAC feature set from, and >>Bespoke.cmd
    Echo ::* pushed out from a DC GPO policy >>Bespoke.cmd
    Echo ::* e.g.: 'Computer Configuration - Policies - Windows Settings - Security Settings -  >>Bespoke.cmd
    Echo ::* Local Policies/Security Options - User Account Control -  >>Bespoke.cmd
    Echo ::* Policy: User Account Control: Behavior of the elevation prompt for administrators >>Bespoke.cmd
    Echo ::*         in Admin Approval Mode  Setting: Elevate without prompting >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo :: ******************************************************************************** >>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo @Echo off ^& cls>>Bespoke.cmd
    Echo color 9F>>Bespoke.cmd
    Echo Title RUN AS ADMIN>>Bespoke.cmd
    Echo Setlocal>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo Set "_OSVer=">>Bespoke.cmd
    Echo Set "_OSVer=UAC">>Bespoke.cmd
    Echo VER ^| FINDSTR /IL "5." ^>NUL>>Bespoke.cmd
    Echo IF %%^ErrorLevel%%==0 SET "_OSVer=PreUAC">>Bespoke.cmd
    Echo IF %%^_OSVer%%==PreUAC Goto:XPAdmin>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo :: Check if machine part of a Domain or within a Workgroup environment >>Bespoke.cmd
    Echo Set "_DomainStat=">>Bespoke.cmd
    Echo Set "_DomainStat=%%USERDOMAIN%%">>Bespoke.cmd
    Echo If /i %%^_DomainStat%% EQU %%^computername%% (>>Bespoke.cmd
    Echo Goto:WorkgroupMember>>Bespoke.cmd
    Echo ) ELSE (>>Bespoke.cmd
    Echo Set "_DomainStat=DomMember" ^& Goto:DomainMember>>Bespoke.cmd
    Echo )>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo :WorkgroupMember>>Bespoke.cmd
    Echo :: Verify status of Secpol.msc 'ConsentPromptBehaviorAdmin' Reg key >>Bespoke.cmd
    Echo reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin ^| Find /i "0x0">>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo If %%^ErrorLevel%%==0 (>>Bespoke.cmd
    Echo    Goto:BespokeBuild>>Bespoke.cmd
    Echo ) Else (>>Bespoke.cmd
    Echo    Goto:DisUAC>>Bespoke.cmd
    Echo )>>Bespoke.cmd
    Echo :DisUAC>>Bespoke.cmd
    Echo :XPAdmin>>Bespoke.cmd
    Echo :DomainMember>>Bespoke.cmd
    Echo :: Get ADMIN Privileges, Start batch again, modify UAC ConsentPromptBehaviorAdmin reg if needed >>Bespoke.cmd
    Echo ^>nul ^2^>^&1 ^"^%%^SYSTEMROOT%%\system32\cacls.exe^"^ ^"^%%^SYSTEMROOT%%\system32\config\system^">>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo IF ^'^%%^Errorlevel%%^'^ NEQ '0' (>>Bespoke.cmd
    Echo    echo Set objShell = CreateObject^^("Shell.Application"^^) ^> ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    echo objShell.ShellExecute ^"^%%~s0^"^, "", "", "runas", 1 ^>^> ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    del ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    exit /B>>Bespoke.cmd
    Echo ) else (>>Bespoke.cmd
    Echo    pushd ^"^%%^cd%%^">>Bespoke.cmd
    Echo    cd /d ^"^%%~dp0^">>Bespoke.cmd
    Echo    @echo off>>Bespoke.cmd
    Echo )>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo IF %%^_OSVer%%==PreUAC Goto:BespokeBuild>>Bespoke.cmd
    Echo IF %%^_DomainStat%%==DomMember Goto:BespokeBuild>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 0 /f>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo :BespokeBuild>>Bespoke.cmd
    Echo :: Add your script requiring elevated perm and no UAC below: >>Bespoke.cmd
    Echo.>>Bespoke.cmd

    :: PROVIDE BRIEF EXPLINATION AS TO WHAT YOUR SCRIPT WILL ACHIEVE
    Echo ::

    :: ADD THE "PAUSE" BELOW ONLY IF YOU SET TO SEE RESULTS FROM YOUR SCRIPT
    Echo Pause>>Bespoke.cmd

    Echo Goto:EOF>>Bespoke.cmd
    Echo :EOF>>Bespoke.cmd
    Echo Exit>>Bespoke.cmd

    Timeout /T 1 /NOBREAK >Nul
    :RunBatch
    call "Bespoke.cmd"
    :: Del /F /Q "Bespoke.cmd"

    :Secpol
    :: Edit out the 'Exit (rem or ::) to run & import default wins 8 security policy provided below
    Exit

    :: Check if machine part of a Domain or within a Workgroup environment
    Set "_DomainStat="
    Set _DomainStat=%USERDOMAIN%
    If /i %_DomainStat% EQU %computername% (
        Goto:WorkgroupPC
    ) ELSE (
        Echo PC Member of a Domain, Security Policy determined by GPO
        Pause
        Goto:EOF
    )

    :WorkgroupPC

    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin | Find /i "0x5"
    Echo.
    If %ErrorLevel%==0 (
        Echo Machine already set for UAC 'Prompt'
        Pause
        Goto:EOF
    ) else (
        Goto:EnableUAC
    )
    :EnableUAC
    IF NOT EXIST C:\Utilities\Wins8x64Def.inf (
        GOTO:CreateInf
    ) ELSE (
        Goto:RunInf
    )
    :CreateInf
    :: This will create the default '*.inf' file and import it into the 
    :: local security policy for the Wins 8 machine
    Echo [Unicode]>>Wins8x64Def.inf
    Echo Unicode=yes>>Wins8x64Def.inf
    Echo [System Access]>>Wins8x64Def.inf
    Echo MinimumPasswordAge = ^0>>Wins8x64Def.inf
    Echo MaximumPasswordAge = ^-1>>Wins8x64Def.inf
    Echo MinimumPasswordLength = ^0>>Wins8x64Def.inf
    Echo PasswordComplexity = ^0>>Wins8x64Def.inf
    Echo PasswordHistorySize = ^0>>Wins8x64Def.inf
    Echo LockoutBadCount = ^0>>Wins8x64Def.inf
    Echo RequireLogonToChangePassword = ^0>>Wins8x64Def.inf
    Echo ForceLogoffWhenHourExpire = ^0>>Wins8x64Def.inf
    Echo NewAdministratorName = ^"^Administrator^">>Wins8x64Def.inf
    Echo NewGuestName = ^"^Guest^">>Wins8x64Def.inf
    Echo ClearTextPassword = ^0>>Wins8x64Def.inf
    Echo LSAAnonymousNameLookup = ^0>>Wins8x64Def.inf
    Echo EnableAdminAccount = ^0>>Wins8x64Def.inf
    Echo EnableGuestAccount = ^0>>Wins8x64Def.inf
    Echo [Event Audit]>>Wins8x64Def.inf
    Echo AuditSystemEvents = ^0>>Wins8x64Def.inf
    Echo AuditLogonEvents = ^0>>Wins8x64Def.inf
    Echo AuditObjectAccess = ^0>>Wins8x64Def.inf
    Echo AuditPrivilegeUse = ^0>>Wins8x64Def.inf
    Echo AuditPolicyChange = ^0>>Wins8x64Def.inf
    Echo AuditAccountManage = ^0>>Wins8x64Def.inf
    Echo AuditProcessTracking = ^0>>Wins8x64Def.inf
    Echo AuditDSAccess = ^0>>Wins8x64Def.inf
    Echo AuditAccountLogon = ^0>>Wins8x64Def.inf
    Echo [Registry Values]>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Setup\RecoveryConsole\SecurityLevel=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Setup\RecoveryConsole\SetCommand=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\CachedLogonsCount=1,"10">>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ForceUnlockLogon=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\PasswordExpiryWarning=4,5>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ScRemoveOption=1,"0">>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin=4,5>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorUser=4,3>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableCAD=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DontDisplayLastUserName=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableInstallerDetection=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableSecureUIAPaths=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableUIADesktopToggle=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableVirtualization=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\FilterAdministratorToken=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeCaption=1,"">>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeText=7,>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\PromptOnSecureDesktop=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ScForceOption=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ShutdownWithoutLogon=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\UndockWithoutLogon=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ValidateAdminCodeSignatures=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Policies\Microsoft\Windows\Safer\CodeIdentifiers\AuthenticodeEnabled=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\AuditBaseObjects=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\CrashOnAuditFail=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\DisableDomainCreds=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\EveryoneIncludesAnonymous=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\FullPrivilegeAuditing=3,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\LimitBlankPasswordUse=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\MSV1_0\NTLMMinClientSec=4,536870912>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\MSV1_0\NTLMMinServerSec=4,536870912>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\NoLMHash=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymous=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymousSAM=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Print\Providers\LanMan Print Services\Servers\AddPrinterDrivers=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\SecurePipeServers\Winreg\AllowedExactPaths\Machine=7,System\CurrentControlSet\Control\ProductOptions,System\CurrentControlSet\Control\Server Applications,Software\Microsoft\Windows NT\CurrentVersion>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\SecurePipeServers\Winreg\AllowedPaths\Machine=7,System\CurrentControlSet\Control\Print\Printers,System\CurrentControlSet\Services\Eventlog,Software\Microsoft\OLAP Server,Software\Microsoft\Windows NT\CurrentVersion\Print,Software\Microsoft\Windows NT\CurrentVersion\Windows,System\CurrentControlSet\Control\ContentIndex,System\CurrentControlSet\Control\Terminal Server,System\CurrentControlSet\Control\Terminal Server\UserConfig,System\CurrentControlSet\Control\Terminal Server\DefaultUserConfiguration,Software\Microsoft\Windows NT\CurrentVersion\Perflib,System\CurrentControlSet\Services\SysmonLog>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\Kernel\ObCaseInsensitive=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\ClearPageFileAtShutdown=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\ProtectionMode=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\optional=7,Posix>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\AutoDisconnect=4,15>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\EnableForcedLogOff=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\EnableSecuritySignature=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\NullSessionPipes=7,>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\RequireSecuritySignature=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\RestrictNullSessAccess=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\EnablePlainTextPassword=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\EnableSecuritySignature=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\RequireSecuritySignature=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LDAP\LDAPClientIntegrity=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\MaximumPasswordAge=4,30>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\RequireSignOrSeal=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\RequireStrongKey=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\SealSecureChannel=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\SignSecureChannel=4,1>>Wins8x64Def.inf
    Echo [Privilege Rights]>>Wins8x64Def.inf
    Echo SeNetworkLogonRight = *S-1-1-0,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeBackupPrivilege = *S-1-5-32-544,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeChangeNotifyPrivilege = *S-1-1-0,*S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551,*S-1-5-90-^0>>Wins8x64Def.inf
    Echo SeSystemtimePrivilege = *S-1-5-19,*S-1-5-32-544>>Wins8x64Def.inf
    Echo SeCreatePagefilePrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeDebugPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeRemoteShutdownPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeAuditPrivilege = *S-1-5-19,*S-1-5-20>>Wins8x64Def.inf
    Echo SeIncreaseQuotaPrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544>>Wins8x64Def.inf
    Echo SeIncreaseBasePriorityPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeLoadDriverPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeBatchLogonRight = *S-1-5-32-544,*S-1-5-32-551,*S-1-5-32-559>>Wins8x64Def.inf
    Echo SeServiceLogonRight = *S-1-5-80-0,*S-1-5-83-^0>>Wins8x64Def.inf
    Echo SeInteractiveLogonRight = Guest,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeSecurityPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeSystemEnvironmentPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeProfileSingleProcessPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeSystemProfilePrivilege = *S-1-5-32-544,*S-1-5-80-3139157870-2983391045-3678747466-658725712-1809340420>>Wins8x64Def.inf
    Echo SeAssignPrimaryTokenPrivilege = *S-1-5-19,*S-1-5-20>>Wins8x64Def.inf
    Echo SeRestorePrivilege = *S-1-5-32-544,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeShutdownPrivilege = *S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeTakeOwnershipPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeDenyNetworkLogonRight = Guest>>Wins8x64Def.inf
    Echo SeDenyInteractiveLogonRight = Guest>>Wins8x64Def.inf
    Echo SeUndockPrivilege = *S-1-5-32-544,*S-1-5-32-545>>Wins8x64Def.inf
    Echo SeManageVolumePrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeRemoteInteractiveLogonRight = *S-1-5-32-544,*S-1-5-32-555>>Wins8x64Def.inf
    Echo SeImpersonatePrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-6>>Wins8x64Def.inf
    Echo SeCreateGlobalPrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-6>>Wins8x64Def.inf
    Echo SeIncreaseWorkingSetPrivilege = *S-1-5-32-545,*S-1-5-90-^0>>Wins8x64Def.inf
    Echo SeTimeZonePrivilege = *S-1-5-19,*S-1-5-32-544,*S-1-5-32-545>>Wins8x64Def.inf
    Echo SeCreateSymbolicLinkPrivilege = *S-1-5-32-544,*S-1-5-83-^0>>Wins8x64Def.inf
    Echo [Version]>>Wins8x64Def.inf
    Echo signature="$CHICAGO$">>Wins8x64Def.inf
    Echo Revision=1>>Wins8x64Def.inf

    :RunInf
    :: Import 'Wins8x64Def.inf' with ADMIN Privileges, to modify UAC ConsentPromptBehaviorAdmin reg
    >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%%\system32\config\system"
    IF '%Errorlevel%' NEQ '0' (
        echo Set objShell = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
        echo objShell.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
       "%temp%%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
        Secedit /configure /db secedit.sdb /cfg C:\Utilities\Wins8x64Def.inf /overwrite
        Goto:CheckUAC
    ) else (
        Secedit /configure /db secedit.sdb /cfg C:\Utilities\Wins8x64Def.inf /overwrite
        @echo off
    )
    :CheckUAC
    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin | Find /i "0x5"
    Echo.
    If %ErrorLevel%==0 (
        Echo ConsentPromptBehaviorAdmin set to 'Prompt'
        Pause
        Del /Q C:\Utilities\Wins8x64Def.inf
        Goto:EOF
    ) else (
        Echo ConsentPromptBehaviorAdmin NOT set to default
        Pause
    )
    ENDLOCAL
    :EOF
    Exit

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:

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

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.

Ian Stockdale
fonte
-2

Outra maneira de fazer isso.

REM    # # # #      CHECKING OR IS STARTED AS ADMINISTRATOR     # # # # #

FSUTIL | findstr /I "volume" > nul&if not errorlevel 1  goto Administrator_OK

cls
echo *******************************************************
echo ***    R U N    A S    A D M I N I S T R A T O R    ***
echo *******************************************************
echo.
echo.
echo Call up just as the Administrator. Abbreviation can be done to the script and set:
echo.
echo      Shortcut ^> Advanced ^> Run as Administrator
echo.
echo.
echo Alternatively, a single run "Run as Administrator"
echo or in the Schedule tasks with highest privileges
pause > nul
goto:eof
:Administrator_OK

REM Some next lines code ...
Artur Zgadzaj
fonte
Qual é o link que deveria ser? Sinalizado como spam por causa do link.
mmgross
Verifique esta resposta para obter um código que verifique e solicite automaticamente: stackoverflow.com/a/30590134/4932683 #
cyberponk