URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

Windows Server 2003環境でドメインユーザーのパスワードを無期限にする

 Windows Server 2003のサポート終了まであと一年くらいですが、まだまだ随所で使われていると思います。
 そんなわけでWindows Server 2003のActive Directoryとかをいじる機会もそれなりにあります。むしろ、これから移行案件が活発になれば頻度は高くなるかもですね。

 Active Directory環境でドメインユーザーのパスワードを無期限にするには、ユーザーのプロパティから該当の項目にチェックを入れるだけですが、これを一括で全ユーザーにやろうとするとスクリプトとかでやらないと非常に面倒です。(サードパーティの管理ツールならGUIでできるのかもしれませんが。)
 ADの管理については、最近のWindowsだとPowerShellでいろいろできると思いますが、今回はWindows Server 2003がターゲットということで当然のようにPowerShellはインストールされていません。
 そのため、このへんを参考にds~コマンドを使います。

C:\>dsquery user … ユーザー一覧(DN名)を出力
C:\>dsmod user <ユーザー名(DN名)> -pwdneverexpires yes … パスワードを無期限にする
C:\>dsget user <ユーザー名(DN名)> -pwdneverexpires … 設定の確認

 あとは"dsquery"で表示されたユーザー(必要に応じて除外する)にループ処理で"dsmod"を実行していくだけです。
 これくらいならBATファイルでも十分なのですが、別のところで久々にVBScriptを使うことになりそうなので、ちょっとリハビリがてらに書いてみました。
 追加の条件で「簡単な結果の出力」「無効になってるアカウントは除外」あたりの処理を入れています。

Option Explicit On Error Resume Next Const DsQuery = "C:\Windows\System32\dsquery user " Const DsGet = "C:\Windows\System32\dsget user " Const DsMod = "C:\Windows\System32\dsmod user " Dim strCmd, strUser, cmdResult Dim objShell, objExec, objRE Dim aryUsers(), aryTemp(2) Dim i, j Set objRE = new RegExp objRE.Pattern = ".*yes.*" Set objShell = WScript.CreateObject("WScript.Shell") i = 0 Set objExec = objShell.Exec(DsQuery) Do While objExec.Status = 0 WScript.Sleep 100 If i >= 6000 Then objExec.Terminate End If i = i + 1 Loop j = 0 Do Until objExec.StdOut.AtEndOfStream redim Preserve aryUsers(j) aryUsers(j) = objExec.StdOut.ReadLine j = j + 1 Loop cmdResult = objExec.ExitCode If cmdResult <> 0 Then WScript.Echo "ユーザー一覧の取得に失敗しました!!!" WScript.Quit(1) End If For Each strUser In aryUsers i = 0 strCmd = DsGet & strUser & " -disabled" Set objExec = objShell.Exec(strCmd) Do While objExec.Status = 0 WScript.Sleep 100 If i >= 6000 Then objExec.Terminate End If i = i + 1 Loop j = 0 Do Until objExec.StdOut.AtEndOfStream aryTemp(j) = objExec.StdOut.ReadLine j = j + 1 Loop If objRE.Test(aryTemp(1)) Then WScript.Echo strUser & "は無効です!!!" Else i = 0 strCmd = DsMod & strUser & " -pwdneverexpires yes" Set objExec = objShell.Exec(strCmd) Do While objExec.Status = 0 WScript.Sleep 100 If i >= 6000 Then objExec.Terminate End If i = i + 1 Loop cmdResult = objExec.ExitCode If cmdResult <> 0 Then WScript.Echo "ユーザー" & strUser & "の設定変更に失敗しました!!!" WScript.Quit(2) End If WScript.Echo "設定変更 : " & strUser End If Next WScript.Quit(0)

 例によってとりあえず動くところまでしか確認していません。
 実際に使うときには、もう少し整理していこうと思います。変数がちょっと…。
 しかし、相変わらずVBSは冗長になってしまいますね…。