Подсчет членов группы безопасности Active Directory - PullRequest
2 голосов
/ 10 февраля 2011

Сначала я должен перечислить все группы AD текущего пользователя. Получить SID и имя легко:

foreach(var group in WindowsIdentity.GetCurrent().Groups)
{
   var sid = new SecurityIdentifier(group.Value);
   string name = (group.Translate(typeof(NTAccount)) as NTAccount).Value;
}

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

То, что я сделал до сих пор: я попытался выполнить запрос WMI , подобный этому, но он не дал результатов, потому что мне понадобилось бы полное доменное имя, но NTAccount дает мне только «дружественную» учетную запись домена (ДОМЕН \ группа):

SELECT PartComponent FROM Win32_GroupUser 
WHERE (GroupComponent = "Win32_Group.Domain='somedomain', Name='somegroup'")

Затем я попытался LDAP , обойдя пропущенный путь / Отличительное имя, связавшись с SID группы:

var adGroupEntry = new DirectoryEntry(String.Format("LDAP://<SID={0}>", group.Value));
if (adGroupEntry != null)
{
  IEnumerable members = adGroupEntry.Invoke("Members", null) as IEnumerable;
  if (members != null)
  {
    foreach (object member in members)
    {
      noOfMembers++;
    }
  }
}

Он находит группу, свойство name возвращает правильное значение, однако Members никогда не содержит никаких элементов. Если бы я знал полный путь LDAP для группы (например, когда я его жестко запрограммировал), приведенный выше код на самом деле мог бы дать правильное количество пользователей в группе.

Что мне здесь не хватает? Я не очень знаком с Active Directory или WMI.

Ограничения:

  • Я не могу жестко закодировать любые доменные имена или пути LDAP.
  • Я ограничен .NET 2.0, поэтому не могу использовать System.DirectoryServices.AccountManagement.

1 Ответ

1 голос
/ 11 февраля 2011

Я могу воспроизвести вашу проблему в моем окружении.Для меня это звучит как ошибка в ADSI.

Возвращенный COM-объект не работает, если вы одновременно используете безсерверное связывание и SID связывание .

Я мог бы обойти это, не используя привязку к серверу.то есть используя это LDAP://*yourdomain.com*/<SID={0}> вместо

Я мог бы также обойти это, связав объект снова.

var adGroupEntry = new DirectoryEntry(String.Format("LDAP://<SID={0}>",group.Value));
string dn = adGroupEntry.Properties["distinguishedName"].Value as string;
DirectoryEntry de = new DirectoryEntry("LDAP://" + dn);
if (de != null)
{
    IEnumerable members = de.Invoke("Members", null) as IEnumerable;
    if (members != null)
    {
        foreach (object member in members) 
        {
            noOfMembers++;     
        }   
    } 
} 
...