Как узнать запущен ли процесс с правами администратора в windows 7

Обновлено: 03.07.2024

Воть. За коменты сильно не бейте, писал от себя, так, как я это понимаю +переводы SDK, весьма скудными знаниями английского((
Надеюсь статейка будет полезна. (на форуме где то видел похожую тему).

Комментарии

спасибо за информацию! очень полезная..

Есть еще один очень тупой, но очень простой метод, который позволяет узнать это на много быстрее. Нужно попробовать создать файл в любой защищенной области в файловой системе или в реестре. Если ошибка, то отваливаем. Метод в заметке лучше и позволяет узнать более точно, под кем работает, но в большинстве случаев, достаточно ответа да/нет.

Статья ваша действительно оказалась полезной

Так что я думаю этот способ не подойдет:)

Чуть попозже, все таки почитаю конкретно про функции которые были использованы и подправлю коменты.

под вин7 почемуто всегда выдает, что нет прав админа 😕 ❗

2yugovoo
Опиши процесс, как ты запускаешь прогу.
К сожалению, не могу проверить под вин7(

Недавно Станислав Подгорный(технический директор), в сотрудничестве с Александром Вербовским(PHP разработчик) разработали уникальное приложение под названием “My Market Value” , позволяющее проследить за процессами на рынке труда и соизмерить свои силы с ожиданиями по зароботной плате.
Даное приложение являеться новинкой в мире IT и не имеет аналогов в Украине и за рубежом. Благодаря уникальной разработке двух ярких индивидуальностей и истинных профессионалов своего дела, разработчики нашей страны получили возможность реально оценивать свои силы в сфере IT.
Оцените свои возможности, проследите за стремительно изменяющимися технологиями, освойте новые направления и творчески подходите к своим возможностям.
Теперь, оценить свои знания и навыки легко – несколько кликов – и вы в мире IT, в мире несоизмеримых возможностей и перспектив.

Сделайте шаг навстречу своей мечте, получите работу, на которую вы заслуживаете и оцените свои таланты по достоинству!

Неплохое решение, но это можно и зделать по другому. Правда ваш код более компактный и вообще зачем искать иное решение.


К сожалению, в работе сисадмина нет-нет да и приходится разрешать пользователям запускать всякий софт с админскими правами. Чаще всего это какие-нибудь странные китайские программы для работы с оборудованием. Но бывают и другие ситуации вроде небезызвестного bnk.exe.

Выдавать пользователю права администратора, чтобы решить проблему быстро и просто, противоречит нормам инфобезопасности. Можно, конечно, дать ему отдельный компьютер и поместить в изолированную сеть, но — это дорого и вообще…

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

Программа может запрашивать права администратора условно в двух случаях:

  1. Когда хочет получить доступ туда, куда «простым смертным» нельзя: например, создавать файлы в системных каталогах.
  2. Когда программу скомпилировали со специальным флагом «Требовать права администратора».

С первым случаем все понятно: берем в руки замечательную программу Марка Руссиновича Process Monitor, смотрим, что происходит, и куда программа пытается залезть:


Куда это лезет этот 7Zip?

И по результатам исследования выдаем права пользователю на нужный каталог или ветку реестра.

Сложнее, если случай клинический, и так просто выдать права не получится: например, программа требует сильного вмешательства в работу системы вроде установки драйверов. Тогда придется придумывать всякий колхоз, про который речь пойдет в последнем разделе статьи. Пока подробнее освещу второй случай — когда стоит флажок.

Если сильно упростить, то в специальном манифесте программы (к слову, установщики — это тоже программы) могут быть три варианта запуска:

  • asInvoker. Программа запускается с теми же правами, что и породивший ее процесс (как правило, это explorer.exe c правами пользователя);
  • highestAvailable. Программа попросит максимально доступные пользователю права (у администратора появится окно с запросом повышения UAC, у пользователя — нет);
  • requireAdministrator. Программа будет требовать права администратора в любом случае.

Если разработчик твердо решил требовать права администратора, даже если они не нужны, то обойти это можно малой кровью.

В системе Windows, начиная с Vista, появилась служба UAC, которая помимо прочего отвечает за запросы программ на повышение прав. Не все программы «переваривали» работу с этой службой. Поэтому в системе был доработан механизм совместимости приложений, позволяющий прямо задать программе ее поведение — запрашивать права или нет.

Простейшим вариантом работы с этим механизмом будет использование переменных среды.

Рассмотрим пример с редактором реестра. Действительно, запуская regedit.exe под администратором, мы получаем запрос на повышение прав:


Запрос повышение прав.

Если же мы запустим редактор реестра из консоли, предварительно поменяв значение переменной среды __COMPAT_LAYER на:

То запроса UAC не будет, как и административных прав у приложения:


Бесправный редактор реестра.

Этим можно пользоваться, запуская программы батниками или добавляя контекстное меню через реестр. Подробнее читайте в материале How to Run Program without Admin Privileges and to Bypass UAC Prompt?

Поскольку ярлычками тут обойтись не выйдет, ведь 1С сама скачивает файл и запускает его, то придется применять тяжелую артиллерию — Microsoft Application Compatibility Toolkit.

Документация к ПО, как обычно, доступна на официальном сайте, загрузить можно как часть Windows Assessment and Deployment Kit. Сам процесс решения проблемы несложен.

Необходимо поставить утилиту, запустить Compatibility Administrator и создать Application Fix в новой или имеющейся базе данных:


Создаем исправление приложения.

Имя и издатель значения не имеют. Имеет значение только расположение файла — тут нужно указать реальный проблемный bnk.exe (где он будет лежать на самом деле — не важно).

Далее необходимо в списке исправлений выбрать RunAsInvoker.


Выбираем нужный фикс.

Все остальное оставляем по умолчанию, сохраняем базу данных. Должно получиться примерно так:


Созданный фикс для bnk.exe.

После этого достаточно будет установить базу данных, щелкнув по ней правой кнопкой и выбрав Install. Теперь пользователи смогут сами грузить классификаторы банков.

Все становится хуже, если приложению действительно нужны права админа. Тогда добавление прав на системные объекты и исправления не помогают.

Казалось бы, самым очевидным решением для запуска нашего странного ПО выглядит использование встроенной утилиты Runas. Документация доступна на сайте Microsoft.

Ну, посмотрим, что из этого выйдет.

Действительно, RunAs запустит 7zip с правами учетной записи «Администратор», спросит пароль и запомнит его. Потом ярлык с такой строкой запуска будет запускать 7zip под Администратором без вопросов.


)

Есть один существенный недостаток: пароль запоминается на уровне системы, и теперь, используя команду Runas, можно будет запускать абсолютно любую программу. Это мало чем отличается от прямого предоставления админских прав сотрудникам, так что использовать это решение не стоит.

Зато runas может быть полезен, когда сотрудник знает пароль администратора, но работает под ограниченной учетной записью (по идее так должен делать каждый системный администратор).

Если мы начали с консольных команд, то перейдем к более высокоуровневым скриптам. Интересное решение было предложено в статье «Планктонная Windows», где упомянутый выше Runas обвязывался js-скриптом и пропускался через обфускатор. У решения есть и очевидный минус — скрипт можно раскодировать.

Чуть более интересным методом в 2к20 являются возможности PowerShell и его работа с паролями. Подробнее можно почитать в материале «Защита и шифрование паролей в скриптах PowerShell».

Если вкратце: в PS работа с паролями производится через специальный тип данных SecureString и объект PSCredential. Например, можно ввести пароль интерактивно:

Затем сохранить пароль в зашифрованном виде в файл:

И теперь использовать этот файл для неинтерактивной работы:

К сожалению, файл этот можно использовать только на том ПК, на котором его создали. Чтобы этого избежать, можно сделать отдельный ключ шифрования. Например так:

Теперь при помощи этого ключа пароль можно зашифровать:

К сожалению, с безопасностью дела обстоят так же печально: утащить пароль не составляет трудностей, если есть доступ к файлу с ключом шифрования и зашифрованным паролем. Да, можно добавить обфускации и скомпилировать скрипт в .exe вместе с нужными файлами. Но нужно понимать, что это — полумеры.

В свое время я использовал для решения подобных задач свой любимый AutoIt, где компилировал скрипт с командой RunAs и радовался… До тех пор, пока не узнал, что AutoIt (особенно старых версий) декомпилируется на раз-два.

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

На свете существует несколько сторонних решений, призванных решить задачу. Остановлюсь на парочке из них.

Пожалуй, одна из самых известных утилит — это AdmiLink, разработанная Алексеем Курякиным для нужд ядерной физики. Программа и принципы ее работы описаны на официальном сайте. Я, как обычно, позволю себе более краткое описание.

Программа состоит из трех модулей. AdmiLink — это графическое окно, где можно создать ярлык на нужное приложение (в принципе, в ряде случаев достаточно только его).


Основное окно программы.

Помимо непосредственно создания ярлыка (и да, запрос UAC тоже можно подавлять), есть и дополнительные функции вроде калькулятора, терминала и удобных настроек политик безопасности. Со всеми возможностями программы читателю предлагается разобраться самостоятельно.

Второй модуль называется AdmiRun и представляет из себя консольную утилиту. Она умеет запускать приложения от имени администратора, получив в качестве одного из параметров строку, созданную через AdmiLink. В строке шифруется имя пользователя и пароль, при этом участвует и путь к программе.

На первый взгляд все выглядит безопасно, но, к сожалению, код программ закрыт, и насколько можно доверять разработчику — вопрос.

Третий модуль — AdmiLaunch — отвечает за запуск окон в разных режимах, и он используется для запуска AdmiRun, если создавать ярлык через AdmiLink.

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

RunAsRob — довольно интересное ПО за авторством немецкого разработчика Оливера Хессинга (Oliver Hessing). В отличие от AdmiLink, ПО устанавливается как служба, запускаемая под привилегированной учетной записью (администратора или системы). Как следствие, подготовленный ярлык обращается к службе, которая уже в свою очередь запускает заданное ПО.

Особенность программы в том, что есть возможность авторизовать не только программы, но и папки (включая сетевые). А хранение настроек в реестре позволило добавить шаблоны групповых политик, примерно как мы писали в статье «Погружение в шаблоны и приручение GPO Windows». Благодаря этому при необходимости настройки можно применять прямо из Active Directory.


Основное окно программы.

Программа богато документирована на официальном сайте.

У этого автора есть еще и программа RunAsSpc, позволяющая запускать исполняемые файлы под правами другого пользователя, передавая учетные данные через зашифрованный файл.

Мне остается только добавить, что это ПО бесплатно только для личного использования.

Но учтите, что из программы, запущенной под административными правами, можно натворить бед. Например, запустить привилегированную командную консоль через диалог Файл — Открыть.


Запускаем cmd.exe прямо из редактора реестра.

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

А вам приходилось городить странные костыли? Предлагаю делиться историями в комментариях.

Как узнать, что программа запущена под Администратором

Иногда требуется узнать, запущена ли ваша программа под учетной записью с правами Администратора, или же от обычного пользователя. Для чего это нужно? Например, некоторые операции с реестром или файлами требуют права Администратора. При попытке выполнить их обычному пользователю вернется ошибка ERROR_ACCESS_DENIED, но для более точного анализа ситуации надо будет проверить права доступа и уведомить об этом пользователя. Проверить, что программа запущена под Администратором, можно несколькими способами.

Первый способ наиболее универсальный и работает даже на старых операционных системах. Он заключается в том, что надо получить группы доступа для токена текущего процесса, а затем проверить, входит ли хоть одна из них в группу Администраторов локального компьютера. Вот пример реализации:

  1. ; Сегмент данных
  2. section '.data' datareadablewriteable
  3. SECURITY_NT_AUTHORITY = 5
  4. TOKEN_READ = 0x00020008
  5. SECURITY_BUILTIN_DOMAIN_RID = 0x00000020
  6. DOMAIN_ALIAS_RID_ADMINS = 0x00000220
  7. TokenGroups = 0x00000002
  8. BUFF_SIZE = 1024h ; Размер буфера для групп доступа токена
  9. NtAuthority db 0 , 0 , 0 , 0 , 0 , SECURITY_NT_AUTHORITY
  10. hTokenHandle dd ?
  11. dInfoSize dd ?
  12. psidAdmins dd ?
  13. hHeap dd ?
  14. pTokenGroups dd ?
  15. ;---------------------------------------------
  16. ; Сегмент кода
  17. section '.code' codereadableexecutable
  18. . . .
  19. ; Получить токен текущего процесса
  20. invoke GetCurrentProcess
  21. invoke OpenProcessToken , eax , TOKEN_READ , hTokenHandle
  22. ; Выделить память для массива групп
  23. invoke GetProcessHeap
  24. mov [ hHeap ] , eax
  25. invoke HeapAlloc , eax , HEAP_ZERO_MEMORY , BUFF_SIZE
  26. mov [ pTokenGroups ] , eax
  27. ; Получить информацию о группах доступа токена
  28. invoke GetTokenInformation , [ hTokenHandle ] , TokenGroups , \
  29. [ pTokenGroups ] , dword BUFF_SIZE , dInfoSize
  30. ; Прибраться за собой
  31. invoke CloseHandle , [ hTokenHandle ]
  32. invoke AllocateAndInitializeSid , NtAuthority , 2 , \
  33. SECURITY_BUILTIN_DOMAIN_RID , \
  34. DOMAIN_ALIAS_RID_ADMINS , 0 , 0 , 0 , 0 , 0 , 0 , psidAdmins
  35. ; Количество записей в структуре TOKEN_GROUPS
  36. movesi , [ pTokenGroups ]
  37. movebx , dword [ esi ]
  38. ; Указатель на массив SID_AND_ATTRIBUTES
  39. addesi , 4
  40. @ @ :
  41. ; Проверить соответствие SID
  42. moveax , dword [ esi ]
  43. invoke EqualSid , [ psidAdmins ] , eax
  44. oreax , eax
  45. jnz loc_admin
  46. ; Следующая группа
  47. addesi , 8
  48. decebx
  49. orebx , ebx
  50. jnz @ b
  51. loc_not_admin :
  52. ; Пользователь не Администратор
  53. . . .
  54. loc_admin :
  55. ; Пользователь Администратор
  56. . . .

Обратите внимание, что никаких проверок на ошибки не выполняется, оставлен только рабочий код. Полный вариант вы можете посмотреть в приложении к статье.

Второй вариант очень похож на предыдущий, но будет работать только на системах, начиная с Windows 2000. В нем используется функция CheckTokenMembership, которая и выполняет все громоздкие проверки.

  1. ; Сегмент данных
  2. section '.data' datareadablewriteable
  3. SECURITY_NT_AUTHORITY = 5
  4. SECURITY_BUILTIN_DOMAIN_RID = 0x00000020
  5. DOMAIN_ALIAS_RID_ADMINS = 0x00000220
  6. NtAuthority db 0 , 0 , 0 , 0 , 0 , SECURITY_NT_AUTHORITY
  7. psidAdmins dd ?
  8. pbAdmin dd ?
  9. ;---------------------------------------------
  10. ; Сегмент кода
  11. section '.code' codereadableexecutable
  12. . . .
  13. invoke AllocateAndInitializeSid , NtAuthority , 2 , \
  14. SECURITY_BUILTIN_DOMAIN_RID , \
  15. DOMAIN_ALIAS_RID_ADMINS , 0 , 0 , 0 , 0 , 0 , 0 , psidAdmins
  16. invoke CheckTokenMembership , NULL , [ psidAdmins ] , pbAdmin
  17. moveax , [ pbAdmin ]
  18. ; Если EAX=1, то программа запущена под Администратором
  19. . . .
Следующий вариант самый короткий, но он также будет работать только на новых системах. В нем используется функция IsUserAdmin из библиотеки setupapi.dll. Как вы можете догадаться из ее названия, результатом работы этой функции будет TRUE, если пользователь является Администратором, и FALSE, если нет.
  1. . . .
  2. invoke IsUserAdmin
  3. ; Если EAX=1, то программа запущена под Администратором
  4. . . .
И последний способ, не совсем обычный, заключается в том, что сперва мы получаем логин текущего пользователя, а затем с помощью функции NetUserGetInfo запрашиваем подробную информацию о нем (структура USER_INFO_1). В поле usri1_priv хранится информация о правах доступа этого пользователя.
  1. ; Сегмент данных
  2. section '.data' datareadablewriteable
  3. struct USER_INFO_1
  4. usri1_name dd ?
  5. usri1_password dd ?
  6. usri1_password_age dd ?
  7. usri1_priv dd ?
  8. usri1_home_dir dd ?
  9. usri1_comment dd ?
  10. usri1_flags dd ?
  11. usri1_script_path dd ?
  12. ends
  13. dSize dd 100h
  14. szUname rb 100h
  15. info dd ?
  16. NERR_SUCCESS = 0
  17. USER_PRIV_ADMIN = 2
  18. ;---------------------------------------------
  19. ; Сегмент кода
  20. section '.code' codereadableexecutable
  21. . . .
  22. ; Получить логин текущего пользователя
  23. invoke GetUserName , szUname , dSize
  24. ; Получить информацию о пользователе
  25. invoke NetUserGetInfo , NULL , szUname , 1 , info
  26. cmpeax , NERR_SUCCESS
  27. jne loc_error
  28. ; Указатель на структуру USER_INFO_1
  29. moveax , [ info ]
  30. ; Пользователь админ?
  31. cmpdword [ eax + USER_INFO_1 . usri1_priv ] , USER_PRIV_ADMIN
  32. je loc_admin
  33. loc_not_admin :
  34. ; Пользователь не Администратор
  35. . . .
  36. loc_admin :
  37. ; Пользователь Администратор
  38. . . .

Обратите внимание, что все функции, строки и другие ресурсы, использованные в последнем примере, должны быть юникодными. Также это очень ненадежный способ проверки, например, на домашнем компьютере под Windows 7 она работает нормально, а на работе под Windows XP функция NetUserGetInfo возвращает ошибку, что пользователя не существует.

Ну а в заключении еще один небольшой пример, не совсем относящийся к теме статьи, но очень близкий. Это проверка, загружена система в безопасном режиме или в нормальном.

  1. ; Получить информацию о загрузке системы
  2. invoke GetSystemMetrics , SM_CLEANBOOT
  3. ; EAX=0 - нормальная загрузка
  4. ; EAX=1 - безопасный режим
  5. ; EAX=2 - безопасный режим с поддержкой сети

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


Проверка прав администратора у другого процесса
Здравствуйте, каким образом можно определить, есть ли права администратора у какого-либо чужого.


Запрос приложения на получение прав администратора
Здравствуйте, подскажите пожалуйста: программе для корректной работы нужны права администратора.

Как записать настройки программы без прав администратора?
Если записывать настройки через Properties.Settings, то на компьютере, где нет прав администратора.

valera_21, не работает Этот код проверяет просто, является ли текущий пользователем членом группы администраторов, а вот про запуск "runas" он ничего не говорит, а это две больше разницы

A_N_A_N_A_S, на форуме пару месяцев назад обсуждалось, решение находилось, поищите поиском.

Этот код проверяет просто, является ли текущий пользователем членом группы администраторов, а вот про запуск "runas" он ничего не говорит, а это две больше разницы А Вы про какой именно код говорите ?
Я пробовал вот этот:
Запускаем на Windows 7 (UAC включен) от имени администратора - получаем True.
Запускаем просто из консоли - получаем False.
Разве это не то, что нужно топикстартеру ? Убежденный, ну у меня он пишет true в любом случае. Даже если под дебагом в студии запустить

Хм. И что, прав админа при этом все равно нет ?
Ну то есть, нельзя, к примеру, писать в тот же HKLM и системные папки ?

Для работы моего приложения нужны права администратора, как проверить с какими правами запустилась программа а зачем проверять? Можно сразу запускать от имени админа без проверки с помощью manifest.app
а зачем проверять? Можно сразу запускать от имени админа без проверки с помощью manifest.app 1) XP, неадминистраторская учетка.
2) Vista и выше, неадминистраторская учетка, UAC выключен.
В обоих случаях наличие манифеста с requireAdministrator не поможет,
программа будет запущена с ограниченными правами. Хм. И что, прав админа при этом все равно нет ?
Ну то есть, нельзя, к примеру, писать в тот же HKLM и системные папки ?

у меня на работе в этом есть прикол. Есть батник, который добавляет правила маршрутизации. Так вот, несмотря на то, что я админ всея компа и тп, могу писать что угодно куда угодно, если я не запускаю его с runas, то он правило не добавляет И галочка в winservice что "запускать с наивысшими правами" не помогает. То есть только вручную нажать на шилдик. Ну или использовать кучу кода (опять же, где-то я его приводил, с msdn"а или какого-то другого мсовского сайта).

Решение

Есть батник, который добавляет правила маршрутизации. Так вот, несмотря на то, что я админ всея компа и тп, могу писать что угодно куда угодно, если я не запускаю его с runas, то он правило не добавляет

Так в этом и суть UAC: даже если ты администратор, реальные администраторские
права для процесса выдаются лишь по запросу. Если, конечно, UAC не выключен или
не настроен специальным образом через локальные политики безопасности.
Меня больше удивляет вот это:

Что-то не могу придумать ситуацию, при которой такое возможно.
По логике вещей, если WindowsPrincipal.IsInRole возвращает true, значит access
token процесса содержит SID администратора. А это, в свою очередь, означает,
что проверка прав на запись при запросах доступа к системным объектам
(HKLM, System32 и т.д.) будет проходить успешно, так как там сравниваются
именно SID-ы.

Меня, правда, смущает описание метода WindowsIdentity.GetCurrent в MSDN:

Returns a WindowsIdentity object that represents the current Windows user.

Что есть "current Windows user" в данном случае ? Залогиненный в сессии
процесса юзер или юзер, в контексте которого выполняется данный процесс/поток ?
Если первое, тогда функция всегда возвращала бы True для администратора, даже
если процесс не имеет админского SID-а (а следовательно, и прав на запись в
HKLM и системные папки). Но проблема в том, что у меня на "голой" Windows 7 с
включенным UAC она стабильно возвращает False, если только не запускать
программу от имени администратора, тогда True.

Вот нашел статью в базе знаний Microsoft, там есть примеры кода:

IsUserInAdminGroup

Функция определяет, является ли пользователь членом группы "Администраторы".
Для этого она извлекает полный токен процесса, если такой токен есть, и
проверяет наличие в нем соответствующего идентификатора безопасности (SID).
Сам процесс при этом может быть запущен с фильтрованнм (ограниченным)
токеном, не имея администраторских прав. Очень, кстати, похоже на описываемую
ситуацию с "IsAdmin = True, but HKLM Write = False".

IsRunAsAdmin

Функция проверяет, имеет ли процесс права администратора.
Код аналогичен тому, что приводился на stackoverflow.

IsProcessElevated

Функция определяет, запущен ли процесс с полным или ограниченным токеном.
Имеет смысл только для Windows Vista и выше. Результат, по идее, должен быть
таким же, как у IsRunAsAdmin, хотя интересно бы проверить данную функцию с
отключенным UAC.

GetProcessIntegrityLevel

Функция возвращает integrity level процесса (Windows Vista и выше).
Для обычных процессов будет medium level, для запущенных с админскими
правами - high level.

Читайте также: