我已经创建了自己的派生UserPrincipal类型,用于获取一些扩展的AD属性。这很好。
现在我正在寻找一种方法来使用groupprincipal对象的GetMembers()方法返回一个自定义UserPrincipal类型的列表。
有点像FindByIdentityWithType在UserPrincipal上工作的方式,其中有一个重载,您可以在其上指定自己的PrincipalType。
有没有办法在GetMembers方法上执行此操作?
答案 0 :(得分:4)
我最终使用AdvancedSearchFilter来构建查询的LDAP成员,而不是GroupPrincipal.GetMembers。
static void Main(string[] args)
{
using (var context = new PrincipalContext(ContextType.Domain))
{
var group = GroupPrincipal.FindByIdentity(context, IdentityType.Name, "Group Name");
UserPrincipalEx qbe = new UserPrincipalEx(context);
qbe.AdvancedSearchFilter.MemberOf(group);
PrincipalSearcher searcher = new PrincipalSearcher(qbe);
var all = searcher.FindAll().OfType<UserPrincipalEx>().ToList();
foreach (var member in all)
{
Console.WriteLine(member.DisplayName);
}
}
}
public class UserPrincipalExSearchFilter : AdvancedFilters
{
public UserPrincipalExSearchFilter(Principal p) : base(p) { }
public void MemberOf(GroupPrincipal group)
{
this.AdvancedFilterSet("memberof", group.DistinguishedName, typeof(string), MatchType.Equals);
}
}
[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("User")]
public class UserPrincipalEx : UserPrincipal
{
private UserPrincipalExSearchFilter searchFilter;
public UserPrincipalEx(PrincipalContext context)
: base(context)
{
}
public UserPrincipalEx(PrincipalContext context,
string samAccountName,
string password,
bool enabled)
: base(context,
samAccountName,
password,
enabled)
{
}
public new UserPrincipalExSearchFilter AdvancedSearchFilter
{
get
{
if (null == searchFilter)
searchFilter = new UserPrincipalExSearchFilter(this);
return searchFilter;
}
}
}
答案 1 :(得分:0)
我没有找到一种从GetMembers函数返回自定义userprincipals的简单方法。我甚至无法将返回的UserPrincipal转换为我的自定义userprincipal。
最后,我通过使用PrincipalSearcher对象上的FindAll方法从我的OU获取所有用户并将其queryfilter设置为我的自定义userprincipal的新类型来解决这个问题。
然后使用基本userprincipal类的GetGroups方法检查每个用户是否是组的成员。