【发布时间】:2011-06-25 00:54:09
【问题描述】:
首先,我必须枚举当前用户的所有 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。
【问题讨论】:
标签: .net active-directory wmi directoryservices