| Works
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は冗長になってしまいますね…。