Разрешения пользователя/группы в Active Directory

Где я могу найти пример, который делает следующее?

  • Вытягивает пользователя из Active Directory.
  • Получает группы, в которых пользователь является членом.
  • Получает список разрешений, назначенных каждой группе.

Это похоже на простую задачу, но я не могу найти решение.

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

Ответ 1

Если вы используете .NET 3.5 и выше, вы должны проверить пространство имен System.DirectoryServices.AccountManagement (S.DS.AM). Подробнее читайте здесь:

В принципе, вы можете определить контекст домена и легко найти пользователей и/или группы в AD:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

if(user != null)
{
   // do something here....     
}

// find the group in question
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere");

// if found....
if (group != null)
{
   // iterate over members
   foreach (Principal p in group.GetMembers())
   {
      Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName);
      // do whatever you need to do to those members
   }
}

Новый S.DS.AM позволяет очень легко играть с пользователями и группами в AD!

Последняя точка: разрешения. Они не хранятся в Active Directory - и поэтому вы не можете получить их из любого кода AD.

Разрешения сохраняются в отдельных элементах файловой системы, например. файлы и/или каталоги - или другие объекты (например, ключи реестра и т.д.). Когда у вас есть группа AD или пользовательская учетная запись, вы можете прочитать ее свойство SID (Security Identifier) ​​- что SID будет отображаться в списках контроля доступа (ACL) по всей Windows, но от пользователя или группы нет механизма для получения всех разрешений, которые могут иметь место в машине/сервере.

Разрешения для файлов и каталогов могут, например, извлекаться с использованием метода .GetAccessControl() в классах FileInfo и DirectoryInfo:

FileInfo info = new FileInfo(@"D:\test.txt");
FileSecurity fs = info.GetAccessControl();

DirectoryInfo dir = new DirectoryInfo(@"D:\test\");
DirectorySecurity ds = dir.GetAccessControl();

Расшифровка и понимание этих целей - совершенно другая история!