1

Тема: CMD/BAT: наличие административных привилегий у текущего пользователя

Определение наличия административных привилегий у текущего пользователя (использование встроенных средств).

Метод основан на попытке выполнения некоей операции, которая возможна только с административными привилегиями, и оформления этого действа в виде процедуры в пакетном файле (результат помещается в переменную окружения «IsAdmin»).

Вариант 1. Попытка перечисления параметров реестра ветви «HKEY_USERS\S-1-5-19» (учётная запись «LOCAL SERVICE»):

@echo off
setlocal enableextensions enabledelayedexpansion

call :IsAdminTest IsAdmin

echo IsAdmin=%IsAdmin%

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
:IsAdminTest
    setlocal enableextensions enabledelayedexpansion
    
    "%systemroot%\system32\reg.exe" query "HKU\S-1-5-19" 1>nul 2>nul && set IsAdmin=1 || set IsAdmin=0
    
    endlocal & set /a %~1=%IsAdmin%
    exit /b 0
rem ==========================================================================

Вариант 2. Попытка запуска дефрагментатора «defrag.exe»:

@echo off
setlocal enableextensions enabledelayedexpansion

call :IsAdminTest IsAdmin

echo IsAdmin=%IsAdmin%

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
:IsAdminTest
    setlocal enableextensions enabledelayedexpansion
    
    "%systemroot%\system32\defrag.exe" /? 1>nul 2>nul
    
    if "%errorlevel%" equ "2" (
        set IsAdmin=1
    ) else (
        set IsAdmin=0
    )
    
    endlocal & set /a %~1=%IsAdmin%
    exit /b 0
rem ==========================================================================

Отдельное спасибо коллеге wisgest за исправление ошибок.

2

Re: CMD/BAT: наличие административных привилегий у текущего пользователя

Определение наличия административных привилегий у текущего пользователя (использование сторонних средств).

Вариант 3. Использование KiXtart:

Если имеется KiXtart, то можно его задействовать для определения наличия административных привилегий у текущего пользователя (смените приведённый в примере путь к исполняемому файлу «%ProgramFiles%\KiX2010.460\kix32.exe» на Ваш собственный):

@echo off
setlocal enableextensions enabledelayedexpansion

call :IsAdminTest IsAdmin

echo IsAdmin=%IsAdmin%

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
:IsAdminTest
    setlocal enableextensions enabledelayedexpansion
    
    set strTestPath=%temp%\$$$test%random%.tmp
    
    echo.If @PRIV = "ADMIN" Exit 0 Else Exit 1 EndIf 1>"%strTestPath%"
    "%ProgramFiles%\KiX2010.460\kix32.exe" "%strTestPath%" 1>nul 2>nul && set IsAdmin=1 || set IsAdmin=0
    del "%strTestPath%"
    
    endlocal & set /a %~1=%IsAdmin%
    exit /b 0
rem ==========================================================================

Вариант 4. Использование AutoIt:

Если имеется AutoIt, то можно его задействовать для определения наличия административных привилегий у текущего пользователя (смените приведённый в примере путь к исполняемому файлу «%ProgramFiles%\AutoIt3\AutoIt3.exe» на Ваш собственный):

@echo off
setlocal enableextensions enabledelayedexpansion

call :IsAdminTest IsAdmin

echo IsAdmin=%IsAdmin%

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
:IsAdminTest
    setlocal enableextensions enabledelayedexpansion
    
    "%ProgramFiles%\AutoIt3\AutoIt3.exe" /AutoIt3ExecuteLine "If IsAdmin() = 0 Then Exit(1)" 1>nul 2>nul && set IsAdmin=1 || set IsAdmin=0
    
    endlocal & set /a %~1=%IsAdmin%
    exit /b 0
rem ==========================================================================