2

ここ数日からディレクトリ サービスを使用しています。

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」でなければなりませんでした

これが他の体に役立つことを願っています!

4

0 に答える 0