Active Directory で顔写真 (2)

さて前回の続きではないですが、Active Directoryで顔写真が使えるのはわかったけど、登録がちょっと面倒くさいな、ということで自分自身の画像をいつでも更新できるようにしたいと思います。

Active Directory上の各属性は権限がないともちろん更新できませんが、ユーザーオブジェクト等の一部属性は自分自身で更新できる権限を持っています。

さて件のthumbnailPhoto属性そのものに権限を付けてもいいのですが、TechNetを見るとthumbnailPhoto属性は個人情報プロパティセットに纏められてるようです。

http://technet.microsoft.com/ja-jp/library/cc728117(WS.10).aspx

今回は自分自身に権限があるかどうかを見てみたいので、ADSIEDIT.MSCを使って、自分自身であるSELFが権限を持ってるか見たいと思います。

ということでSELFだと書き込みもOKなようです。

※なんだか結論ありきな書き方ですがキニシナイ

んでは自分自身で更新できることが分かったので、そのようなツールを作ってみましょう。
Active Directory にアクセスするのは別サイトで紹介したLINQ to ADを使いました。すっごい便利ですね。(Byte配列弄るためにちょっとだけ修正入れましたけど)

具体的にLINQ to ADでいじった個所は以下の通りです。

DirectorySource.cs 422行目あたり

PropertyValueCollection pvc = e.Properties[da[0].Attribute];
if (i.PropertyType.Equals(typeof(byte[])))
{
    i.SetValue(result, pvc.Value == null ? null : pvc[0], null);
}
else if (i.PropertyType.IsArray)

byte[]かどうかをチェックしてbyte[]で返すようにしてます。無理やりですね。
Active Directory の属性って配列でもってるんですよね。だから標準はArrayで返すようになってるわけです。(値を1つしかもってなくてもArrayなんだよなぁ)
Entity側でbyte[]にしなけりゃこんなことにはならなかった…んですが、まぁいいか。Arrayで返してもらった方がActive Directoryらしくて良かったなw(どうせラッパー作るんだし)
あとEntity側ではthumbnailPhoto属性を追加しました。

Entities.cs

private byte[] thumbnailPhoto;

[DirectoryAttribute("thumbnailPhoto")]
public byte[] ThumbnailPhoto
{
    get { return thumbnailPhoto; }
    set{
        if (thumbnailPhoto != value)
        {
            thumbnailPhoto = value;    
            OnPropertyChanged("ThumbnailPhoto");
        }
    }
}

thumbnailPhotoの取得はこんな感じでできます。

var myusers = new DirectorySource<MyUser>(new DirectoryEntry("LDAP://"+ _DomainName), SearchScope.Subtree);
foreach (var currentuser in myusers.Where(u => u.AccountName == _UserName))
{
    _DisplayName = currentuser.DisplayName;
    if (currentuser.ThumbnailPhoto == null)
    {
         _ThumbnailPhoto = null;
    }
    else
    {
        using (MemoryStream stmBLOBData = new MemoryStream(currentuser.ThumbnailPhoto))
        {
            long leng = stmBLOBData.Length;
            _ThumbnailPhoto = new byte[leng];
            stmBLOBData.Read(_ThumbnailPhoto, 0, (int)leng);
        }
    }
    break;
}

あとは画像を読み込んだり、保存したりするフロント側を作っておしまい。
結果はこんな感じに仕上がりました。

すっごくシンプルですね。
LINQ使えるので、管理者用にバルクで登録とかできるアプリや、クライアントにアプリの展開が面倒ならWebアプリとかにするとステキかもしれないです。(ただWebアプリにすると実行権限周りの問題が出そうだけど)

記載したサンプルのソースとかバイナリはWordPressはZipがUploadできなかったので、何か別の手段でUpしようと思います。

そんなきたねぇソース書いてんじゃねーよとかツッコミ歓迎です。こんな風にしたらいいよみたいなレビューしてほしいぐらい。。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中