- PR -

ActiveDirectoryへのアカウント登録でロールバック処理はできますでしょうか?

1
投稿者投稿内容
YASU
会議室デビュー日: 2003/10/27
投稿数: 9
投稿日時: 2006-07-05 12:00
.NET Framework2.0のC#(Windowsアプリケーション)で、System.DirectoryServicesを使用して、ActiveDirectoryへアカウントを登録するプログラムを作成しております。

以下のようなソースで登録処理自体は問題なく行なえているのですが、今の状態では、アカウントをActive Directoryに登録後にグループに追加をするという処理になっていす。

もしアカウントのみの登録が成功し、グループ追加に失敗をした場合、アカウントのみが作成されグループへの追加がされない状態でActiveDirectoryに登録されてしまいます。

また、色々なサイトを参考にさせていただいた所、パスワードを設定するためには、一度アカウントの登録をコミットさせないといけないとありました。
この場合でももしパスワードの設定でエラーとなってしまった場合、アカウント情報が不完全な状態で登録されてしまいます。

DBのトランザクション処理のように登録時にエラーとなった場合には、アカウント登録自体をロールバックするような事は可能なのでしょうか?

どうぞ、よろしくお願いします。

【ソース】
※実際のソースを若干修正しているので、このままでは動作しないかもしれません。

DirectoryEntry objCreateEntry = new DirectoryEntry("LDAP://yyyy.xxx.co.jp/OU=XXXX,DC=xxx,DC=co,DC=jp","管理者ID","管理者パスワード",AuthenticationTypes.Secure);

DirectoryEntry objADUser = objCreateEntry.Children.Add("Taro Yamada", "user");

//属性設定(アカウントオプション以外)
objADUser.Properties["sAMAccountName"].Add("Taro");
〜 その他の属性をセット 〜

//アカウントを一度確定
objADUser.CommitChanges();

//パスワードを設定
objADUser.Invoke("SetPassword", new object[] { "password" });
//パスワードを無期限にするアカウントオプション
objADUser.Invoke("Put", "UserAccountControl",65536);
objADUser.CommitChanges();

//グループに追加
DirectoryEntry groupEntry = new DirectoryEntry("LDAP://yyyy.xxx.co.jp/CN=グループ名,OU=XXXX,DC=xxx,DC=co,DC=jp","管理者ID","管理者パスワード",AuthenticationTypes.Secure);
groupEntry.Invoke("Add", new object[] { "LDAP://yyyy.xxx.co.jp/CN=Taro Yamada,OU=XXXX,DC=xxx,DC=co,DC=jp" });

//アカウントを有効化
IADsUser adUser;
adUser = (IADsUser)(objADUser.NativeObject);
//ユーザオブジェクトを更新
adUser.SetInfo();
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-07-05 13:54
こんにちは。

勘なので突っこみが入るかもしれませんが、ADSI の OLEDB プロバイダと ADO.NET を組み合わせてコーディングすれば OleDbConnection クラス のトランザクション機能が使えるんじゃないですかね。

_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
1

スキルアップ/キャリアアップ(JOB@IT)