人気ブログランキング | 話題のタグを見る
(.Net,ADSI)新規ユーザ作成直後のパスワードの変更とアカウント有効
.Net から ActiveDirectory の新規ユーザ作成すると、デフォルトでアカウントが無効となっています。
でも、userAccountControl フラグを設定して Commit すると有効になるようです。(もしくは、先にコミットしてから userAccountControl フラグ編集し、再度 Commit という手もありますが。。)
前者の場合のソースです。(C#)

//mDrctEntryは
DirectoryEntry mDrctEntry = new DirectoryEntry("LDAP://domaincntrlsvname/DC=testdomain,DC=local", "administrator", "adminpasswd");
//OUオブジェクト取得
DirectoryEntry entOu = mDrctEntry.Children.Find("OU=" + "testOU");
 
// ユーザオブジェクトを指定したOUに作成
DirectoryEntry dEntUsr = entOu.Children.Add("CN=" + "hoge tarou", "user");
// ユーザオブジェクトに各種情報追加
dEntUsr.Properties["samAccountName"].Value = "hoge001";
dEntUsr.Properties["displayName"].Value = "hoge tarou";
dEntUsr.Properties["sn"].Value = "hoge";
dEntUsr.Properties["givenName"].Value = "tarou";
dEntUsr.Properties["userPrincipalName"].Value = "hoge tarou";
 
//アカウントオプション。パスワード無期限と、通常ユーザ指定。ここで変更するとアカウント有効になる。
int val = cDONT_EXPIRE_PASSWORD | cNORMAL_ACCOUNT;
//アカウントオプションをユーザーオブジェクトに設定
dEntUsr.Properties["userAccountControl"].Value = val;
 
//新規ユーザオブジェクトをサーバに保存
dEntUsr.CommitChanges();
//保存した後にパスワードセット
dEntUsr.Invoke("SetPassword", "newPassword!1");
//dEntUsr.Invoke("ChangePassword", "oldPassword!1", "newPassword!1");//旧入れてOKなら新入れる方法
//dEntUsr.Password = user.Password; //この方法は何故かダメ。
//dEntUsr.CommitChanges();


ユーザアカウントのパスワードを変更する方法ですが、下記の2種類あるようです。

//管理者権限持ってる場合に強制的にパスワード変更する。MMCのユーザ管理でコンテキストメニューの"パスワードの設定"と同じ動作
DirectoryEntry.Invoke("SetPassword", "new password");
//ユーザが自分の権限でも行えるパスワード変更。旧パスワードを指定し新しいパスワードを入れる
DirectoryEntry.Invoke("ChangePassword", "old password" , "new password");


あと、DirectoryEntry.Password というプロパティがあって、セッターのみあったんですが、ためしにここにパスワード文字列指定してみましたが、これだとちゃんと設定できませんでした。
まぁMSDN:ユーザー パスワードの管理でもInvokeで、SetPassword,ChangePasswordを使う方法が書いているんでそっちが正道ということでしょうか。

参考:
[ADSI]ActiveDirectoryのユーザのパスワードを管理する - ComponentGeek Article
[ADSI] ユーザ状態による、SetPassword, ChangePassword, ValidateCredentials(ユーザ検証)の成否メモ - ComponentGeek Article アカウントオプションのステータスでそれぞれのパスワード変更メソッドが動作するかどうかの検証がなされています。
by jehoshaphat | 2010-04-22 13:01 | .Net開発


<< (.Net)フォームを非表示で... (.Net,ADSI)Acti... >>