[windows] Script batch: come verificare i diritti di amministratore



Answers

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 alcuni documenti 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 e 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 (incluse versioni a 32/64 bit).

EDIT: 8/28/2012 Aggiornato per supportare Windows 8. @BenHooper ha sottolineato questo nella sua risposta qui sotto. Per favore, invertire la sua risposta.

Question

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

So come farlo chiamare se stesso con runas ma non come controllare i diritti di amministratore. Le uniche soluzioni che ho visto sono rozzi lavori di hacking o usare programmi esterni. Beh, in realtà non mi interessa se si tratta di un lavoro di hacking fintanto che funziona su Windows XP e successivi.




I found a user that can use net session even though they are not admin. I didn't look into why. My workaround is to test if the user can make a folder in the windows folder.

Here is my code:

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



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




Modifica: copyitright ha sottolineato che questo non è affidabile. Approvare l'accesso in lettura con UAC consentirà a dir di avere successo. 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 qui sotto

Attenzione: inaffidabile

Sulla base di una serie di altre buone risposte qui e punti sollevati da e31415 ho scoperto che io sono un fan di quanto segue:

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

Poche dipendenze e veloci.




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



Another way to do this.

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



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



Ho due modi per controllare l'accesso privilegiato, entrambi sono abbastanza affidabili e molto portabili su 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 incorporati come la sessione di rete che può essere disabilitata dai criteri di amministrazione / di 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 è così inoffensivo come usare fsutils o creare una cartella vuota, è inamovibile ma può causare un errore catastrofico se qualcosa va storto. In questo scenario è possibile controllare i privilegi del registro.

Per questo puoi provare a creare una chiave su HKEY_LOCAL_MACHINE usando le autorizzazioni predefinite che otterresti Accesso negato e ERRORLEVEL == 1 , ma se esegui come amministratore, verrà stampato "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 esiste da molto tempo.

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

* Funziona su XP e versioni successive

Esempio di lavoro

Uno script che cancella la cartella temporanea

@echo off
:main
    echo.
    echo. Clear Temp Files script
    echo.

    call :requirePrivilegies

    rem Do something that require privilegies

    echo. 
    del %temp%\*.*
    echo. End!

    pause>nul
goto :eof


:requirePrivilegies
    set guid=%random%%random%-%random%-%random%-%random%-%random%%random%%random%
    mkdir %WINDIR%\%guid%>nul 2>&1
    rmdir %WINDIR%\%guid%>nul 2>&1
    IF NOT %ERRORLEVEL%==0 (
        echo ########## ERROR: ADMINISTRATOR PRIVILEGES REQUIRED ###########
        echo # This script must be run as administrator to work properly!  #
        echo # Right click on the script and select "Run As Administrator" #
        echo ###############################################################
        pause>nul
        exit
    )
goto :eof




Here is another one to add to the list ;-)

(attempt a file creation in system location)

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

)

The MODE CON reinitializes the screen and surpresses any text/errors when not having the permission to write to the system location.




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



Literally dozens of answers in this and linked questions and elsewhere at SE, all of which are deficient in this way or another, have clearly shown that Windows doesn't provide a reliable built-in console utility. So, it's time to roll out your own.

The following C code, based on Detect if program is running with full administrator rights , works in Win2k+ 1 , anywhere and in all cases (UAC, domains, transitive groups...) - because it does the same as the system itself when it checks permissions. It signals of the result both with a message (that can be silenced with a switch) and exit code.

It only needs to be compiled once, then you can just copy the .exe everywhere - it only depends on kernel32.dll and advapi32.dll (I've uploaded a copy ).

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 claims the APIs are XP+ but this is false. CheckTokenMembership is 2k+ and the other one is even older . The last link also contains a much more complicated way that would work even in NT.




Il modo più pulito per verificare i privilegi di amministratore usando 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 builtin CMD.exe, quindi dovrebbe essere molto veloce. Verifica inoltre le effettive funzionalità del processo anziché controllare i SID o le appartenenze ai gruppi, quindi viene verificata l'autorizzazione effettiva . E questo funziona fin da Windows 2003 e XP. Processi utente normali o processi non elevati non riescono il probe di directory, dove i processi di amministrazione o elevato hanno esito positivo.




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



Related