Как узнать, что программа запущена под Администратором
Иногда требуется узнать, запущена ли ваша программа под учетной записью с правами Администратора, или же от обычного пользователя. Для чего это нужно? Например, некоторые операции с реестром или файлами требуют права Администратора. При попытке выполнить их обычному пользователю вернется ошибка ERROR_ACCESS_DENIED, но для более точного анализа ситуации надо будет проверить права доступа и уведомить об этом пользователя. Проверить, что программа запущена под Администратором, можно несколькими способами.
Первый способ наиболее универсальный и работает даже на старых операционных системах. Он заключается в том, что надо получить группы доступа для токена текущего процесса, а затем проверить, входит ли хоть одна из них в группу Администраторов локального компьютера. Вот пример реализации:
Code (Assembler) : Убрать нумерациюВыделить код
Обратите внимание, что никаких проверок на ошибки не выполняется, оставлен только рабочий код. Полный вариант вы можете посмотреть в приложении к статье.
Как узнать, есть ли у меня права Администратора
Второй вариант очень похож на предыдущий, но будет работать только на системах, начиная с Windows 2000. В нем используется функция CheckTokenMembership, которая и выполняет все громоздкие проверки.
Code (Assembler) : Убрать нумерациюВыделить код
- ; Сегмент данных
- section ‘.data’ datareadablewriteable
- SECURITY_NT_AUTHORITY = 5
- SECURITY_BUILTIN_DOMAIN_RID = 0x00000020
- DOMAIN_ALIAS_RID_ADMINS = 0x00000220
- NtAuthority db 0 , 0 , 0 , 0 , 0 , SECURITY_NT_AUTHORITY
- psidAdmins dd ?
- pbAdmin dd ?
- ;———————————————
- ; Сегмент кода
- section ‘.code’ codereadableexecutable
- . . .
- invoke AllocateAndInitializeSid , NtAuthority , 2 ,
- SECURITY_BUILTIN_DOMAIN_RID ,
- DOMAIN_ALIAS_RID_ADMINS , 0 , 0 , 0 , 0 , 0 , 0 , psidAdmins
- invoke CheckTokenMembership , NULL , [ psidAdmins ] , pbAdmin
- moveax , [ pbAdmin ]
- ; Если EAX=1, то программа запущена под Администратором
- . . .
Следующий вариант самый короткий, но он также будет работать только на новых системах. В нем используется функция IsUserAdmin из библиотеки setupapi.dll. Как вы можете догадаться из ее названия, результатом работы этой функции будет TRUE, если пользователь является Администратором, и FALSE, если нет.
Code (Assembler) : Убрать нумерациюВыделить код
- . . .
- invoke IsUserAdmin
- ; Если EAX=1, то программа запущена под Администратором
- . . .
И последний способ, не совсем обычный, заключается в том, что сперва мы получаем логин текущего пользователя, а затем с помощью функции NetUserGetInfo запрашиваем подробную информацию о нем (структура USER_INFO_1). В поле usri1_priv хранится информация о правах доступа этого пользователя.
Code (Assembler) : Убрать нумерациюВыделить код
Как запустить игру или программу от Администратора в Windows 10
- ; Сегмент данных
- section ‘.data’ datareadablewriteable
- struct USER_INFO_1
- usri1_name dd ?
- usri1_password dd ?
- usri1_password_age dd ?
- usri1_priv dd ?
- usri1_home_dir dd ?
- usri1_comment dd ?
- usri1_flags dd ?
- usri1_script_path dd ?
- ends
- dSize dd 100h
- szUname rb 100h
- info dd ?
- NERR_SUCCESS = 0
- USER_PRIV_ADMIN = 2
- ;———————————————
- ; Сегмент кода
- section ‘.code’ codereadableexecutable
- . . .
- ; Получить логин текущего пользователя
- invoke GetUserName , szUname , dSize
- ; Получить информацию о пользователе
- invoke NetUserGetInfo , NULL , szUname , 1 , info
- cmpeax , NERR_SUCCESS
- jne loc_error
- ; Указатель на структуру USER_INFO_1
- moveax , [ info ]
- ; Пользователь админ?
- cmpdword [ eax + USER_INFO_1 . usri1_priv ] , USER_PRIV_ADMIN
- je loc_admin
- loc_not_admin :
- ; Пользователь не Администратор
- . . .
- loc_admin :
- ; Пользователь Администратор
- . . .
Обратите внимание, что все функции, строки и другие ресурсы, использованные в последнем примере, должны быть юникодными. Также это очень ненадежный способ проверки, например, на домашнем компьютере под Windows 7 она работает нормально, а на работе под Windows XP функция NetUserGetInfo возвращает ошибку, что пользователя не существует.
Ну а в заключении еще один небольшой пример, не совсем относящийся к теме статьи, но очень близкий. Это проверка, загружена система в безопасном режиме или в нормальном.
Code (Assembler) : Убрать нумерациюВыделить код
- ; Получить информацию о загрузке системы
- invoke GetSystemMetrics , SM_CLEANBOOT
- ; EAX=0 — нормальная загрузка
- ; EAX=1 — безопасный режим
- ; EAX=2 — безопасный режим с поддержкой сети
В приложении примеры программ, реализующие все четыре описанных способа проверки прав пользователя, и пример определения варианта загрузки системы.
Примеры программ с исходными текстами (FASM)
Просмотров: 9937 | Комментариев: 22
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
rtfm (06.06.2021 в 19:42):
Потребовалась консольная (cmd) определялка IsAdmin/IsElevated.
С некоторым удивлением узнал, что с однозначными вариантами — непросто (хотя бы, для xp-10, включая PE).
Лобовые (запись в защищенные объекты фc, реестр и т.п) и более элегантные (вроде fltmc) способы, без использования сторонних утилит, имеют тот недостаток, что их результат отличается от результата CheckTokenMembership, которым пользуются инсталляторы. Т.е. фактически привилегии есть, а скриптовая установка чего-либо может показать обломинго.
Использование же CheckTokenMembership (или его “обертки” IsUserAnAdmin) означает вызовы api из cmd (см. winapiexec и т.д.) или иное использование сторонних (не входящих в win) утилит.
Про менее типовые варианты (как вариант эмуляции — process explorer или process hacker -> run as limited user, coretechnologiesrun with restricted rights и т.п.) говорить вообще сложно – кто в лес, кто по дрова.
Это не претензия к приведенным примерам (в них — api), просто иллюстрация к словам. i.postimg.cc/FHCX8cw5/4.png
addhaloka (26.02.2016 в 10:51):
Нашёл ещё вариант — с IsUserAnAdmin из shell32.dll:
section ‘.code’ code readable executable
start:
call IsUserAnRoot
; Пользователь админ?
or eax,eax
; далее, как в примере №3
ManHunter (16.05.2015 в 19:15):
Общепринятая формулировка — «запустите программу под администратором». Никто и никогда не говорит типа «запустите процесс, чтобы он имел права администратора».
капитошка (16.05.2015 в 14:49):
ManHunter (16.11.2013 в 19:41):
Вряд ли получится, ограниченное приложение без дебажных прав в любом случае будет иметь минимальные права доступа.
А что касается Nt* функций, то не такие уж они и недокументированные, раз все ими пользуются. Я бы их назвал больше «неафишируемыми», чем недокументированными.
_lucius_ (16.11.2013 в 18:20):
ManHunter, здравствуйте. Спасибо вам за ваш замечательный блог. Не подскажите как узнать права у чужого процесса, при условии что у нас самих прав нет и в связи с этим мы не можем открыть процесс с правами PROCESS_QUERY_INFORMATION. Эти права нужны для того чтобы получить хэндл токена (через OpenProcessToken), а затем узнать права через SHTestTokenMembership. Читал то что можно получить хэндл через ZwQuerySystemInformation/ZwDuplicateObject, но очень не хотелось бы использовать недокументированные функции.
X (13.02.2012 в 18:56):
Супер! Работает!
ManHunter (13.02.2012 в 17:37):
sei SHELLEXECUTEINFO
runas db ‘runas’,0
program db ‘fasmw.exe’,0
buff rb 200h
mov [sei.cbSize],sizeof.SHELLEXECUTEINFO
mov [sei.lpVerb],runas
mov [sei.lpFile],program
invoke GetCurrentDirectory,200h,buff
mov [sei.lpDirectory],buff
mov [sei.nShow],SW_SHOW
invoke ShellExecuteEx,sei
и при запуске дочерней программы будет выдан запрос учетки пользователя
X (13.02.2012 в 17:36):
Спасибо, я понял.
ManHunter (13.02.2012 в 17:31):
Которое из написанного непонятно? Запрашиваешь у пользователя логин-пароль Администратора, передаешь их на runas.exe, PROFIT.
А из юзера свое приложение ты все равно не поднимешь до админа без применения всяких сплойтов, равно как и не запустишь процесс из своего так, чтобы он вдруг заимел админские права без знания логина-пароля админа. Иначе тогда зачем все эти ограничения прав придуманы? Все трояны бы тогда работали из любой ограниченной учетки.
X (13.02.2012 в 17:23):
Пользователь запускает мою программу как не Администратор. Моей программе необходимо запустить cmd.exe с правами Администратора. Я не знаю логин и пароль Администратора. Для запуска cmd.exe я использую WinAPI CreateProcess -> процесс cmd.exe запускается с ограниченными привилегиями. Пробую повысить привилегии своего запускающего процесса:
invoke LookupPrivilegeValue,NULL,SE_SECURITY_NAME,udtLUID
mov [tkp.PrivilegeCount],1
mov [tkp.Privileges.Attributes],SE_PRIVILEGE_ENABLED
mov eax,[udtLUID.lowPart]
mov [tkp.Privileges.pLuid.lowPart],eax
mov eax,[udtLUID.HighPart]
mov [tkp.Privileges.pLuid.HighPart],eax
invoke AdjustTokenPrivileges,[TTokenHd],0,tkp,0,0,0
ManHunter (13.02.2012 в 16:58):
google -> DialogBoxParam, CreateWindow — диалоговое окно с вводом пароля, логина, имени прабабушки и клички любимой собаки
google -> AdjustTokenPrivileges — повышение привилегий процесса
Или ты чо, из юзерской учетки в своем процессе решил в админы выпрыгнуть? Тогда сразу можешь забыть.
X (13.02.2012 в 16:41):
Я имел ввиду, как заставить пользователя ввести логин и пароль администратора или повысить привилегии процесса?
ManHunter (13.02.2012 в 16:16):
google -> CreateProcessAsUser, CreateProcessWithLogonW, CreateProcessWithTokenW и т.д.
X (13.02.2012 в 16:14):
Если после проверки оказалось, что пользователь не администратор, как зная SID администратора (psidAdmins) запустить другой процесс с правами администратора?
ManHunter (09.01.2012 в 21:02):
UAC у меня выключено, и система стоит на минимальном уровне уведомлений. А об UAC я думаю, что это натуральная херня, которую в MS придумали, чтобы хомячки с предустановленными системами не разносили всякую заразу и не жрали мозги техподдержке.
Stanis (09.01.2012 в 11:23):
ManHunter, вопрос не совсем по теме, но все же
У вас UAC включено или выключенно? и что Вы думаете вообще о нём?
Andrew (28.11.2011 в 13:46):
ManHunter, спасибо за ответ!
ManHunter (28.11.2011 в 12:04):
OllyDbg и отлаживаю, для юзермода пока ничего лучше не придумали. И пока что обхожусь без отладочной информации 🙂
Andrew (28.11.2011 в 12:01):
ManHunter, скажите пожалуйста (если это не секрет), чем вы отлаживаете ваши приложения? Я пользуюсь OllyDbg, но при размере PE модуля в 10 КБ и больше без отладочной информации запутаться в строчках кода легче легкого (из-за этого даже хотел перейти с FASM на NASM/YASM, но тем не менее отказался от этой идеи).
ManHunter (21.11.2011 в 08:18):
4-й способ и под Гостем тоже показывает «Something wrong», я поэтому сразу написал, что способ очень ненадежный. Про UAC обязательно добавлю, спасибо.
Nutscracker (21.11.2011 в 02:12):
Наверное, надо про UAC добавить.
На Win 7 с включенным UAC правильное «You are NOT admin» сообщают is_admin2.exe и is_admin3.exe.
А если запустить с правами NT AUTHORITYсистема (как у процесса winlogon), то is_admin4.exe сообщит «Something wrong ;(».
Источник: www.manhunter.ru
Как определить в командном файле, запущен ли он c правами администратора
Приветствую тебя, уважаемый читатель. Наверняка ты уже потерявший всякую надежду на появление в этом блоге новых публикаций. Сегодня я попробую нарушить затянувшуюся паузу.
На прошедшей неделе мне довелось отправлять по почте командный файл одной особе бальзаковского возраста, которому для успешного завершения своей работы были необходимы права администратора. И в процессе диалога с ней мне неоднократно подумалось, что было бы неплохо добавить в командный файл проверку, запущен ли от имени администратора.
Недолго думая, я пришел к следующему умозаключению.
- В Windows Vista/7/8 есть команды, которые требуют прав администратора для своего выполнения.
- С незапамятных времен, ещё в замшелом MS DOS была проверка на ERRORLEVEL — код возврата отработавшей программы. И сейчас мы с вами можем проверить этот код, анализируя значение переменной окружения %errorlevel%.
Следовательно, если мы запустим что-то, что требует прав администратора, в интерпретаторе без этих прав, мы должны получить %errorlevel%, НЕ равный нулю (ибо ноль — это успешное выполнение команды).
Как вы можете видеть на скриншоте выше,
- Команда openfiles требует для своего выполнения прав администратора
- В случае успеха она возвращает ноль в переменную окружения ERRORLEVEL
- Если прав для её выполнения недостаточно — она возвращает в неё единицу.
Дальше — дело техники. Проверка на права администратора может выглядеть так:
Примечание 1. Вместо openfiles тут может быть любая другая команда, требующая эскалации привилегий. Например, там могла бы быть команда net session.
Примечание 2. 2>#128161;Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.
Судя по тому, что вы читаете этот текст, вы дочитали эту статью до конца. Если она вам понравилась, поделитесь, пожалуйста, с помощью кнопок ниже. Спасибо за вашу поддержку!
Вы здесь: Главная страница » Windows » Как определить в командном файле, запущен ли он c правами администратора
Публикации по теме
- Как открыть командную строку от администратора в Windows 11
- Как в Windows 11 заменить Терминал на Командную Строку
- Как в Windows 11 открыть Терминал Windows
- Как в Windows 11 открыть Командную строку
- Как открыть Командную строку от Администратора в Windows 10
- Как открыть Командную строку в Windows 10 — все способы
- Как добавить Командную строку в меню Win + X в Windows 10
- Масштабирование окна консоли в Windows 10 (cmd, WSL, PowerShell)
- Как открыть очередь печати принтера из командой строки
- Как убрать пустую строку из вывода команды echo в Windows
- Что делать, если пропала прокрутка в командной строке cmd.exe после смены шрифта
- Обновление Ele 1.0.1 — утилиты для эскалации привилегий открытого окна командой строки
- Как заставить отображаться команду «Копировать как путь» в контекстном меню Проводника Windows
- Winnity — диалог выбора папки или файла из командой строки
- Работа со строками в командных файлах Windows 7
Сергей Ткаченко создал этот сайт в далёком 2009 году, и с тех пор продолжает над ним работать, публикуя новые материалы о Windows и её приложениях практически каждый день. Посмотреть все записи автора Сергей Ткаченко
Автор Сергей Ткаченко Опубликовано 23 сентября 2012 20 ноября 2020 Рубрики Windows Метки Командная строка
Как определить в командном файле, запущен ли он c правами администратора: 7 комментариев
Степан :
Тоже самое, только с запросом в реестр и короче
reg query «HKUS-1-5-19»>nul 2>https://winreviewer.com/kak-operedelit-v-komandnom-fajle-zapushhen-li-on-c-pravami-administratora/» target=»_blank»]winreviewer.com[/mask_link]
Как узнать, запущен ли процесс от имени администратора в Windows 10
Как правило, если вы вошли в свой ноутбук или настольный компьютер как пользователь, вам необходимо запустить определенные программы от имени администратора, чтобы выполнить его. Для этого вам нужно открыть программу как «Запуск от имени администратора». Однако вы можете задаться вопросом, какую программу нужно открывать от имени администратора или нет. Существует способ узнать, имеет ли какая-либо программа права администратора. Давайте посмотрим в этой статье, как это сделать.
Метод: с помощью диспетчера задач
Шаг 1: Откройте диспетчер задач.
Программы для Windows, мобильные приложения, игры — ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале — Подписывайтесь:)
После того, как он откроется, нажмите «Подробнее», как показано на изображении выше.
Шаг 2: Щелкните правой кнопкой мыши столбец «Имя» и выберите «Выбрать столбцы».
Шаг 3: Найдите в списке опцию «Повышенные» и установите флажок.
Шаг 4: После выбора столбца с повышенным уровнем вы можете увидеть значения столбца как «Да» или «Нет».
Здесь «Нет» означает, что программа не запускается от имени администратора, а «Да» означает, что программа запускается от имени администратора.
Спасибо за прочтение статьи и надеюсь, что она помогла вам разобраться!
Программы для Windows, мобильные приложения, игры — ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале — Подписывайтесь:)
Источник: zanz.ru