Во-первых, мне нужно перечислить все группы 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
дает мне только "дружественную" учетную запись домена (DOMAIN \ group ):
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
.