2012年12月14日金曜日

System.DirectoryServices.AccountManagement で AD から任意の属性取得

.Net  3.5 から AD の操作をするには System.DirectoryServices.AccountManagement を使う
のが推奨のようだが、UserPrincipal クラスで取得できる属性が限られている。
しかも sAMAccountName が SamAccountName というプロパティ名だったりして使いづらい。

いろいろ調べたら以下の URL に拡張の仕方が書いてあった。

プリンシパルの拡張
http://msdn.microsoft.com/ja-jp/library/bb384372%28v=vs.90%29.aspx

まず、以下のような UserPrincipal クラスのサブクラス(ここでは UserPrincipalExt)を作成。
getValueByAttributeName() つー独自のメソッドを実装し、FindByIdentity() を override してる。

    [DirectoryObjectClass("user")]
    class UserPrincipalExt : UserPrincipal
    {
        public UserPrincipalExt(PrincipalContext context)
            :base(context){}


        public object[] getValueByAttributeName(String attrName)
        {
            return  ExtensionGet(attrName);
        }


        public static new UserPrincipalExt FindByIdentity(
            PrincipalContext context,
            IdentityType identityType,
            string identityValue)
        {
            return (UserPrincipalExt)FindByIdentityWithType(
                context,
                typeof(UserPrincipalExt),
                identityType,
                identityValue);
        }
    }


 

んで、以下みたいに呼び出し。  以下はwWWHomePage を取得しているが
"sAMAccountName" 等の標準の属性も LDAP の名前のまま取得できる模様。

  PrincipalContext ctxt = new PrincipalContext(
      ContextType.Domain, "mydomain", "binduser", "bindpasswd");
  UserPrincipalExt target = UserPrincipalExt.FindByIdentity(
      ctxt, IdentityType.SamAccountName, "myusername");
  object[] res = target.getValueByAttributeName("wWWHomePage");

0 件のコメント:

コメントを投稿