Список «реальных» пользователей Windows, использующих Win32 API - PullRequest
12 голосов
/ 08 февраля 2011

Я пытаюсь получить список реальных пользователей на локальной машине. Под реальным я имею в виду пользователей которые могут физически входить в систему и использовать ее, исключая только удаленные учетные записи и т. п.

Это то, что я уже делаю.

  • Звоните NetUserEnum() с FILTER_NORMAL_ACCOUNT.

    Я получаю следующих пользователей:

    • __vmware_user __
    • Администратор
    • Помощник
    • ASPNET
    • Гость
    • SUPPORT_xxxxxx

    Обратите внимание, что это те же пользователи, которых я получаю при вызове net user из командной строки, но в диалоге входа я могу выбрать только Администратор. Это то, что я хочу.

  • Из списка возврата на NetUserEnum() я могу сказать, какие учетные записи отключены. Это оставляет:

    • __vmware_user __
    • Администратор
    • ASPNET
    • SUPPORT_xxxxxx
  • Затем я запускаю LsaEnumerateAccountRights(), чтобы проверить, какие учетные записи имеют SeInteractiveLogonRight.

    У всех есть. Кроме настоящего, Администратор. Некоторые из них имеют SeDenyInteractiveLogonRight. Это оставляет меня с:

    • __vmware_user __
    • Администратор (без SeInteractiveLogonRight)

Я где-то обнаружил, что, возможно, мне следует сначала проверить разрешения группы, поскольку моя учетная запись пользователя может наследовать SeInteractiveLogonRight. До сих пор я не нашел способа перечислить группы для данной учетной записи (SID или имя). Пробовал с NetUserGetGroups(), но оказывается, что эта возвращает только доменные группы (в моем случае "None").

Сейчас я не знаю, что еще попробовать. Похоже, что все было бы проще, если бы у меня был «токен доступа», но, похоже, нет способа получить его для другого пользователя, кроме вошедшего в систему в данный момент. Есть около 20 различных API, связанных с аутентификацией, и это безумие.

Я ценю вашу помощь

1 Ответ

5 голосов
/ 08 февраля 2011

Как вы сказали, последний шаг, вероятно, просто фильтрует пользователей, принадлежащих к группе администраторов или пользователей.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...