| Works
ドメインユーザーのパスワード更新日を一覧に出力
よくある要望だとは思いますが、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の世界で完結して、ちゃんとファイルを作れと。じゃないと未完ですね。気が向いたら完成させます。
例によってその場凌ぎで必要な情報が取れればいいやといったところです。