UserPrincipal.Save()で君が消えた!

人生 3x 年 (注 : 10 進数) にして、久々に 40 度熱がでました。驚き。そして、それを治そうと激しくいつもの 1.5 倍のご飯をかっ食らったところ、なんと 2 日で 3kg も太りました。さらに驚き。
この肉をどうやって落とすべきか苦悩しているのですが、来週から実家に行こうと思っていますが、実家食でまた太りそうで怖いです。
ちなみに私は大学時代、今の体重 + 20kg あったのですが、先輩にお姫様抱っこをしてもらったところ、なんと先輩がそれでぎっくり腰になって以来体重増加がトラウマになっています…。

さてそんなろくでもない思い出を消し去りたいと思うのは人間の性ですが、今日は消しちゃダメなのを消しちゃうという件についてご紹介させていただきます。

今日のお題 :
System.DirectoryServices.AccountManagement.UserPrincipal.Save() メソッドを既存のユーザのオブジェクトに対して行うとオブジェクトが削除されてしまう。

状況 :
以下はコードの一例です。
これを実行すると、まず一回目はユーザが作成されます。
もう一度実行すると、ユーザが既に存在する旨の例外が発生しますが、その際に対象のユーザ オブジェクトが Active Directory から削除されてしまいます。

        PrincipalContext cn = new PrincipalContext(ContextType.Domain, "DomainName", "OU=xxx,OU=xxx,OU=xxx,OU=xxx,DC=xxxxx,DC=xxxx,DC=co,DC=jp", "adminUser", "password");

        UserPrincipal p = new UserPrincipal(cn, "testUser1", "pass", true);

        try

        {

            p.Save();

        }

対応方法 :
現状の回避策としては、UserPrincipal.Save() メソッドを実行する前に以下の判定を行っていただくこととなります。

 ・同じ SamAccountName が存在するか?
 ・同じ パスを持つ CN 名が存在するか?

ステータス :
これは弊社製品の障害です。次期サービス パックなどに修正を含める予定です。
この問題はつい最近発見されたものであるため、.NET Framework のサービス パックなどには入っていません。
そのため、今後リリースされるサービス パックに入れる予定というところまでしか決まっておらず、日程も今のところ不明というのが実情です。本当に申しわけございません。

この問題については米国の ADSI チームと共同で調査を行いました。
米国上級エンジニアがかなり真摯に取り組み、製品開発チームに修正を働きかけています。お陰で次期サービスパックに入る予定になることができました。
製品開発チームでは、この件について障害であることは確認しましたが、根本原因についてはまだ調査を進めている状況です。

****

皆様にはご迷惑をおかけしておりますことを心よりお詫び申し上げます。
上記クラスをご利用の方はどうぞ、上記の回避策を実装くださいますようお願いいたします。

(2008/09/14 追記) US の上級エンジニアの Blog にもこの件が載りました。以下リンクです。

https://blogs.msdn.com/maxv/archive/2008/09/12/creating-a-new-userprincipal-or-groupprincipal-for-existing-object-when-saved-causes-object-to-be-deleted.aspx

-- ういこ --