ここ数日からディレクトリ サービスを使用しています。
UserPrincipal オブジェクトを使用して、現在の AD ユーザーから電子メールと会社のフィールドを取得しようとしました。メールはデフォルトで公開されているので問題ありません。しかし、会社は別の話です。
ここで、その方法を説明する投稿を見つけました: Get job title using System.DirectoryServices.AccountManagement
ただし、この方法には残念な問題があります。この投稿は、拡張クラスで FindByIdentity メソッドを作成する方法を示していますが、それを機能させるには、検索タイプを拡張クラス タイプに設定する必要があります。これにより、結果として特定のユーザーのエントリが見つかりません。FindByIdentityWithType で検索タイプを UserPrincipal に設定すると、AD ユーザーは検出されますが、ご想像のとおり、変換エラーが発生します。
私の質問は非常に単純です。拡張クラスで ID によって検索する既知の方法はありますか?
参考までに、私の拡張クラスは次のとおりです。
[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 を返す Call ですが、company フィールドの値はありません。
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 で DLL を逆コンパイルした後、コードに問題があることに気付きました。
[DirectoryObjectClass("Person")]
[DirectoryRdnPrefix("CN")]
DirectoryObjectClass は「Person」でなければなりませんでした
これが他の体に役立つことを願っています!