从最近几天开始,我一直在使用目录服务。
使用 UserPrincipal 对象,我尝试从当前 AD 用户获取电子邮件和公司字段。电子邮件不是问题,因为默认情况下它是公开的。公司是另一回事。
我在这里找到了一篇解释如何执行此操作的帖子:Get job title using System.DirectoryServices.AccountManagement
虽然,我对这种方法有一个不幸的问题。该帖子显示了如何在扩展类中创建 FindByIdentity 方法,但为了使其工作,您必须将搜索类型设置为您的扩展类类型,结果必须找不到我的特定用户的条目。如果我在 FindByIdentityWithType 中将搜索类型设置为 UserPrincipal,它确实会找到我的 AD 用户,但正如您所料,我遇到了转换错误。
所以我的问题很简单,有没有已知的方法可以在扩展类中按身份查找?
参考这里是我的扩展类:
[DirectoryObjectClass("group")]
[DirectoryRdnPrefix("CN")]
public class UserPrincipalClassExtensions : System.DirectoryServices.AccountManagement.UserPrincipal
{
PrincipalContext context;
public UserPrincipalClassExtensions(PrincipalContext context)
: base(context)
{ this.context = context; }
public UserPrincipalClassExtensions(PrincipalContext context, string samAccountName, string Password,bool enabled)
: base(context, samAccountName, Password, enabled)
{
}
[DirectoryProperty("company")]
public string Company
{
get
{
if (ExtensionGet("company").Length != 1)
return null;
return (string)ExtensionGet("company")[0];
}
set { this.ExtensionSet("company", value); }
}
// Implement the overloaded search method FindByIdentity.
public static new UserPrincipalClassExtensions FindByIdentity(PrincipalContext context, string identityValue)
{
return (UserPrincipalClassExtensions)FindByIdentityWithType(context, typeof(UserPrincipalClassExtensions), identityValue);
}
// Implement the overloaded search method FindByIdentity.
public static new UserPrincipalClassExtensions FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
{
return (UserPrincipalClassExtensions)FindByIdentityWithType(context, typeof(UserPrincipalClassExtensions), identityType, identityValue);
}
}
这是一个返回 null 的调用:
SPUser user = SPContext.Current.Web.CurrentUser;
using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, getUserDomain(user)))
{
UserPrincipalClassExtensions UserInfos = UserPrincipalClassExtensions.FindByIdentity(principalContext,IdentityType.SamAccountName,user.Name);
}
这是一个返回 UserPrincipal 但没有公司字段值的调用:
SPUser user = SPContext.Current.Web.CurrentUser;
using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, getUserDomain(user)))
{
UserPrincipal UserInfos = UserPrincipal.FindByIdentity(principalContext,IdentityType.SamAccountName,user.Name);
}
如果您需要任何进一步的信息,请告诉我!
提前感谢您!
编辑
在 IL Spy 中搜索并反编译 de DLL 后,我注意到我的代码有一个问题:
[DirectoryObjectClass("Person")]
[DirectoryRdnPrefix("CN")]
DirectoryObjectClass 必须是“人”
希望这会帮助其他人!