首先,我必须枚举当前用户的所有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不是很熟悉。
限制:
System.DirectoryServices.AccountManagement
。答案 0 :(得分:1)
我可以在我的环境中重复你的问题。这对我来说听起来像ADSI中的一个错误。
如果您同时使用serverless binding和SID binding,则返回的COM对象不起作用。
我可以通过不使用无服务器bindnig来解决这个问题。即使用此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++;
}
}
}