Проверьте авторизацию на объекте ActiveDirectory - PullRequest
0 голосов
/ 22 июля 2011

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

NTAccount Account = new NTAccount("Domain\\XYZ");
SecurityIdentifier Sid =
(SecurityIdentifier)Account.Translate(typeof(SecurityIdentifier));

Это, кажется, позволяет мне получить конкретное представление из строкового представления пользователя. Другая часть головоломки, я думаю, это:

string strMemberString = "LDAP://OU=Test,DC=Domain,DC=local";
DirectoryEntry computers = new DirectoryEntry();
computers.Path = strMemberString;
computers.Options.SecurityMasks = SecurityMasks.Owner | SecurityMasks.Group
| SecurityMasks.Dacl | SecurityMasks.Sacl;

foreach (DirectoryEntry computer in computers.Children)
{
   if (computer.Name == "CN=Test")
   {
      ActiveDirectorySecurity sdc = computer.ObjectSecurity;
      //...

Не уверен, куда идти дальше. Как мне закончить это? Есть ли совершенно другой способ, которым я должен следовать? Я использую .net 4.0.

Я бы предпочел, чтобы решение было целиком кодом BCL, а не PInvoke или WMI.

Ответы [ 2 ]

0 голосов
/ 23 июля 2011

Вам необходимо проверить атрибут allowAttributesEffective.

0 голосов
/ 22 июля 2011

Я думаю, что лучший способ - это найти класс, который предоставляет «Действующие права», как представлено на вкладке расширенного диалогового окна на вкладке безопасности объекта AD:

enter image description here

Существует также инструмент командной строки с именем ACLDiag.exe , который делает то, что вы хотите.


(Edited) Найти группы, к которым принадлежит пользователь, можно

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

  • Использование специального правила сопоставления, называемого "LDAP_MATCHING_RULE_IN_CHAIN" (см. Синтаксис поискового фильтра для получения дополнительной информации ). Я привожу пример в этот другой вопрос . Это тоже немного долго, но, насколько я знаю, это единственный способ получить группы безопасности и рассылки.

  • использовать атрибут tokenGroups . Это вычисляемый атрибут, который содержит идентификаторы каждой группы безопасности, членом которой является пользователь, включая косвенные группы. Я думаю, что это тот, который вы можете использовать, и который предоставляется с UserPrincipal.GetAuthorizationGroups (в пространстве имен System.DirectoryServices.AccountManagement и представлен в .Net 3.5)

...