3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.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 アカウントオプションのステータスでそれぞれのパスワード変更メソッドが動作するかどうかの検証がなされています。