ADユーザー情報を取得するVBScript
興味のある方は少ないと思いますが、ActiveDirectoryからユーザー情報を取得するVBScriptを作成したので、備忘録として記事にしておきます。
Scriptを実行する事により、以下の情報を取得する事ができます。
取得後、EXCELシートに情報を格納します。
- ログオン名
- アカウント表示名
- アカウントの有効/無効状態
- アカウントのロック状態
- 最終ログオン日時
- 最終パスワード変更日時
- パスワード無期限かどうか
- アカウントの説明
- 所属グループ
以下がScriptの内容です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 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 |