Script batch: come verificare i diritti di amministratore


281

Come posso verificare se lo script batch corrente dispone dei diritti di amministratore?

So come farlo chiamare se stesso con le rune ma non come verificare i diritti di amministratore. Le uniche soluzioni che ho visto sono lavori di hacking o di programmi esterni. Bene, in realtà non mi interessa se si tratta di un lavoro di hacking fintanto che funziona su Windows XP e versioni successive.


2
dopo aver modificato il diritto: [Come richiedere l'accesso dell'amministratore all'interno di un file batch] [1] [1]: stackoverflow.com/questions/1894967/…
Alban



Risposte:


466

Problemi

La soluzione di blak3r / Rushyo funziona bene per tutto tranne Windows 8. L'esecuzione ATsu Windows 8 comporta:

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

The request is not supported.

(vedi screenshot n. 1) e tornerà %errorLevel% 1.

 

Ricerca

Quindi, sono andato alla ricerca di altri comandi che richiedono autorizzazioni elevate. rationallyparanoid.com aveva un elenco di alcuni, quindi ho eseguito ogni comando sui due estremi opposti degli attuali sistemi operativi Windows (XP e 8) nella speranza di trovare un comando a cui sarebbe negato l'accesso su entrambi i sistemi operativi se eseguito con autorizzazioni standard.

Alla fine, ho trovato uno - NET SESSION. Una soluzione vera , pulita e universale che non comporta:

  • la creazione o l'interazione con i dati in luoghi sicuri
  • analisi dei dati restituiti dai FORloop
  • ricerca di stringhe per "Amministratore"
  • utilizzando AT(Windows 8 incompatibile) o WHOAMI(Windows XP incompatibile).

Ognuno dei quali ha i propri problemi di sicurezza, usabilità e portabilità.

 

analisi

Ho confermato indipendentemente che funziona su:

  • 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

(vedi screenshot # 2)

 

Implementazione / Utilizzo

Quindi, per usare questa soluzione, fai semplicemente una cosa del genere:

@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

Disponibile qui, se sei pigro: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

 

Spiegazione

NET SESSIONè un comando standard utilizzato per "gestire le connessioni al computer server. Usato senza parametri, [visualizza] visualizza informazioni su tutte le sessioni con il computer locale."

Quindi, ecco il processo di base della mia data implementazione:

  1. @echo off
    • Disabilita la visualizzazione dei comandi
  2. goto check_Permissions
    • Vai al :check_Permissionsblocco di codice
  3. net session >nul 2>&1
    • Esegui comando
    • Nascondi l'output visivo del comando di
      1. Reindirizzamento del STDOUTflusso di output standard (handle numerico 1 / ) sunul
      2. Reindirizzamento del flusso di output degli errori standard (handle numerico 2 / STDERR) alla stessa destinazione dell'handle numerico 1
  4. if %errorLevel% == 0
    • Se il valore del codice di uscita ( %errorLevel%) è 0 quindi ciò significa che non si sono verificati errori e, pertanto, il comando precedente immediato è stato eseguito correttamente
  5. else
    • Se il valore del codice di uscita ( %errorLevel%) non è, 0 ciò significa che si sono verificati errori e, pertanto, il comando precedente immediato è stato eseguito senza successo
  6. Il codice tra le rispettive parentesi verrà eseguito in base a quali criteri sono soddisfatti

 

Screenshots

Windows 8AT %errorLevel% :

[Imgur]

 

NET SESSIONsu Windows XP x86 - Windows 8 x64 :

[Imgur]

 

Grazie, @Tilka, per aver cambiato la tua risposta accettata alla mia. :)


13
+1 Ottimo lavoro! Buona ricerca. Il tuo post dovrebbe meritare una nuova risposta accettata.
Blak3r,

13
Questa soluzione normalmente funziona alla grande, ma se il servizio "Server" (LanmanServer) viene interrotto, il codice di errore per "Il servizio server non è stato avviato" è lo stesso codice di errore che si ottiene per "Accesso negato" risultante in un falso negativo . In altre parole, ci sono casi in cui è possibile eseguire questo controllo con privilegi amministrativi e restituirà lo stesso errore che avrebbe senza quei privilegi.
Lectrode,

3
@Lectrode Ho postato una soluzione alternativa che non ha lo stesso problema: stackoverflow.com/questions/4051883/...
and31415

8
Questo codice restituisce un falso positivo (almeno su Windows 7) se l'utente è un Power User. Un Power User può anche "elevare" e quindi eseguire net sessioncorrettamente (ERRORLEVEL = 0) - ma in realtà non dispongono dei diritti di amministratore. L'uso openfiles(vedi la risposta di Lucrezio di seguito) non presenta questo problema.
EM0

1
Ciò blocca il prompt se il dispositivo di rete non funziona completamente (ad es. Debug di Windows). fltmc> nul 2> & 1 funziona meglio al riguardo.
kevinf,

80

La soluzione di Anders ha funzionato per me, ma non ero sicuro di come invertirlo per ottenere il contrario (quando non eri un amministratore).

Ecco la mia soluzione Ha due casi, un caso IF e ELSE, e alcune tecniche ASCII per garantire che le persone lo leggano effettivamente. :)

Versione minima

Rushyo ha pubblicato questa soluzione qui: Come rilevare se CMD è in esecuzione come amministratore / ha privilegi elevati?

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

Versione che aggiunge messaggi di errore, pause ed uscite

@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

Funziona su WinXP -> Win8 (comprese le versioni a 32/64 bit).

EDIT: 28/08/2012 Aggiornato per supportare Windows 8. @BenHooper lo ha sottolineato nella sua risposta di seguito. Per favore, vota la sua risposta.


1
ATnon funziona su Windows 8, ma ho trovato una soluzione migliore. L'ho pubblicato come risposta qui, in realtà: stackoverflow.com/questions/4051883/… (o puoi semplicemente scorrere verso il basso, qualunque cosa).
mythofechelon,

1
Mi chiedo se due righe di se% errorLevel% == / EQU sul primo blocco di codice sia un TYPO .. per favore correggi.
Ujjwal Singh,

@UjjwalSingh Certo che lo era. Grazie per la cattura. L'ho aggiornato.
Blak3r

Potrebbe voler sostituire il "Rushyo ha pubblicato questa soluzione qui" con il tuo commento su di me ora che stai usando la mia soluzione? :)
mythofechelon il

Non funziona per il gruppo Domain Admins aggiunto al gruppo Administrators nel computer locale e accedi con l'utente amministratore del dominio.
MCRohith,

46

Più problemi

Come sottolineato da @Lectrode, se si tenta di eseguire il net sessioncomando mentre il servizio Server è interrotto, viene visualizzato il seguente messaggio di errore:

The Server service is not started.

More help is available by typing NET HELPMSG 2114

In questo caso la %errorLevel%variabile verrà impostata su 2.

Nota Il servizio Server non viene avviato in Modalità provvisoria (con o senza rete).

Alla ricerca di un'alternativa

Qualcosa che:

  • può essere eseguito immediatamente su Windows XP e versioni successive (32 e 64 bit);
  • non tocca il registro o nessun file / cartella di sistema;
  • funziona indipendentemente dalle impostazioni locali del sistema;
  • fornisce risultati corretti anche in modalità provvisoria.

Così ho avviato una macchina virtuale Windows XP vanilla e ho iniziato a scorrere l'elenco delle applicazioni nella C:\Windows\System32cartella, cercando di ottenere alcune idee. Dopo prove ed errori, questo è l' approccio sporco (gioco di parole) che ho escogitato:

fsutil dirty query %systemdrive% >nul

Il fsutil dirtycomando richiede l'esecuzione dei diritti di amministratore e in caso contrario non andrà a buon fine. %systemdrive%è una variabile di ambiente che restituisce la lettera di unità in cui è installato il sistema operativo. L'output viene reindirizzato a nul, quindi ignorato. La %errorlevel%variabile verrà impostata su 0solo in caso di esecuzione corretta.

Ecco cosa dice la documentazione:

Fsutil sporco

Interroga o imposta il bit sporco di un volume. Quando viene impostato il bit sporco di un volume, autochk verifica automaticamente la presenza di errori nel volume al successivo riavvio del computer.

Sintassi

fsutil dirty {query | set} <VolumePath>

parametri

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.

Osservazioni

Il bit sporco di un volume indica che il file system potrebbe essere in uno stato incoerente. Il bit sporco può essere impostato perché:

  • Il volume è online e presenta modifiche eccezionali.
  • Sono state apportate modifiche al volume e il computer è stato spento prima di eseguire il commit delle modifiche sul disco.
  • La corruzione è stata rilevata sul volume.

Se il bit sporco viene impostato al riavvio del computer, chkdsk viene eseguito per verificare l'integrità del file system e tentare di risolvere eventuali problemi con il volume.

Esempi

Per eseguire una query sul bit sporco sull'unità C, digitare:

fsutil dirty query C:

Ulteriore ricerca

Mentre la soluzione sopra funziona da Windows XP in poi, vale la pena aggiungere che Windows 2000 e Windows PE (ambiente preinstallato) non vengono forniti fsutil.exe, quindi dobbiamo ricorrere a qualcos'altro.

Durante i miei precedenti test ho notato che l'esecuzione del sfccomando senza parametri avrebbe comportato:

  • un errore, se non avessi abbastanza privilegi;
  • un elenco dei parametri disponibili e del loro utilizzo.

Cioè: nessun parametro, nessuna festa . L'idea è che possiamo analizzare l'output e verificare se non abbiamo ricevuto altro che un errore:

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

L'output dell'errore viene prima reindirizzato all'output standard, che viene quindi reindirizzato al findcomando. A questo punto dobbiamo cercare l' unico parametro che viene supportato in tutte le versioni di Windows a partire da Windows 2000: /SCANNOW. La ricerca non fa distinzione tra maiuscole e minuscole e l'output viene scartato reindirizzandolo a nul.

Ecco un estratto dalla documentazione:

Sfc

Esegue la scansione e verifica l'integrità di tutti i file di sistema protetti e sostituisce le versioni errate con le versioni corrette.

Osservazioni

È necessario accedere come membro del gruppo Administrators per eseguire sfc.exe .

Esempio di utilizzo

Ecco alcuni esempi di incolla:

Windows XP e versioni successive

@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

Si applica a

  • Windows 2000
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
  • Windows 8.1
    ---
  • Windows PE

1
+1 Soluzioni eccellenti. La soluzione SFC in particolare sembra essere un controllo affidabile per tutti i sistemi operativi in ​​questione. Se riscontro problemi utilizzando uno di questi, li segnalerò qui.
Lectrode,

1
Per tutti coloro che desiderano utilizzare il SFCcontrollo per tutti i sistemi, è necessario essere un po 'creativi. Per qualche motivo, a partire da Windows 8 vengono SFCemessi solo caratteri singoli. Per analizzare correttamente l'output, è necessario effettuare le seguenti operazioni: 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 righe separate). Questo dovrebbe funzionare su Windows 2000 tramite Windows 2012 R2. Da un lato, preferisco FINDSTR perché generalmente elabora le cose più rapidamente di FIND.
Lectrode,

Ottimo lavoro, @ and31415! Non ho ancora testato personalmente la tua fsutilsoluzione ma, da quello che posso vedere, sembra molto più flessibile della mia soluzione. Anche se, non altrettanto elegante, forse. ;) Sono contento di vedere che, tra di noi, stiamo ottenendo una soluzione di rilevamento dell'amministratore eccellente, facile e flessibile individuata. :)
mythofechelon,

1
Quando si esegue FSUTIL è possibile tralasciare la lettera di unità ed eseguire solo fsutil dirty query >nulquando elevato restituisce un testo di aiuto e% errorlevel% = 0
SS64

4
@ ss64 Windows 10 non restituisce più un livello di errore diverso da zero fsutil dirty query >nul, tuttavia fsutil dirty query %systemdrive% >nulfunziona ancora
bcrist

19

altri due modi: veloce e compatibile con le versioni precedenti.

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

fltmc il comando è disponibile su tutti i sistemi Windows a partire da XP, quindi dovrebbe essere abbastanza portatile.


Una soluzione più veramente veloce testato su XP, 8.1, 7 - c'è una variabile specifica =::che si presenta solo se la sessione della console non ha privileges.As di amministrazione non è così facile da creare variabile che contiene =nel suo nome questo è il modo relativamente affidabile per controllare per admin permesso (non chiama eseguibili esterni quindi funziona bene)

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

Se vuoi usarlo direttamente dalla riga di comando, ma non da un file batch puoi usare:

set ^"|find "::"||echo has admin permissions

Epico ... La soluzione "dv == ::" impostata presenta degli svantaggi / limitazioni?
script'n'code

Bene, per qualche motivo il! Dv! Il metodo dice sempre che sono Amministratore, mentre non ho fatto clic con il pulsante destro del mouse su "Esegui come amministratore" nel file batch (Windows 10). Pensavo davvero che questo metodo fosse impeccabile. Ho adorato questo metodo perché non dipendeva da programmi esterni. Ora sono triste e non so cosa lo stia facendo fallire / inaffidabile per me :(
script'n'code

1
@copyitright - Non avevo una macchina win10 per testarlo lì :(. Sebbene l'esistenza della =::variabile sia piuttosto un bug - rappresenta un disco non esistente, quindi probabilmente è stato risolto in win10.
npocmaka

Probabilmente lo hanno corretto sì. È stato divertente finché è durato.
script'n'code il

1
Vedo =::è definito per non amministratore CMD su Windows 10 1709. In ogni caso, non è un modo affidabile, si può facilmente forzarla da definire anche su Admin sessioni CMD:subst :: c:\ & for %a in (::) do %a & set,
sst

17
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)

1
Sembra che in alcuni casi il test abbia sempre fallito, anche dopo essere stato elevato. Nel mio caso, quando lo script è stato chiamato dalla mia applicazione.
Bollettino,

15

soluzione 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

7
Potresti aggiungere una spiegazione alla tua risposta?
bjb568,

4
Sebbene questo codice possa rispondere alla domanda, è necessario aggiungere alcune spiegazioni sul perché lo faccia.
PlasmaHH,

2
Sì! Funziona correttamente anche quando l'utente è un Power User (diversamente dalla "sessione di rete"). Tuttavia, non è necessario il pushd / popd. È sufficiente eseguire openfilese controllare ERRORLEVEL.
EM0

2
Ho usato questa soluzione e ha funzionato bene. Il problema è che openfiles.exenon funziona in WinPE, quindi lo script restituirà sempre che l'utente non è admin.
Viandante,

La documentazione per openfiles.exe è disponibile su technet.microsoft.com/de-de/library/bb490961.aspx . 1>e 2>&1sono spiegati su microsoft.com/resources/documentation/windows/xp/all/proddocs/… . nulsi riferisce al dispositivo null
user1460043

13

Non solo controlla ma OTTIENI automaticamente i diritti di amministratore,
ovvero UAC automatico per Win 7/8 / 8.1 e seguenti.
: Quello che segue è davvero interessante con un'altra funzionalità: questo frammento batch non controlla solo i diritti di amministratore, ma li ottiene automaticamente! (e test prima, se si vive su un sistema operativo compatibile con UAC.)

Con questo trucco non è più necessario fare clic con il pulsante destro del mouse sul file batch "con diritti di amministratore". Se hai dimenticato, per avviarlo con diritti elevati, UAC viene automaticamente visualizzato! Inoltre, all'inizio viene testato, se il sistema operativo ha bisogno / fornisce UAC, quindi si comporta correttamente, ad esempio per Win 2000 / XP fino a Win 8.1.

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

Lo snippet unisce alcuni buoni pattern batch, in particolare (1) il test di amministrazione in questo thread di Ben Hooper e (2) l'attivazione UAC letta su BatchGotAdmin e citata sul sito batch da robvanderwoude (rispetto). (3) Per l'identificazione del SO con "VER | FINDSTR pattern" non trovo proprio il riferimento.)

(Per quanto riguarda alcune restrizioni molto minori, quando "NET SESSION" non funziona come indicato in un'altra risposta, sentiti libero di inserire un altro di quei comandi. Per me eseguire in modalità provvisoria di Windows o servizi standard speciali inattivi e tali non sono casi d'uso importanti - per alcuni amministratori forse lo sono.)


Questo è fantastico! Nota una cosa - chiamarlo da Visual Basic funziona come start- apre lo script in una nuova finestra. Se vuoi vedere i risultati, aggiungi pausea alla fine dello script. Inoltre, è difficile rilevare quando "restiamo" elevati e quando viene eseguita nuovamente. È possibile utilizzare un argomento della riga di comando per questo: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/…
Tomasz Gandor,

@Philm: cosa succede se l'UAC richiede all'utente di inserire la propria password? Presumo che questo codice non conceda automaticamente i diritti di amministratore senza che l'utente
debba

@copyitright. No certo che no. Ma se la password necessaria o no non fa differenza qui: ciò che intendevo con "automaticamente" è ovviamente che lo script attiva automaticamente Windows per CHIEDERE i diritti, non di più. Senza una costruzione come questa, lo script batch avrebbe esito negativo, se avviato con un doppio clic o simile. Per evitare ciò, l'utente dovrebbe sapere in anticipo che lo script richiede diritti elevati e deve avviarlo in questo modo.
Philm,

Quindi il mio script consente all'autore di file batch di spostare il momento dell'elevazione necessaria su un punto durante l'esecuzione batch che desidera. O in altre parole: per consentire un'esecuzione più comoda con il normale "doppio clic". Poiché ho considerato tali file batch normalmente utilizzati da professionisti o utenti con un'ottima conoscenza della tecnologia Windows sottostante, non l'ho spiegato in dettaglio.
Philm,

12

Ho due modi per verificare l'accesso privilegiato, entrambi sono abbastanza affidabili e molto portatili in quasi tutte le versioni di Windows.

1. Metodo

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

Questo è uno dei metodi più affidabili, a causa della sua semplicità, e il comportamento di questo comando molto primitivo è molto improbabile che cambi. Questo non è il caso di altri strumenti CLI integrati come net session che possono essere disabilitati dai criteri di amministrazione / rete o comandi come fsutils che hanno modificato l'output su Windows 10.

* Funziona su XP e versioni successive

2. Metodo

REG ADD HKLM /F>nul 2>&1

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

A volte non ti piace l'idea di toccare il disco dell'utente, anche se è tanto offensivo come usare fsutils o creare una cartella vuota, non è dimostrabile ma può provocare un fallimento catastrofico se qualcosa va storto. In questo scenario puoi semplicemente controllare il registro per i privilegi.

Per questo puoi provare a creare una chiave su HKEY_LOCAL_MACHINE utilizzando le autorizzazioni predefinite otterrai Accesso negato e il ERRORLEVEL == 1, ma se esegui come amministratore, stamperà "comando eseguito correttamente" e ERRORLEVEL == 0. Poiché la chiave esiste già, non ha alcun effetto sul registro. Questo è probabilmente il modo più veloce e il REG è lì da molto tempo.

* Non è disponibile su pre NT (Win 9X).

* Funziona su XP e versioni successive


Esempio funzionante

Uno script che cancella la cartella temporanea


1
Mi piace molto il metodo di registro. Posso davvero ricordarlo, non devo cercarlo ogni volta che lo uso.
Miscreant

8

Nello script batch Elevate.cmd (vedi questo link ), che ho scritto per ottenere i diritti di amministratore , l'ho fatto nel modo seguente:

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

Questo è testato per Windows 7, 8, 8.1, 10 e persino Windows XP e non necessita di alcuna risorsa come directory, file o chiavi di registro speciali.


6

Il modo più pulito per verificare i privilegi di amministratore utilizzando uno script CMD, che ho trovato, è qualcosa del genere:

@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

Questo metodo utilizza solo i built-in CMD.exe, quindi dovrebbe essere molto veloce. Controlla inoltre le effettive capacità del processo anziché verificare la presenza di SID o appartenenze a gruppi, quindi viene testata l' autorizzazione effettiva . E questo funziona fino a Windows 2003 e XP. I normali processi utente o processi non pertinenti non riescono a sondare la directory, dove hanno successo come Admin o processi elevati.


1
copyitright ha sottolineato che ciò non è affidabile. Se visiti% windir% \ system32 \ config \ systemprofile in una finestra di Explorer e approvi con UAC, la finestra CMD può indirizzare correttamente il contenuto. Portandoti a pensare di avere elevazione quando non lo fai.
Tyler Szabo,

5

Di seguito tenta di creare un file nella directory di Windows. Se succede, lo rimuoverà.

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

Si noti che 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 è un GUID che è stato generato oggi e si presume che sia improbabile in conflitto con un nome file esistente.


+1 perché la risposta accettata ha causato l'apertura infinita di molte finestre di comando quando lo script è stato chiamato dalla mia applicazione.
Bollettino,

was generated today and it is assumed to be improbable to conflict with an existing filename.tranne se due persone usano questo codice
Vitim.us

4

Il whoami / gruppi non funziona in un caso. Se il controllo dell'account utente è stato completamente disattivato (non solo la notifica è stata disattivata) e si è avviato da un prompt di amministratore, quindi emesso:

runas /trustlevel:0x20000 cmd

eseguirai non elevato, ma emettendo:

whoami /groups

dirò che sei elevato. È sbagliato. Ecco perché è sbagliato:

Durante l'esecuzione in questo stato, se IsUserAdmin ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa376389(v=vs.85).aspx ) restituisce FALSE e UAC è completamente disabilitato e GetTokenInformation restituisce TokenElevationTypeDefault ( http://blogs.msdn.com/b/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a-securable-object-in-windows-vista.aspx ), quindi il processo non funziona in modo elevato, ma whoami /groupsafferma che lo è.

davvero, il modo migliore per farlo da un file batch è:

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

Dovresti fare net sessiondue volte perché se qualcuno ha fatto una atmano prima, otterrai le informazioni sbagliate.


whoami /groupsnon fornisce informazioni errate. È solo che runas /trustlevelti mette in un posto inaspettato: in esecuzione senza privilegi di amministratore ma con un alto livello di integrità. Puoi confermarlo con Process Explorer. (Potrebbe trattarsi di un bug inrunas ma non di un bug whoami.)
Harry Johnston,

Harry, ho sentito quello che stai dicendo, ma puoi approfondire questo? Non capisco il commento in meritorunas /trustlevel Quando sei un amministratore locale e UAC è disabilitato, l'emissione del comando runas da un prompt di amministratore ti metterà in un contesto di sicurezza "utente di base". In tale modalità, non è possibile eseguire operazioni di amministrazione. Prova "net session", o fsutil "o qualsiasi altra utility che richiede l'accesso come amministratore. Tuttavia," whoami / gruppi "ti dice che sei elevato. Altrimenti. Il fatto che chiamare GetTokenInformation restituisca" TokenElevationTypeDefault "indica che.
zumalifeguard,

Non sono sicuro di aver capito cosa intendi con "whoami / group ti dice che sei elevato"; non emette letteralmente la stringa "sei elevato", vero? Quale parte dell'output di whoami / gruppi stai guardando?
Harry Johnston,

Harry, vedo che non ero chiaro. Primo sfondo, quindi io e te siamo sulla stessa pagina. lì una manciata di trucchi che le persone usano per determinare se un prompt dei comandi è attualmente in esecuzione in uno stato con accesso come amministratore. Le tecniche più comuni sono l'uso del comando incorporato come fsutil, at, whoami e "net session". L'uso di "at" è obsoleto. Se cerchi questa pagina, vedrai degli esempi usando fsutil, whoami e "net session". Vedi qui per ulteriori esempi di whoami: stackoverflow.com/questions/7985755/...
zumalifeguard

Inoltre, l'uso della frase "running elevato" non è esattamente corretto. Quello che io (e altri) dovrei dire "in esecuzione con privilegio di amministratore". Se UAC è disattivato, è semplicemente in esecuzione mentre si accede come amministratore locale ma non si abbassa esplicitamente il livello di affidabilità come con le runas. Quando UAC è abilitato, ciò significa che l'utente è in esecuzione in un prompt elevato.
zumalifeguard,

2
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)

2
Il problema qui è che si controlla se l'utente dispone dei diritti di amministratore. Ma lo script batch potrebbe essere eseguito senza diritti di amministratore.
Tanascius

2
Plus whoaminon è supportato in Windows XP.
mythofechelon,

Anche whoami / groups ha un caso limite in cui si ottengono informazioni errate. Vedere stackoverflow.com/questions/4051883/...
zumalifeguard

2

Alcuni server disabilitano i servizi richiesti dal comando "net session". Questo porta alla verifica dell'amministratore dicendo sempre che non hai i diritti di amministratore quando puoi.


2

Modifica: copyitright ha sottolineato che ciò non è affidabile. L'approvazione dell'accesso in lettura con UAC consentirà la riuscita della directory. Ho un po 'più di script per offrire un'altra possibilità, ma non è di sola lettura.

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

Vecchia risposta di seguito

Attenzione: inaffidabile


Sulla base di numerose altre buone risposte qui e dei punti sollevati da and31415 ho scoperto di essere un fan di quanto segue:

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

Poche dipendenze e veloce.


1
Questa soluzione funzionava per me, ma dal momento che ho esplorato la posizione e ho avuto accesso alla cartella per cui hai bisogno di privilegi elevati, il codice ERRORLEVEL / exit è sempre 0 ora, nonostante esegua lo script come utente standard.
script'n'code

1

Nota: il controllo con cacls per \ system32 \ config \ system non funzionerà SEMPRE in WOW64, (ad esempio da% systemroot% \ syswow64 \ cmd.exe / 32 bit Total Commander), pertanto gli script eseguiti nella shell a 32 bit nel sistema a 64 bit continueranno a funzionare per sempre ... Meglio sarebbe verificare i diritti sulla directory Prefetch:

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

Win XP a 7 testato, tuttavia non riesce in WinPE come in Windows 7 install.wim non esiste tale dir né cacls.exe

Anche in winPE E wow64 fallisce il controllo con openfiles.exe:

OPENFILES > nul

In Windows 7 verrà visualizzato l'errore "1" con le informazioni che "Il sistema di destinazione deve essere un sistema operativo a 32 bit"

Entrambi i controlli probabilmente falliranno anche nella console di ripristino.

Ciò che funziona in Windows XP - 8 32/64 bit, in WOW64 e in WinPE sono: test di creazione di dir (se l'amministratore non ha bombardato la directory di Windows con autorizzazioni per tutti ...) e

net session

e

reg add HKLM /F

controlli.

Anche un'altra nota in alcuni Windows XP (e probabilmente anche in altre versioni, a seconda del ritocco dell'amministratore) a seconda delle voci di registro che chiamano direttamente bat / cmd dallo script .vbs falliranno con le informazioni che i file bat / cmd non sono associati a nulla ...

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

Chiamare cmd.exe con il parametro del file bat / cmd invece funziona OK:

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

1

Decine di risposte letteralmente in questo e domande collegate e altrove in SE, che sono tutte carenti in questo modo o nell'altro, hanno chiaramente dimostrato che Windows non fornisce un'utilità di console integrata affidabile. Quindi, è tempo di distribuire il tuo.

Il seguente codice C, basato su Rileva se il programma è in esecuzione con diritti di amministratore completi , funziona in Win2k + 1 , ovunque e in tutti i casi (UAC, domini, gruppi transitivi ...) - perché fa lo stesso sistema stesso quando controlla le autorizzazioni. Segnala il risultato sia con un messaggio (che può essere messo a tacere con un interruttore) sia con un codice di uscita.

Deve essere compilato solo una volta, quindi puoi semplicemente copiarlo .exeovunque - dipende solo kernel32.dlle advapi32.dll(ho caricato una copia ).

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 MSDN afferma che le API sono XP + ma questo è falso. CheckTokenMembership è 2k + e l'altro è ancora più vecchio . L'ultimo collegamento contiene anche un modo molto più complicato che funzionerebbe anche in NT.


1

Qualcuno di 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"
    }
}

1

Eccone un altro da aggiungere all'elenco ;-)

(tenta di creare un file nella posizione di 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

)

Il MODE CONreinizializza lo schermo e surpresses qualsiasi testo / errori quando non avere il permesso di scrivere nel percorso di sistema.


0

Alternativa: utilizzare un'utilità esterna progettata a tale scopo, ad esempio IsAdmin.exe (freeware senza restrizioni).

Codici di uscita:

0 - Utente corrente non membro del gruppo Amministratori

1 - Membro utente corrente di amministratori e in esecuzione elevato

2 - Utente corrente membro degli amministratori, ma non in esecuzione elevato


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

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

Spiegherò il codice riga per riga:

@echo off

Gli utenti saranno infastiditi da molte più di 1 righe senza questo.

:start

Punto in cui inizia il programma.

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

Imposta il nome file della directory da creare.

md \windows\%randname% 2>nul

Crea la directory su <DL>:\Windows(sostituisci <DL> con lettera di unità).

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

Se la variabile d'ambiente ERRORLEVEL è zero, echo messaggio di successo.
Vai alla fine (non procedere oltre).

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

Se ERRORLEVEL è uno, invia un messaggio di errore e vai alla fine.

goto start

Nel caso in cui il nome file esista già, ricreare la cartella (altrimenti il goto endcomando non consente l'esecuzione).

:end

Specifica il punto finale

rd \windows\%randname% 2>nul

Rimuovi la directory creata.

pause >nul

Metti in pausa in modo che l'utente possa vedere il messaggio.

Nota : i >nule 2>nulstanno filtrando l'output di questi comandi.


Sì, so che quando accedi come utente amministratore (non un utente con tipo di account admin) sarai sempre elevato ma non è un bug!
EKons

0

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


Questo sembra essere sbagliato, mostra se un utente ha i diritti di amministratore, ma questo non è correlato alla domanda se l'attuale cmd.exe viene eseguito con diritti di amministratore
jeb

no, mostra se cmd.exe corrente ha accesso amministrativo al database degli utenti o meno, quindi funziona anche nel caso in cui "sessione di rete" non lo sia. in alternativa, "net config> nul 2> & 1 && echo admin || echo not admin" fa il lavoro. Entrambe le costruzioni sono state testate correttamente su Windows XP con account guest, power user e administarative con LanmanServer arrestato (livello di errore 2 per cmd.exe eseguito su guest e power user, livello di errore 0 per cmd.exe con diritti di amministratore). Funzionerà in Vista e successivamente con i suddetti problemi di controllo dell'account utente - non lo so, quindi sarebbe bello se qualcuno potesse testarlo.
eretico

2
Ho provato con due finestre cmd (win7x64), iniziato con e senza diritti di amministratore. In entrambi i casi mostraadmin
jeb l'

0

Penso che il modo più semplice sia provare a cambiare la data di sistema (che richiede diritti di amministratore):

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

Se la %date%variabile può includere il giorno della settimana, basta ottenere la data dall'ultima parte del 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 ...

3
Non posso fare a meno di votare un "consiglio" così distruttivo.
Ivan_pozdeev il

2
Anche tralasciando il fatto che cambiare il tempo di sistema senza una buona ragione è spararsi ai piedi (tutti i tipi di strani effetti sul software) - se stai usando l'ora corrente, stai ancora inclinando quando il comando viene eseguito.
Ivan_pozdeev,

2
@ivan_pozdeev: Forse potresti descrivere solo uno degli "strani effetti sul software" che possono accadere quando la data viene cambiata alla stessa data in una sessione cmd.exe ...
Aacini,


@ivan_pozdeev: nessuno dei tuoi link è collegato in remoto al mio metodo. Penso che tu abbia frainteso la mia soluzione. Questo metodo può avere solo uno dei due risultati possibili: nulla viene modificato (se l'utente non ha diritti di amministratore) o la DATA viene cambiata NELLO STESSO VALORE (se l'utente dispone dei diritti di amministratore). Il mio metodo NON CAMBIA IL TEMPO! Ti invito a rileggere la mia risposta e a spiegare in :(
parole povere

0

Ho trovato un utente che può usare net session anche se non è amministratore. Non ho studiato il perché. La mia soluzione è verificare se l'utente può creare una cartella nella cartella Windows.

Ecco il mio codice:

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

0

Una raccolta dei quattro metodi apparentemente più compatibili da questa pagina. Il primo è davvero abbastanza geniale. Testato da XP in su. Confuso, tuttavia, non esiste un comando standard disponibile per verificare i diritti di amministratore. Immagino si stiano semplicemente concentrando su PowerShell ora, il che è davvero inutile per la maggior parte del mio lavoro.

Ho chiamato il batch 'exit-if-not-admin.cmd' che può essere chiamato da altri batch per assicurarsi che non continuino l'esecuzione se non vengono dati i diritti di amministratore richiesti.

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

-1

Ecco il mio valore di 2 penny:

Avevo bisogno di un batch per essere eseguito all'interno di un ambiente di dominio durante il processo di accesso dell'utente, all'interno di un ambiente "ambiente di lavoro", vedendo gli utenti aderire a una politica di "blocco" e vista ristretta (distribuita principalmente tramite set di oggetti Criteri di gruppo).

Un set di oggetti Criteri di gruppo di dominio viene applicato prima di uno script di accesso collegato a un utente AD La creazione di uno script di accesso di oggetti Criteri di gruppo era troppo matura poiché il "nuovo" profilo degli utenti non era stato creato / caricato / o pronto in tempo per applicare un "rimuovi e / o Aggiungi "barra delle applicazioni e voci del menu Start vbscript + aggiungi alcuni file locali.

ad esempio: l'ambiente del profilo 'utente predefinito' proposto richiede un collegamento ".URL '(.lnk) inserito in"% ProgramData% \ Microsoft \ Windows \ Menu Start \ Programmi * MyNewOWA.url * "e" C: Posizioni \ Users \ Public \ Desktop \ * MyNewOWA.url * ", tra gli altri elementi

Gli utenti dispongono di più macchine all'interno del dominio, dove solo questi PC 'workroom' impostati richiedono questi criteri.

Queste cartelle richiedono la modifica dei diritti di "Amministratore" e sebbene "Utente di dominio" faccia parte del gruppo "Amministratore" locale, l'UAC è stata la sfida successiva.

Ho trovato vari adattamenti e si sono uniti qui. Ho alcuni utenti con dispositivi BYOD che hanno richiesto altri file con problemi di perm. Non ho testato su XP (un sistema operativo un po 'troppo vecchio), ma il codice è presente, mi piacerebbe rispondere.

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

I PC di dominio dovrebbero essere governati il ​​più possibile dai set di oggetti Criteri di gruppo. Le macchine del gruppo di lavoro / standalone possono essere governate da questo script.

Ricorda, un prompt del controllo dell'account utente verrà visualizzato almeno una volta con un PC del gruppo di lavoro BYOD (non appena è necessario il primo passaggio a "permanenti dell'amministratore"), ma poiché la politica di sicurezza locale viene modificata per l'uso dell'amministratore da questo punto in poi, il i pop-up scompariranno.

Un PC di dominio dovrebbe avere il set di criteri "ConsentPromptBehaviorAdmin" dell'oggetto Criteri di gruppo all'interno del criterio "Blocco" già "creato", come spiegato nella sezione "RIFERIMENTI" dello script.

Di nuovo, esegui l'importazione secedit.exe del file '.inf' predefinito se rimani bloccato sull'intero dibattito "A UAC o Non a UAC" :-).

btw: @boileau Controlla il tuo fallimento su:

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

Eseguendo solo "% SYSTEMROOT% \ system32 \ cacls.exe" o "% SYSTEMROOT% \ system32 \ config \ system" o entrambi dal prompt dei comandi, elevato o meno, controllare il risultato su tutta la linea.


-2

Un altro modo per farlo.

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

Che cosa dovrebbe essere quel link? Contrassegnato come spam a causa del collegamento.
mmgross

Controllare questa risposta un codice che controlli e richiede automaticamente: stackoverflow.com/a/30590134/4932683
cyberponk
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.