it-swarm.com.ru

Пакетный скрипт: как проверить права администратора

Как проверить, имеет ли текущий пакетный скрипт права администратора?

Я знаю, как заставить его вызывать себя с помощью runas, но не знаю, как проверить права администратора. Единственные решения, которые я видел, - это грубые хакерские задания или использование внешних программ. Ну, на самом деле мне все равно, если это хакерская работа, если она работает на Windows XP и ​​новее.

249
flacs

Вопросы

blak3r / Rushyo решение отлично работает для всего, кроме Windows 8. Запуск AT в Windows 8 приводит к:

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

The request is not supported.

(см. скриншот № 1) и вернет %errorLevel%1.

Исследование

Итак, я пошел искать другие команды, которые требуют повышенных разрешений. rationallyparanoid.com имел список из нескольких, поэтому я выполнил каждую команду на двух противоположных крайностях текущих операционных систем Windows (XP и 8) в надежде найти команду, которой будет отказано в доступе на обоих ОС при запуске со стандартными разрешениями.

В конце концов я нашел один - NET SESSION. A true , чистое, универсальное решение, которое не включает:

  • создание или взаимодействие с данными в безопасных местах
  • анализ данных, возвращаемых из циклов FOR
  • поиск строк для "Администратор"
  • используя AT (Windows 8 несовместимо) или WHOAMI (Windows XP несовместимо).

Каждый из них имеет свои собственные проблемы безопасности, удобства использования и переносимости.

Тестирование

Я независимо подтвердил, что это работает на:

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

(см. скриншот № 2)

Реализация/Использование

Итак, чтобы использовать это решение, просто сделайте что-то вроде этого:

@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

Доступно здесь, если вы ленивы: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

Объяснение

NET SESSION - это стандартная команда, используемая для "управлять соединениями с сервером. Используется без параметров, [it] отображает информацию обо всех сеансах с локальным компьютером."

Итак, вот основной процесс моей реализации:

  1. @echo off
    • Отключить отображение команд
  2. goto check_Permissions
    • Перейти к блоку кода :check_Permissions
  3. net session >nul 2>&1
    • Команда запуска
    • Скрыть визуальный вывод команды с помощью
      1. Перенаправление стандартного потока вывода (числовой дескриптор 1/STDOUT) на nul
      2. Перенаправление стандартного потока вывода ошибок (числовой дескриптор 2/STDERR) в тот же пункт назначения, что и числовой дескриптор 1
  4. if %errorLevel% == 0
    • Если значение кода выхода (%errorLevel%) равно 0, то это означает, что ошибок не произошло и, следовательно, предыдущая команда была успешно выполнена
  5. else
    • Если значение кода выхода (%errorLevel%) не равно 0, то это означает, что произошли ошибки и, следовательно, предыдущая команда выполнила неудачно
  6. Код между соответствующими круглыми скобками будет выполняться в зависимости от того, каким критериям соответствует

Скриншоты

Windows 8 AT%errorLevel% :

[imgur]

NET SESSION в Windows XP x86 - Windows 8 x64 :

[imgur]

Спасибо, @Tilka, за изменение принятого ответа на мой. :)

419
mythofechelon

Решение Андерса сработало для меня, но я не был уверен, как инвертировать его, чтобы получить противоположное (когда вы не были администратором).

Вот мое решение. У него есть два случая IF и ELSE, а также несколько примеров ascii, чтобы люди действительно читали его. :)

Минимальная версия

Rushyo разместил это решение здесь: Как определить, работает ли CMD от имени администратора или имеет повышенные привилегии?

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

Версия, которая добавляет сообщения об ошибках, паузы и выходы

@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

Работает на WinXP -> Win8 (включая 32/64 битные версии).

РЕДАКТИРОВАТЬ: 28.08.2012 Обновлено для поддержки Windows 8. @BenHooper указал на это в своем ответе ниже. Пожалуйста, подтвердите его ответ.

74
blak3r

Больше вопросов

Как указывает @Lectrode, если вы попытаетесь выполнить команду net session, когда служба сервера остановлена, вы получите следующее сообщение об ошибке:

The Server service is not started.

More help is available by typing NET HELPMSG 2114

В этом случае переменная %errorLevel% будет установлена ​​в 2.

Примечание Служба сервера не запускается в безопасном режиме (с сетью или без нее).

Ищу альтернативу

Что-то, что:

  • может запускаться из коробки в Windows XP и ​​более поздних версиях (32 и 64-разрядная версия);
  • не касается реестра или каких-либо системных файлов/папок;
  • работает независимо от локали системы;
  • дает правильные результаты даже в безопасном режиме.

Поэтому я загрузил виртуальную машину Vanilla Windows XP и ​​начал просматривать список приложений в папке C:\Windows\System32, пытаясь получить некоторые идеи. После проб и ошибок это грязный (каламбур) подход, который я придумал:

fsutil dirty query %systemdrive% >nul

Для выполнения команды fsutil dirty требуются права администратора, в противном случае она не будет выполнена. %systemdrive% - это переменная среды , которая возвращает букву диска, на котором установлена ​​операционная система. Вывод перенаправляется на nul, поэтому игнорируется. Переменная %errorlevel% будет установлена ​​в 0 только после успешного выполнения.

Вот что говорится в документации:

Fsutil dirty

Запрашивает или устанавливает грязный бит тома. Когда установлен грязный бит тома, autochk автоматически проверяет громкость на наличие ошибок при следующей перезагрузке компьютера.

Синтаксис

fsutil dirty {query | set} <VolumePath>

Параметры

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.

Замечания

Грязный бит тома указывает, что файловая система может находиться в несогласованном состоянии. Грязный бит может быть установлен, потому что:

  • Объем онлайн и имеет выдающиеся изменения.
  • Изменения были внесены в том, и компьютер был выключен, прежде чем изменения были зафиксированы на диске.
  • Повреждение было обнаружено на томе.

Если грязный бит установлен при перезагрузке компьютера, chkdsk запускается, чтобы проверить целостность файловой системы и попытаться исправить любые проблемы с томом.

Примеры

Чтобы запросить грязный бит на диске C, введите:

fsutil dirty query C:

Дальнейшие исследования

Хотя вышеприведенное решение работает с Windows XP и ​​далее, стоит добавить, что Windows 2000 и Windows PE (предустановленная среда) не поставляются с fsutil.exe, поэтому нам придется прибегнуть к другому.

Во время моих предыдущих тестов я заметил, что выполнение команды sfc без каких-либо параметров приведет к:

  • ошибка, если у вас недостаточно прав;
  • список доступных параметров и их использование.

То есть: без параметров, без партии . Идея в том, что мы можем проанализировать вывод и проверить, не получили ли мы что-либо, кроме ошибки

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

Вывод ошибки сначала перенаправляется на стандартный вывод, который затем передается в команду find. На данный момент мы должны искать параметр only , который поддерживается во всех версиях Windows начиная с Windows 2000: /SCANNOW. Поиск нечувствителен к регистру, а вывод отбрасывается путем перенаправления его на nul.

Вот выдержка из документации:

SFC

Сканирует и проверяет целостность всех защищенных системных файлов и заменяет неправильные версии правильными версиями.

Замечания

Вы должны войти в систему как член группы администраторов, чтобы запустить sfc.exe .

Пример использования

Вот несколько примеров вставки и запуска:

Windows XP и ​​более поздние версии

@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

Относится к

  • Windows 2000
  • Windows XP
  • Виндоус виста
  • Windows 7
  • Windows 8
  • Windows 8.1
    ---
  • Windows PE
37
and31415

еще один способ

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

Команда fltmc доступна в каждой системе Windows начиная с XP, поэтому она должна быть довольно переносимой.


Еще одно решение, протестированное на XP, 8.1, 7 (к сожалению, не работает на всех машинах win10 - см. Комментарии.) - есть одна конкретная переменная =::, которая отображается только в том случае, если консольный сеанс не имеет прав администратора. Поскольку это не так просто создать переменную, содержащую в своем имени =, это сравнительно надежный способ проверки прав администратора (и довольно быстрый, поскольку он не вызывает внешние исполняемые файлы)

setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! ( 
   echo has NOT admin permissions
) else (
   echo has admin permissions
)
17
npocmaka
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)
17
Anders

альтернативное решение:

@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
14
Lucretius

Не только проверять, но и автоматически получать права администратора
aka Automatic UAC for Win 7/8/8.1 и т. д.
: Ниже приведен действительно интересный вариант с еще одной функцией: этот пакетный фрагмент не только проверяет права администратора, но и автоматически их получает! (и тестирует раньше, если живет на ОС с поддержкой UAC.)

С этим трюком вам больше не нужно кликать правой кнопкой мыши на вашем командном файле "с правами администратора". Если вы забыли, чтобы запустить его с повышенными правами, UAC появится автоматически! Более того, сначала тестируется, если ОС требует/предоставляет UAC, поэтому она ведет себя правильно, например, для Win 2000/XP до 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
)

Фрагмент объединяет несколько хороших шаблонов пакетов, особенно (1) тест администратора в этой теме, выполненный Беном Хупером, и (2) активация UAC, прочитанная на BatchGotAdmin и процитированная на сайте пакетной обработки robvanderwoude (уважение). (3) Для идентификации ОС по "VER | FINDSTR pattern" я просто не нахожу ссылку.)

(Что касается некоторых очень незначительных ограничений, когда "NET SESSION" не работает, как упомянуто в другом ответе, не стесняйтесь вставлять другую из этих команд. Для меня работа в безопасном режиме Windows или специальные стандартные службы не работают, и это не является важным вариантом использования) - для некоторых администраторов, возможно, они есть.)

13
Philm

У меня есть два способа проверки привилегированного доступа, оба довольно надежны и очень переносимы практически во всех версиях Windows.

1. Метод

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

Это один из самых надежных методов из-за его простоты, и поведение этой очень примитивной команды вряд ли изменится. Это не относится к другим встроенным инструментам CLI, таким как net session, которые могут быть отключены администратором или сетевыми политиками, или к командам, подобным fsutils, которые изменили вывод в Windows 10 ,.

* Работает с XP и ​​более поздними версиями

2. Метод

REG ADD HKLM /F>nul 2>&1

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

Иногда вам не нравится идея трогать диск пользователя, даже если он настолько же безобиден, как использование fsutils или создание пустой папки, если он недоказуем, но может привести к катастрофической ошибке, если что-то пойдет не так. В этом случае вы можете просто проверить реестр на наличие привилегий.

Для этого вы можете попытаться создать ключ для HKEY_LOCAL_MACHINE с использованием разрешений по умолчанию, которые вы получите Доступ запрещен и ERRORLEVEL == 1, но если вы запустите от имени администратора, он напечатает "команда выполнена успешно" и ERRORLEVEL == 0. Поскольку ключ уже существует, он не влияет на реестр. Это, вероятно, самый быстрый способ, и REG существует в течение длительного времени.

* Это не доступно в pre NT (Win 9X).

* Работает с XP и ​​более поздними версиями


Рабочий пример

Скрипт, который очищает временную папку

@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
11
Vitim.us

Я обнаружил, что самый простой способ проверки прав администратора с использованием сценария CMD выглядит примерно так:

@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

Этот метод использует только встроенные CMD.exe, поэтому он должен быть очень быстрым. Он также проверяет действительные возможности процесса, а не проверяет SID или членство в группах, поэтому проверяется разрешение эффективное. И это работает еще в Windows 2003 и XP. Обычные пользовательские процессы или процессы без прав доступа терпят неудачу при проверке каталога, где успешно выполняются процессы администратора или повышенные.

6
William

Следующее пытается создать файл в каталоге Windows. Если это удастся, это удалит это.

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

Обратите внимание, что 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 - это GUID, созданный сегодня, и предполагается, что он не может конфликтовать с существующим именем файла.

5
Benoit

В пакетном скрипте Elevate.cmd (см. эту ссылку ), в который я написал получить права администратора , я сделал это следующим образом:

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

Это протестировано для Windows 7, 8, 8.1, 10 и даже Windows XP и не требует каких-либо ресурсов, таких как специальный каталог, файл или раздел реестра. ,.

5
Matt

Whoami/группы не работает ни в одном случае. Если у вас полностью отключено UAC (не только уведомление отключено), и вы запустили из командной строки администратора, а затем выдали:

runas /trustlevel:0x20000 cmd

вы будете работать без повышенных прав, но с выдачей:

whoami /groups

скажу, что ты возвышен Это не правильно. Вот почему это неправильно:

При работе в этом состоянии, если IsUserAdmin ( https://msdn.Microsoft.com/en-us/library/windows/desktop/aa376389 (v = vs.85) .aspx ) возвращает FALSE и UAC полностью отключен, и GetTokenInformation возвращает TokenElevationTypeDefault ( http://blogs.msdn.com/b/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a- securable-object-in-windows-Vista.aspx ) тогда процесс не работает с повышенными правами, но whoami /groups утверждает, что это так.

действительно, лучший способ сделать это из командного файла:

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

Вы должны сделать net session дважды, потому что если кто-то передал at, вы получите неверную информацию.

4
zumalifeguard

Некоторые серверы отключают службы, которые требуются команде "net session". В результате проверки администратора всегда говорят, что у вас нет прав администратора, если у вас есть права.

2
Dan

Правка: авторское право указало, что это ненадежно. Утверждение доступа для чтения с помощью UAC позволит каталогу успешно работать. У меня есть немного больше сценария, чтобы предложить другую возможность, но он не только для чтения.

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

Старый ответ ниже

Предупреждение: ненадежно


Основываясь на ряде других хороших ответов здесь и вопросах, поднятых and31415, я обнаружил, что я фанат следующего:

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

Мало зависимости и быстро.

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

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
Ostati

Примечание. Проверка с помощью cacls для\system32\config\system ВСЕГДА завершится неудачей в WOW64 (например, из% systemroot%\syswow64\cmd.exe/32-битного Total Commander), поэтому сценарии, которые выполняются в 32-битной оболочке в 64-битной системе, будут зациклены навсегда ... Лучше бы проверить права на каталог Prefetch:

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

Win XP до 7 протестировано, однако в WinPE происходит сбой, так как в Windows 7 install.wim нет ни dir, ни cacls.exe

Также в winPE AND wow64 не удается проверить с помощью openfiles.exe:

OPENFILES > nul

В Windows 7 он будет иметь уровень ошибки "1" с информацией о том, что "Целевая система должна быть 32-битной операционной системой"

Обе проверки, вероятно, также не пройдут в консоли восстановления.

Что работает в Windows XP - 8 32/64 бит, в WOW64 и в WinPE: тесты создания dir (ЕСЛИ администратор не ковертил взломанный каталог Windows с разрешениями для всех). ..) а также

net session

а также

reg add HKLM /F

чеки.

Кроме того, еще одно примечание в некоторых окнах XP (и, возможно, в других версиях, в зависимости от действий администратора), в зависимости от записей реестра, непосредственно вызывающих bat/cmd из сценария .vbs, завершится с информацией о том, что файлы bat/cmd не являются связано с чем-либо ...

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

С другой стороны, вызов cmd.exe с параметром файла bat/cmd работает нормально:

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
user2902818

Вот еще один, чтобы добавить в список ;-)

(попытка создания файла в системном расположении)

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

)

Код MODE CON повторно инициализирует экран и перекрывает любой текст/ошибки, если у него нет разрешения на запись в системное местоположение.

1
script'n'code

Я думаю, что самый простой способ - попытаться изменить системную дату (для этого требуются права администратора):

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

Если переменная %date% может включать день недели, просто получите дату из последней части команды DATE:

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 ...
0
Aacini
@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
cmd

Net User %username% >nul 2>&1 && echo admin || echo not admin

0
heretic
@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

Я объясню код построчно:

@echo off

Пользователи будут раздражены более чем 1 строк без этого.

:start

Точка, где начинается программа.

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

Установите имя файла каталога, который будет создан.

md \windows\%randname% 2>nul

Создает каталог для <DL>:\Windows (замените <DL> буквой диска).

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

Если переменная окружения ERRORLEVEL равна нулю, то выводится сообщение об успехе.
Идите до конца (не продолжайте дальше).

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

Если ERRORLEVEL равен единице, выведите сообщение о сбое и перейдите к концу.

goto start

Если имя файла уже существует, заново создайте папку (в противном случае команда goto end не позволит запустить ее).

:end

Укажите конечную точку

rd \windows\%randname% 2>nul

Удалить созданный каталог.

pause >nul

Пауза, чтобы пользователь мог видеть сообщение.

Примечание: >nul и 2>nul фильтруют выходные данные этих команд.

0
EKons

Альтернатива: используйте внешнюю утилиту, разработанную для этой цели, например, IsAdmin.exe (неограниченное бесплатное программное обеспечение).

Коды Результата:

0 - текущий пользователь не является членом группы администраторов

1 - текущий пользователь член Администраторов и работает с повышенными правами

2 - текущий пользователь-администратор, но не работает с повышенными правами

0
Bill_Stewart

Я нашел пользователя, который может использовать net session, даже если он не является администратором. Я не изучал почему. Мой обходной путь - проверить, может ли пользователь создать папку в папке Windows.

Вот мой код:

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