Перевірте, чи був запущений поточний командний рядок як адміністратор


21

Я хочу написати сценарій, який вимагає введення користувача, а потім вносить зміни в системі. Мені потрібно, щоб це було дуже загальним, але, просто кажучи, вгорі, мені це потрібно, щоб перевірити, чи працює він як "Адміністратор". Якщо ні, то я хочу показати повідомлення, щоб сказати їм це; якщо це так, я хочу, щоб це продовжувалося. Чи існує постійний спосіб перевірити це? Я не хочу запускати новий сеанс як адміністратор, я просто хочу виявити, чи він зараз працює як адміністратор




Він також просить команди, які будуть вести себе інакше, якщо запускатись як адміністратор чи ні - або, принаймні, вони отримують такі відповіді.
G-Man каже: "Відновіть Моніку"

Відповіді:


16

Знайдено це на стеку Overflow :

@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

Яка причина була видалена?
Канадський Люк ВІДНОВЛЕННЯ МОНИЦИ

Це працює, як з облікового запису адміністратора, і коли я працюю як обмежений користувач, але вибираю "Запустити як адміністратор"
канадський Лука REINSTATE MONICA

2
Та ж сама ідея, але з використанням умовних операторів виконання: net session >nul 2>&1 && echo Success || echo Failure. Я вважаю цей компактний синтаксис зручнішим.
dbenham

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 як адміністратор, він все одно показує, що він працює як користувач
канадський Лука 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 ).

Код працює в Win2k + 1 , як з UAC, так і без UAC, доменних, перехідних груп, як би там не було - тому що він використовує той самий спосіб, що і сама система під час перевірки дозволів. chkadminдрукує "Адміністратор" або "Не адміністратор" і встановлює вихідний код відповідно 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 +, а інший ще старший .


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або інша подібна група отримує дозвіл на читання до systemprofile. Зрозуміло, це нестандартна конфігурація, яка не відрізняється від машин, налаштованих як контролери домену Windows, які надають «NT AUTHORITY \ Authenticated Users» права читання / виконання права на systemprofile.


> перевірте, чи VERIFY вимкнено. > підтвердити /? Показує cmd.exe, чи потрібно перевіряти, чи ваші файли правильно записані на диск. ВЕРИФІЯ [ON | OFF] Введіть VERIFY без параметра для відображення поточного параметра VERIFY. Як ця команда допомагає сценарію?
Канадський Люк ВІДНОВЛЕНО МОНИЦА

3
@Canadian Luke, Деякі вбудовані команди команд не очищають рівень помилок, якщо помилок немає. Таким чином, люди звикли очищати рівень помилок, використовуючи такі хаки verify. Я схильний використовувати cd .(cd space dot), який встановлює рівень error0 на 0, не дає виводу, а також корисний для створення файлу нульової довжини через cd . >somefile. З цього приводу я перевірив 'dir' на Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 та 10. Для всіх цих «dir» буде очищено рівень помилок до 0 на успіх, якщо він був встановлений до 'dir'. Таким чином, я не впевнений, чому Вілліям використав "перевірити", щоб спочатку очистити рівень помилок.
user3347790
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.