URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

ドメインユーザーのパスワード更新日を一覧に出力

 よくある要望だとは思いますが、ADから全ユーザーを引っ張ってきてパスワードをちゃんと更新しているか確認したりとかに使います。
 ついでに、管理ユーザーとかパスワード無期限にしているユーザーも判るようにしろとのこと。
 とりあえずパッと思いついた内容と、手元のパーツを継ぎ接ぎしてして作りました。

Option Explicit On Error Resume Next Const MyDomain = "MY DOMAIN" Const DsQuery = "C:\Windows\System32\dsquery user " Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000 Dim strCmd, strUser, cmdResult, intUAC, MaxPwdAge, EffDays, ExpDay Dim objShell, objExec, objRE, objDom, objUser Dim aryUsers() Dim i, j Set objRE = new RegExp objRE.Pattern = """([^""]*)""" 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 WScript.Echo "ユーザー名,有効期間,最終更新,期限" For Each strUser In aryUsers Set objDom = GetObject("LDAP://" & MyDomain) Set objUser = GetObject("LDAP://" & MyDomain & "/" & objRE.Replace(strUser, "$1")) intUAC = objUser.Get("userAccountControl") If intUAC And ADS_UF_DONT_EXPIRE_PASSWD Then EffDays = "Not Expire" ExpDay = "-" Else Set MaxPwdAge = objDom.Get("maxPwdAge") EffDays = CCur((MaxPwdAge.HighPart * 2 ^ 32) + MaxPwdAge.LowPart) / CCur(-864000000000) ExpDay = DateAdd("d", EffDays, objUser.PasswordLastChanged) End If WScript.Echo objUser.sAMAccountName & "," & EffDays & "," & objUser.PasswordLastChanged & "," & ExpDay Next WScript.Quit(0)

 ユーザー一覧に"dsquery"を使っているあたりがいけてないです。あと、本当にCSVファイルにするときは"cscript //nologo > Result.csv"みたいにリダイレクトするのもいけてないです。
 どうせなら全部VBSとADSIの世界で完結して、ちゃんとファイルを作れと。じゃないと未完ですね。気が向いたら完成させます。
 例によってその場凌ぎで必要な情報が取れればいいやといったところです。