Как получить все идентификаторы безопасности (SID), которые соответствуют пользователю Windows? - PullRequest
0 голосов
/ 01 марта 2011

Используя .NET, я хотел бы программно получить список всех групп, членами которых является пользователь Windows, а также всех других SID (идентификаторов безопасности), представляющих вошедшего в систему пользователя.Полученный список должен содержать:

  1. Сам пользователь.
  2. Группы, для которых он является прямым членом
  3. Вложенные группы, для которых он является косвенным пользователем
  4. WellKnownSidType s, которые соответствуют.Например:
    • Все
    • NT AUTHORITY \ Authenticated Users
    • ...

Первый элемент тривиалени я уже могу получить точки 2 и 3, используя System.DirectoryServices и атрибут tokenGroups на DirectoryEntry, представляющий моего пользователя как в этом примере .

Может ли кто-нибудь найти (легкий) способ сделать это

1 Ответ

2 голосов
/ 01 марта 2011

Если вы хотите простой способ, я бы сказал, UserPrincipal.GetAuthorizationGroups действительно легко.Единственное, что вы можете найти его только в .NET 3.5 или более поздней версии.

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
    using (UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "YourUser"))
    {
        foreach (Principal p in user.GetAuthorizationGroups())
        {
             Console.WriteLine(p.Name);
        }
    }
 }

GetAuthorizationGroups возвращает вам все вложенные группы, включая хорошо известный SID.Он пробует разные способы получения информации о вложенной группе.Действительно, один из подходов, которые он использовал, - использовать DirectoryEntry для доступа к атрибуту tokenGroups.

ОБНОВЛЕНИЕ

Чтобы проверить, находится ли текущий пользователь в NT AUTHORITY\INTERACTIVE или LOCAL, мы можем использовать WindowsIdentity.Groups, который напрямую получает текущий токен входа.Обратите внимание, что членство NT AUTHORITY\INTERACTIVE и LOCAL определяется во время выполнения.Пользователь назначен в эти группы на основании того факта, что вы сейчас входите в эту систему.Точно так же на моем Windows 7 я вижу, что мой текущий пользователь для входа также является членом NT AUTHORITY\REMOTE INTERACTIVE LOGON, потому что я входил через удаленный рабочий стол.

 WindowsIdentity id = WindowsIdentity.GetCurrent();
 foreach (var group in id.Groups)
 {
     Console.WriteLine(((NTAccount)group.Translate(typeof(NTAccount))).Value);
 }

Я сожалею, что не знаю ни одногоспособ получить NT AUTHORITY\INTERACTIVE членство для любого произвольного пользователя.Я подозреваю, что такого способа не существует, потому что этот тип членства в группах определяется во время выполнения, только когда этот пользователь действительно входит в систему.

...