Пакетный скрипт: как проверить права администратора - PullRequest
252 голосов
/ 29 октября 2010

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

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

Ответы [ 27 ]

5 голосов
/ 29 октября 2010

Следующее пытается создать файл в каталоге 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, созданный сегодня, и предполагается, что он вряд ли конфликтует с существующим именем файла.

4 голосов
/ 18 июня 2015

Whoami / groups не работает ни в одном случае. Если у вас полностью отключено 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 перед раздачей, вы получите неверную информацию.

2 голосов
/ 31 декабря 2016

Редактировать: авторское право указало, что это ненадежно.Утверждение доступа для чтения с помощью 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

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

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


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

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

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

2 голосов
/ 15 января 2012
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)
2 голосов
/ 14 марта 2013

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

1 голос
/ 23 апреля 2017

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

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

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 голос
/ 26 января 2017

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 голос
/ 05 декабря 2016

Буквально десятки ответов на этот и связанные вопросы и в других местах в SE, каждый из которых так или иначе несовершенен, ясно показали, что Windows не предоставляет надежную встроенную консольную утилиту. Итак, пришло время выкатить свой собственный.

Следующий код C, основанный на Определить, работает ли программа с полными правами администратора , работает в Win2k + 1 , где угодно и во всех случаях (UAC, домены, переходные группы). ..) - потому что она делает то же самое, что и сама система, когда проверяет разрешения. Он сигнализирует о результате как сообщением (которое может быть отключено с помощью переключателя), так и кодом выхода.

Его нужно скомпилировать только один раз, тогда вы можете просто скопировать .exe везде - это зависит только от kernel32.dll и advapi32.dll загрузил копию ).

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 утверждает, что API являются XP +, но это неверно. CheckTokenMembership равен 2k + , а другой еще старше . Последняя ссылка также содержит гораздо более сложный способ, который будет работать даже в NT.

1 голос
/ 21 октября 2013

Примечание: проверка с помощью 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 таких каталогов и каталогов нет..exe

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

OPENFILES > nul

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

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

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

net session

и

reg add HKLM /F

.

Также одинбольше примечания в некоторых Windows 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
0 голосов
/ 30 ноября 2014
@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...
...