ADユーザー情報を取得するVBScript
興味のある方は少ないと思いますが、ActiveDirectoryからユーザー情報を取得するVBScriptを作成したので、備忘録として記事にしておきます。
Scriptを実行する事により、以下の情報を取得する事ができます。
取得後、EXCELシートに情報を格納します。
- ログオン名
- アカウント表示名
- アカウントの有効/無効状態
- アカウントのロック状態
- 最終ログオン日時
- 最終パスワード変更日時
- パスワード無期限かどうか
- アカウントの説明
- 所属グループ
以下がScriptの内容です。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' PG : ActiveDirectoryの調査
' Author : 2018/04/09 www.adlink-kk.ne.jp
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 定数(ActiveDirectory)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Const ADS_SCOPE_SUBTREE = 5
Const ADS_SCOPE_ONELEVEL = 1
Const ADS_UF_SCRIPT = 1
Const ADS_UF_ACCOUNTDISABLE = 2
Const ADS_UF_HOMEDIR_REQUIRED = 8
Const ADS_UF_LOCKOUT = 16
Const ADS_UF_PASSWD_NOTREQD = 32
Const ADS_UF_PASSWD_CANT_CHANGE = 64
Const ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 128
Const ADS_UF_TEMP_DUPLICATE_ACCOUNT = 256
Const ADS_UF_NORMAL_ACCOUNT = 512
Const ADS_UF_INTERDOMAIN_TRUST_ACCOUNT = 2048
Const ADS_UF_WORKSTATION_TRUST_ACCOUNT = 4096
Const ADS_UF_SERVER_TRUST_ACCOUNT = 8192
Const ADS_UF_DONT_EXPIRE_PASSWD = 65536
Const ADS_UF_MNS_LOGON_ACCOUNT = 131072
Const ADS_UF_SMARTCARD_REQUIRED = 262144
Const ADS_UF_TRUSTED_FOR_DELEGATION = 524288
Const ADS_UF_NOT_DELEGATED = 1048576
Const ADS_UF_USE_DES_KEY_ONLY = 2097152
Const ADS_UF_DONT_REQUIRE_PREAUTH = 4194304
Const ADS_UF_PASSWORD_EXPIRED = 8388608
Const ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = 16777216
Const E_ADS_PROPERTY_NOT_FOUND = &h8000500D
Const ONE_HUNDRED_NANOSECOND = 0.0000001
Const SECONDS_IN_DAY = 86400
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 定数
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Const i = 11
Const EXCEL_TEMLATE_FILE = "userInfo.xls"
Const EXCEL_DRIVER = "Driver={Microsoft Excel Driver (*.xls)};DBQ=BookName;ReadOnly=False;"
Const ADS_PATH = "LDAP://DC=example,DC=com" '環境にあわせて変更
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 変数(ActiveDirectory)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private cnn 'ADODB.Connection(ActiveDirectory)
Private cmd 'ADODB.Command(ActiveDirectory)
Private rs 'ADODB.Recordset(ActiveDirectory)
Private con 'ADODB.Connection(ExcelBook)
Private maxPwdDays 'Password有効期限(PasswordPolisy)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 変数(ユーザー情報)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private userInfo() 'ユーザー情報格納配列(○項目をExcelBookへ出力)
'userInfo(0) :Adspath
'userInfo(1) :アカウント名
'userInfo(2) :アカウント表示名 ○
'userInfo(3) :ログオン名
'userInfo(4) :ログオン名(Windows2000) ○
'userInfo(5) :アカウント有効/無効 ○
'userInfo(6) :アカウントロック ○
'userInfo(7) :最終ログオン日時 ○
'userInfo(8) :最終パスワード変更日時 ○
'userInfo(9) :パスワード無期限 ○
'userInfo(10) :説明 ○
'userInfo(11) :所属グループ ○
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 処理
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Init()
Main()
Term()
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ActiveDirectoryに接続
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Init()
On Error Resume Next
Set cnn = CreateObject("ADODB.Connection")
cnn.Provider = "ADsDSOObject"
cnn.Open "Active Directory Provider"
'PasswordPolisyからPassword有効期限を取得
Set objDomain = GetObject("ADS_PATH")
Set objMaxPwdAge = objDomain.Get("maxPwdAge")
maxPwdNano = abs(objMaxPwdAge.HighPart * (2 ^ 32) + objMaxPwdAge.LowPart)
maxPwdSecs = maxPwdNano * ONE_HUNDRED_NANOSECOND
maxPwdDays = CInt(maxPwdSecs / SECONDS_IN_DAY)
If Err Then
Call Term()
WScript.Echo "ActiveDirectoryに接続できませんでした!"
End If
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ユーザー情報を取得
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Main()
On Error Resume Next
'EXCELBOOKコピー>接続
Set fso = CreateObject("Scripting.FileSystemObject")
Set book = fso.GetFile(fso.BuildPath(fso.GetParentFolderName(WScript.ScriptFullName), EXCEL_TEMLATE_FILE))
newbook = Replace(DateSerial(Year(Now),Month(Now),Day(Now)),"/","") & "_" & EXCEL_TEMLATE_FILE
newbook = fso.BuildPath(fso.GetParentFolderName(WScript.ScriptFullName), newbook)
book.Copy newbook
Set book = Nothing
Set fso = Nothing
Set con = CreateObject("ADODB.Connection")
con.Open Replace(EXCEL_DRIVER,"BookName",newbook)
'ユーザー情報抽出
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = cnn
cmd.Properties("Page Size") = 1000
cmd.Properties("Timeout") = 30
cmd.Properties("Searchscope") = ADS_SCOPE_SUBTREE '5階層迄検索
cmd.Properties("Cache Results") = False
cmd.CommandText = "SELECT AdsPath FROM '" & ADS_PATH & "' WHERE objectCategory='user'"
Set rs = cmd.Execute
rs.MoveFirst
Do Until rs.EOF
Redim userInfo(i)
getUserInfo(GetObject(rs.Fields("AdsPath").Value))
setExcelBook()
rs.MoveNext
Loop
rs.Close
cnn.Close
con.Close
If Err Then
Call Term()
WScript.Echo "ADスキーマ取得に失敗しました!"
End If
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ActiveDirectoryから切断
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Term()
Set rs = Nothing
Set cmd = Nothing
Set cnn = Nothing
Set con = Nothing
WScript.Quit
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ユーザー情報を配列に格納する
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub getUserInfo(ByRef objUser)
On Error Resume Next
userInfo(0) = objUser.AdsPath
userInfo(1) = objUser.Name
userInfo(2) = objUser.displayName
userInfo(3) = objUser.userPrincipalName
userInfo(4) = objUser.sAMAccountName
If objUser.AccountDisabled = True Then
userInfo(5) = "無効"
Else
userInfo(5) = "有効"
End If
If objUser.IsAccountLocked = True Then
userInfo(6) = "ロック有"
Else
userInfo(6) = "ロック無"
End If
Set objLastLogon = objUser.Get("lastLogon")
userInfo(7) = objLastLogon.HighPart * (2 ^ 32) + objLastLogon.LowPart
userInfo(7) = userInfo(7) / (60 * 10000000)
userInfo(7) = userInfo(7) / 1440
userInfo(7) = userInfo(7) + #1/1/1601#
userInfo(7) = userInfo(7) + #9:00:00 AM#
On Error Resume Next
userInfo(8) = objUser.passwordLastChanged
If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then
userInfo(8) = "変更履歴なし"
Err.Clear
Else
passday = DateDiff("d",userInfo(8),Now()) 'パスワード変更後の経過日数
End If
On Error GoTo 0
If Not objUser.userAccountControl AND ADS_UF_DONT_EXPIRE_PASSWD Then
userInfo(9) = "期限あり"
Else
userInfo(9) = "期限なし"
End If
userInfo(10) = objUser.Description
On Error Resume Next
userInfo(11) = vbNullString
If Not IsNull(objUser.GetEx("memberOf")) Then
If Not Err Then
For Each groupAdsPath in objUser.GetEx("memberOf")
Set objGroup = GetObject("LDAP://" & groupAdsPath)
If userInfo(11) <> vbnullstring Then
userInfo(11) = userInfo(11) & "・" & objGroup.CN
Else
userInfo(11) = objGroup.CN
End If
Next
End If
End If
Err.Clear
On Error GoTo 0
If Err Then
Call Term()
WScript.Echo "ユーザー情報取得に失敗しました!"
Else
WScript.Echo userInfo(4) & " の情報を取得しました。"
End If
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' EXCELにユーザー情報を挿入する
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub setExcelBook()
On Error Resume Next
sql = vbNullString
sql = sql & "INSERT INTO [userInfo$]("
sql = sql & "ログオン名,"
sql = sql & "アカウント表示名,"
sql = sql & "アカウント有効・無効,"
sql = sql & "アカウントロック,"
sql = sql & "最終ログオン日時,"
sql = sql & "最終パスワード変更日時,"
sql = sql & "パスワード無期限,"
sql = sql & "説明,"
sql = sql & "所属グループ) "
sql = sql & "VALUES('"
sql = sql & userInfo(4) & "','"
sql = sql & userInfo(2) & "','"
sql = sql & userInfo(5) & "','"
sql = sql & userInfo(6) & "','"
sql = sql & userInfo(7) & "','"
sql = sql & userInfo(8) & "','"
sql = sql & userInfo(9) & "','"
sql = sql & userInfo(10) & "','"
sql = sql & userInfo(11) & "')"
con.Execute sql
If Err Then
WScript.Echo userInfo(4) & " のEXCEL出力に失敗しました!"
End If
End Sub
