![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Sheff |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
Всем доброго времени суток!
Ситуация следующая, есть файл, нужно получить его владельца, но не само имя пользователся, а нужно выяснить является ли он администратором компьютера или нет. Пробую через GetSecurityInfo/LookupAccountSid, но не получается, Group SID, который выдаёт GetSecurityInfo и близко не похож на админский, хотя юзер входит в группу админов. Пытался также сделать:
а потом:
Возвращает FALSE, и это естественно, если учесть что для BUILTIN/Administrators SID = S-1-5-32-544, а для моей группы = S-1-5-21-746137067-1604221776-725345543-513 У кого какие предложения ? Как определить является юзер админом или нет ? -------------------- -------------------------- Шеф всегда прав :) |
||||
|
|||||
| Pulse69 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 28.4.2006 Где: Хабаровск Репутация: 8 Всего: 10 |
Насколько я знаю, имея SID пользователя никак невозможно узнать, является ли он членом какой-либо группы.
Если бы у Вас был токен безопасности (например, полученный в результате олицетворения контекста безопасности или вызова функции LogonUser), Вы бы могли вызвать функцию CheckTokenMembership и проверить, находится ли SID группы администраторов в этом токене. Можно было бы воспользоваться функциями LogonUser и ImpersonateLoggedOnUser для получения токена безопасности, однако тут есть несколько трудностей. Во-первых, нет пароля пользователя, во-вторых, на Windows 2000 понадобится специальная привелегия. Единственая возможность проверить, является ли пользователь членом группы - получить все группы, в которые он входит, получить SIDы этих групп и с помощью EqualSid сравнить с SIDом группы администраторов. Для получения списка групп пользователя можно воспользоваться функциями NetUserGetGroups и NetUserGetLocalGroups (они принимают имя пользователя, а не SID). Потом всё ясно - LookupAccountSid и EqualSid. Это сообщение отредактировал(а) Pulse69 - 18.11.2007, 03:50 --------------------
Ctrl+Alt+Reset |
|||
|
||||
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
Pulse69, да, у меня была идея юзать NetUserGetGroups и NetUserGetLocalGroups, но пугает префикс - Net. У меня с сетью ничего не связано, как-то не правильно юзать сетевые функции для этого и линковаться с Netapi32. Более того, они принимают строку имени пользователя, а мне почему-то кажется что строка не уникально идентифицирует юзера, имя юзера я конечно могу взять с помощью LookupAccountSid, а потом скормить его NetUserGetLocalGroups, но вот вопрос, будут ли эти группы группами именно того юзера, какого мне нужно ?
-------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| Pulse69 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 28.4.2006 Где: Хабаровск Репутация: 8 Всего: 10 |
Насчёт сетевых функций.
NetUser* являются ещё одним способом работать с Active Directory (можно ещё использовать интерфейсы IADsUser и IADsComputer), которая хранит информацию о пользователях. Интерфейс AD для получения информации об учётных записях - сетевой, даже не смотря на то, что действия выполняются на локальном компьютере. Так почему бы не воспользоваться этими функциями. Второе. Почему ИМЯ пользователя не идентифицирует его уникально? Конечно, локальный пользователь и пользователь в домене может иметь одинаковое имя. Однако, пользователь DOMAIN\UserName (т.е. пользователь в домене) уникален. После завершения вызова LookupAccountSID получается как домен, где был найден SID, так и имя пользователя. Дальше начинается самое интересное. Если пользователь был найден в локальной системе, домен будет равняться "BUILTIN" или имени компьютера.
В этом случае, в NetUserGet(Local)Groups в качестве сервера следует передать NULL, функция решит, что пользователь находится на локальном компьютере и сделает своё дело. Иначе, необходимо выполнить дополнительные действия: Если пользователь с указанным SID найден в домене, функции семейства NetUser* должны выполняться на компьютере, являющимся первичным контроллером для этого домена, т.е. PDC. Получить контроллер домена по его имени можно с помощью функции NetGetDCName. Да, естественно, что вызовы Net* на PDC завершаться неудачно, если у вызывающего приложения нет права на получение информации из домена. (А это, скорее всего, будет так, если приложение запускается из-под учётной записи, не входящей в группу Domain Administrators). Как видите, если предусмотреть все варианты, в программе появляется довольно-таки тесная связь с сетью=) Так что в Вашем случае, NetUser* ещё не самое плохое решение;) ЗЫЖ Надеюсь, довольно понятно объяснил. С длинными скучными описаниями у меня всегда проблемы=) Это сообщение отредактировал(а) Pulse69 - 18.11.2007, 14:28 --------------------
Ctrl+Alt+Reset |
|||
|
||||
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
Pulse69, спасибо, очень доходчиво объяснили, но вот в чём проблема, получив группы при помощи NetUserGetLocalGroups я получаю лишь строки, ну вот допустим получил я строку Administrators, а как мне выяснить, это группа администраторов или же она просто так называется ? По строке ж нельзя судить о типе группы, более того, если у меня винда какая-нибудь испанская, но там группа админов может вообще по другому называться. Хотелось бы железобетонный способ определения админ юзер или нет...
-------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
А, всё, понял, NetGroupGetInfo. Пока сделаю так.
Pulse69, спасибо ещё раз. -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| Pulse69 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 28.4.2006 Где: Хабаровск Репутация: 8 Всего: 10 |
В принципе, можно и так, но лучше снова LookupAccountName для имени группы, а потом EqualSid. Тогда у Вас будет SID группы, в которую входит пользователь и SID группы, с котрой нужно провести сравнение. --------------------
Ctrl+Alt+Reset |
|||
|
||||
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
Pulse69, да, как вы говорите действительно лучше, я так и сделал:
-------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |