20

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

4 ответа4

15

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

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

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

@echo off

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

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)
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)


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

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

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 или другой подобной группе дано разрешение на чтение в systemmprofile. Разумеется, это нестандартная конфигурация, отличная от тех, что установлены на компьютерах, настроенных как контроллеры домена Windows, которые дают права NT / AUTHORITY\Authenticated Users на чтение / выполнение для системной профили.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .