Сначала я должен перечислить все группы 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
.