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

21

Я ищу написать сценарий, который принимает пользовательский ввод, а затем вносит изменения всей системы. Мне нужно, чтобы это было очень общим, но, проще говоря, мне нужно, чтобы оно проверялось, запускается ли «как администратор». Если это не так, то я хочу показать сообщение, чтобы сказать им это; если это так, я хочу, чтобы это продолжалось. Есть ли постоянный способ проверить это? Я не хочу начинать новый сеанс с правами администратора, я просто хочу определить , запущен ли он как администратор

Канадский Люк ВОССТАНОВИТЬ МОНИКУ
источник
@ G-человек, как это связано?
Канадский Люк ВОССТАНОВИТЕ МОНИКУ
Он также запрашивает команды, которые будут вести себя по-разному, если они запускаются от имени администратора или нет - или, по крайней мере, они получают их в качестве ответов.
G-Man говорит: «Восстановите Монику»

Ответы:

16

Нашел это на переполнении стека :

@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
Alex
источник
По какой причине он был удален?
Канадец Люк ОБНОВЛЯЕТ МОНИКУ
Это работает как для учетной записи администратора, так и для пользователя с ограниченными правами, но выберите «Запуск от имени администратора»
канадец Люк. REINSTATE MONICA
2
Та же самая идея, но с использованием условных операторов исполнения: net session >nul 2>&1 && echo Success || echo Failure. Я считаю этот компактный синтаксис более удобным.
Дбенхем
6
Для этого требуется, чтобы служба «Сервер» работала.
ivan_pozdeev
8

Это проверяет высокий уровень целостности. (работает для Windows Vista и выше)

@echo off

whoami /groups | find "S-1-16-12288" > nul

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)
неделя
источник
1
whoami не поддерживается в xp, мой awnser лучше поддерживает все ОС от windows xp до windows 8
Alex
2
Это работает, если я просто открываю командную строку. Если я запускаю CMD от имени администратора, он все равно показывает, что он запускается как пользователь
Canadian Luke REINSTATE MONICA
2
@Alex Поддержка большего количества ОС великолепна, но этот метод более надежен, поскольку он напрямую запрашивает разрешения, предоставленные текущему сеансу, вместо того, чтобы принимать отсутствие менее надежного отрицательного значения для вывода положительного.
Изи
2
неделю, whoami / groups имеет крайний случай, когда вы получаете неверную информацию. См stackoverflow.com/questions/4051883/...
zumalifeguard
1
@week whoamiотсутствует в XP.
ivan_pozdeev
4

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

Без дальнейших грязных хаков:

Скомпилируйте следующую программу (следуйте инструкциям) или получите предварительно скомпилированную копию . Это нужно сделать только один раз, затем вы можете скопировать его .exeвезде (например, рядом с Sysinternals Suite ).

Код работает в Win2k + 1 , как с UAC, так и с доменом, транзитивными группами и без них, независимо от того, что он использует - потому что он использует тот же способ, что и сама система при проверке разрешений. chkadminвыводит «Admin» или «Non-admin» и устанавливает код выхода равным 0 или 1 соответственно. Выход может быть подавлен с помощью /qпереключателя.

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;
}

Для компиляции запустите в командной строке Windows SDK:

cl /Ox chkadmin.c

(при использовании VS2012 + необходимы дополнительные настройки, если вам необходимо настроить таргетинг на 2k / XP )


Метод предоставлен /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908.

1 MSDN утверждает, что API - это XP +, но это неверно. CheckTokenMembership это 2k +, а другой еще старше .

ivan_pozdeev
источник
3

Я обнаружил, что самый простой способ проверки прав администратора с использованием сценария 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. Обычные пользовательские процессы или процессы без прав доступа терпят неудачу при проверке каталога, где успешно выполняются процессы администратора или повышенные права.

Этот тест не пройден, если группа Everyone, BUILTIN\Usersили другая аналогичная группа получит разрешение на чтение для системного профиля. Разумеется, это нестандартная конфигурация, отличная от той, что установлена ​​на компьютерах, настроенных как контроллеры домена Windows, которые дают права NT / AUTHORITY \ Authenticated Users на чтение / выполнение для системной профили.

Уильям
источник
> Убедитесь, что VERIFY выключен. > проверить /? Сообщает cmd.exe, проверять, правильно ли записаны ваши файлы на диск. ПРОВЕРЬТЕ [ВКЛ | OFF] Введите VERIFY без параметра, чтобы отобразить текущую настройку VERIFY. Как эта команда помогает сценарию?
Канадский Люк ОБНОВЛЯЕТ МОНИКУ
3
@Canadian Luke, Некоторые команды встроенных команд не очищают уровень ошибки, если ошибки нет. Таким образом, люди привыкли очищать уровень ошибок, используя такие хаки, как verify. Я склонен использовать cd .(cd space dot), который устанавливает errorlevel в 0, не производит вывод, а также полезен для создания файла нулевой длины через cd . >somefile. Тем не менее, я протестировал «dir» в Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 и 10. Для всех этих «dir» сбросит уровень ошибки до 0 в случае успеха, если он был установлен до 'реж. Поэтому я не уверен, почему Уильям использовал «проверить», чтобы сначала очистить уровень ошибки.
user3347790