Active Directoryのユーザの所属するグループをツリー構造で表示させる@VBScript

001.png
前回作ったグループのツリー表示と逆で、今度はユーザに紐付くグループの一覧を表示できるようにしてみました。普通に一覧表示すると所属している最初のグループしか表示出来ないんだけど、このスクリプトを使えばActive Directory上の所属しているすべてのグループを一覧出来ます。
※ただしDomain Usersは表示されません。

また、以下の部分は環境に応じて変更してください。

DomainName = "dc=pnpk,dc=local"

Option Explicit

Const ADS_SCOPE_SUBTREE = 2

Dim SQL,SQL_QUERY
Dim DomainName

'//////////////ドメイン名を入力//////////////
DomainName = "dc=pnpk,dc=local"

'追加検索条件
'(例)
'SQL_QUERY  = " Name = 'administrator'"
SQL_QUERY  = ""

'SQL_QUERYに何か指定があった場合、ANDを追加
If SQL_QUERY <> "" Then
	SQL_QUERY = " AND " & SQL_QUERY
End If

SQL = "SELECT distinguishedName FROM 'LDAP://" &_
 DomainName & "' WHERE objectCategory='user'" &_
 SQL_QUERY

'QueryADSIの呼び出し
Call QueryADSI(SQL)

'////////////ADSIにクエリ問い合わせ////////////
'SQLクエリでActive Directory内を検索します。
Function QueryADSI(SQL)

	Dim objConnection,objCommand

	Set objConnection =_
	 CreateObject("ADODB.Connection")
	Set objCommand =_
	 CreateObject("ADODB.Command")
	objConnection.Provider =_
	 "ADsDSOObject"
	objConnection.Open "Active Directory Provider"
	Set objCommand.ActiveConnection =_
	 objConnection

	objCommand.Properties("Page Size") = 1000
	objCommand.Properties("Searchscope") =_
	 ADS_SCOPE_SUBTREE

	objCommand.CommandText = SQL

	Dim objRecordSet

	Set objRecordSet =_
	 objCommand.Execute

	objRecordSet.MoveFirst
	
	Do Until objRecordSet.EOF
		'ShowStatusの呼び出し
		Call ShowStatus(objRecordSet.Fields("distinguishedName").Value, 0)
		
		objRecordSet.MoveNext
	Loop
End Function


'////////////DN名を利用して情報を取得////////////
Function ShowStatus(DN,cnt)
	Dim adsUser,adsMember,adsMemberGroup
	Dim strName
	Dim i
	Dim stdout
	
	Dim Members
	Dim ArrMembers

	Set adsUser = GetObject("LDAP://" & DN )
	set stdout = WScript.StdOut


For i = 1 to cnt
				stdout.Write vbTab
Next

'ユーザオブジェクトだった場合sAMAccountNameも表示
	If adsUser.Class = "user" Then
		stdout.Write Mid(adsUser.Name,4) &_
		 "(" & adsUser.sAMAccountName &  ")"  & vbCrlf
	Else
		stdout.Write Mid(adsUser.Name,4) & vbCrlf
	End If
	'////////////親グループ以外の場合Function終了////////////
	If IsArray(adsUser.MemberOf) Then
		For Each adsMemberGroup In adsUser.MemberOf
			Call ShowStatus(adsMemberGroup, cnt +1)
		Next
	ElseIf Not adsUser.MemberOf = "" Then
		Call ShowStatus(adsUser.MemberOf, cnt +1)
	End If
End Function

2 Comments

pnpk

こんばんは、お役に立てたようで何よりです。
今後とも、よろしくお願いいたします。

uk

すばらしいスクリプトです。元ネタに使用させていただきます!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です