- PR -

ActiveDirectory に CSVファイルからグループ登録をするスクリプト作成

投稿者投稿内容
ぴよこ
ベテラン
会議室デビュー日: 2006/12/11
投稿数: 61
投稿日時: 2007-06-19 11:26
■エラーの内容は良く見てないのでわかりませんが、LDAPフィルタの書き方です。
 これ使えば、フィルタは1行でOKかなと思います。

(|(&(objectClass=group)(samaccountName=test_group))(&(objectClass=group)(CN=test00001)))

objectClass=group かつ samaccountName=test_group
または
objectClass=group かつ CN=test00001
を表示。

& が かつ
| が または

■If objRecordSet.EOF の意味
上記フィルタにヒットするものが無い場合EOFなのでTrueが返ってきます。


■LDAPフィルタを試す方法(Win2003のADユーザとコンピュータ限定)
ActiveDirectoryユーザとコンピュータの
保存されたクエリ→右クリック→新規作成→クエリの定義
→(検索)カスタムの検索条件→詳細設定
「LDAPクエリの入力」以下のように入力

(|(&(objectClass=group)(samaccountName=test_group))(&(objectClass=group)(CN=test00001)))

OKを押して閉じる。

条件にヒットしたオブジェクトが画面右側に表示される。

つぐ
会議室デビュー日: 2007/05/13
投稿数: 16
投稿日時: 2007-06-19 15:03
ぴよこ様

ご返信ありがとうございます。
またLDAPフィルタのご説明もありがとうございます。
申し訳ありませんが、もう少しご教授頂けませんでしょうか。

LDAPフィルタの書き方をWebで検索してみましたが、余り理解できないでいます。

本スクリプトにおいて、ADに登録されているグループと CSVファイルの
sAMAccountName、msSFU30Nam、GidNumber のうち何れかが
マッチした場合には、グループを作成しないようにしたいと思っています。

上記を実現するには、どのようなフィルタを書けばよいでしょうか。
以下のように記しましたが、本来ならば全てグループ登録されるはずの
CSVファイルを用意したのですが、1件しか登録されません。

strFilter="(|(&(objectClass=group)(samAccountName= "& strsAMAccountName &"))(|(&(objectClass=group)(msSFU30Name= "& strmsSFU30Name &"))(&(objectClass=group)(GidNumber="& strGidNumber &")))"

重ね重ね申し訳ありませんが、
宜しくお願い致します。
ぴよこ
ベテラン
会議室デビュー日: 2006/12/11
投稿数: 61
投稿日時: 2007-06-19 15:43
strFilter="(&(objectClass=group)(|(samAccountName= "& strsAMAccountName &")(msSFU30Name= "& strmsSFU30Name &")(GidNumber="& strGidNumber &")))"
↑こんな感じかな?

インデント付けてみると、ちょっとわかりやすい?かも。
コード:

(& #この中が「かつ」
(objectClass=group)
(| ※この中が又は
(samAccountName= "& strsAMAccountName &")
(msSFU30Name= "& strmsSFU30Name &")
(GidNumber="& strGidNumber &")
)  ※ここまで
) #ここまで




(編集内容)インデントついてなかった・・・

[ メッセージ編集済み 編集者: ぴよこ 編集日時 2007-06-19 15:44 ]

[ メッセージ編集済み 編集者: ぴよこ 編集日時 2007-06-19 15:46 ]
つぐ
会議室デビュー日: 2007/05/13
投稿数: 16
投稿日時: 2007-06-19 17:05
ぴよこ様

ご返信ありがとうございます。

ご説明頂いた内容で、
LDAPフィルタの & と | のかかっている位置が分かりました。

そこで、早速スクリプトの中に書いて実行してみたのですが、
以下が解決できない状態です。

1.samAccountName と strmsSFU30Name は存在せず、
GidNumber はすでに存在しているCSVファイルを読み込んで実行すると、
登録できてしまいました。
 →本当は登録されないようにしたい。

2.msSFU30Name のみ異なり、他の属性値は存在する CSV ファイルを作成すると
登録できてします。
 →本当は登録されないようにしたい。 

このようなケースを登録させないようにしたいのですが、
ご教授頂いたフィルタの内容では不足なのでしょうか?
それとも私がこまでに記している内容に問題があるのでしょうか?

、とここまで書いて思ったことですが、
初めのフィルタの条件の記載を間違えていることに気づきました。
申し訳ありません。

先ほど、以下
引用:
本スクリプトにおいて、ADに登録されているグループと CSVファイルの
sAMAccountName、msSFU30Nam、GidNumber のうち何れかが
マッチした場合には、グループを作成しないようにしたいと思っています。


と書きましたが、

「sAMAccountName、msSFU30Nam、GidNumber のうち何れか1つでもマッチすれば
 グループを作成しない。」

の間違いです。
この場合、LDAPフィルタはどのようになりますでしょうか。

頂いた情報から私も調べたり試したりしておりますが、
正解が得られないため
ご質問ばかりさせて頂いて申し訳ありませんが
宜しくお願い致します。
ぴよこ
ベテラン
会議室デビュー日: 2006/12/11
投稿数: 61
投稿日時: 2007-06-19 17:43
先ほど書いたLDAPフィルタは、
3つの属性のうち、ひとつでも当てはまれば
クエリの結果を返しますので、

「sAMAccountName、msSFU30Nam、GidNumber のうち何れか1つでもマッチすれば
 グループを作成しない。」

という要件には当てはまるはずです。

結果を見てみると、samAccountName以外の属性以外ヒットしていないように見えます。

■試してほしい事(その1)
strFilter="(|(&(objectClass=group)(samAccountName.... (略)
の行直下に
msgbox(strFilter)
を入れてスクリプトを実行する。

■その2
msgboxで表示されたグループを
adsiedit.mscを用いてプロパティを開く。
(adsiedit.mscについてはwebで調べたら出てくると思います。)

msSFU30Nam
GidNumber
の値が、msgboxで表示された値と一致しているか確認する。
つぐ
会議室デビュー日: 2007/05/13
投稿数: 16
投稿日時: 2007-06-19 18:25
ぴよこ様

お世話になります。

ご指示頂いた内容を以下3通りのテストを行いました。

「sAMAccountName、msSFU30Nam、GidNumber のうち何れか1つでもマッチすれば
 グループを作成しない。」

の要件だった場合、テスト1の結果が理解できない状態です。
ご検討頂けませんでしょうか。

<テスト1>
■CSVファイル
testgroup04,テストグループ04,testgroup04,its,2004
testgroup05,テストグループ05,testgroup05,its,2005
testgroup06,テストグループ06,testgroup06,its,2006

※全項目とも存在しないCSVファイル

■msgBox結果
(&(objectClass=group)(|(samAccountName= testgroup04)(msSFU30Name= testgroup04(GidNumber=2004)))
(&(objectClass=group)((|(samAccountName= testgroup05)(msSFU30Name= testgroup05(GidNumber=2005)))
(&(objectClass=group)((|(samAccountName= testgroup06)(msSFU30Name= testgroup06(GidNumber=2006)))

■実行結果
○testgroup06 のみグループ登録。後は登録されず。
○testgroup06 の msSFU30Name、GidNumber は問題なし。
 上記以外はグループに追加されていないため確認できず。

→ 異常。本来ならば、全グループ登録されなければならない。


<テスト2>
上記 testgroup06 グループは削除後実行
■CSVファイル
testgroup01,テストグループ01,testgroup04,its,2001
testgroup02,テストグループ02,testgroup05,its,2002
testgroup03,テストグループ03,testgroup06,its,2003

※msSFU30Name のみ存在しない。それ以外は既に存在する属性値

■msgBox結果
(&(objectClass=group)(|(samAccountName= testgroup01)(msSFU30Name= testgroup04(GidNumber=2001)))
(&(objectClass=group)((|(samAccountName= testgroup02)(msSFU30Name= testgroup05(GidNumber=2002)))
(&(objectClass=group)((|(samAccountName= testgroup03)(msSFU30Name= testgroup06(GidNumber=2003)))

■実行結果
○全グループ登録されず。

→ 正常


<テスト3>
■CSVファイル
testgroup07,テストグループ07,testgroup07,its,2001
testgroup08,テストグループ08,testgroup08,its,2002
testgroup09,テストグループ09,testgroup09,its,2003

※GidNumber のみ存在する。それ以外は存在しない属性値

■msgBox結果
(&(objectClass=group)(|(samAccountName= testgroup07)(msSFU30Name= testgroup07(GidNumber=2001)))
(&(objectClass=group)((|(samAccountName= testgroup08)(msSFU30Name= testgroup08(GidNumber=2002)))
(&(objectClass=group)((|(samAccountName= testgroup09)(msSFU30Name= testgroup09(GidNumber=2003)))

■実行結果
○全グループ登録されず。

→ 正常


[ メッセージ編集済み 編集者: つぐ 編集日時 2007-06-19 18:28 ]
ぴよこ
ベテラン
会議室デビュー日: 2006/12/11
投稿数: 61
投稿日時: 2007-06-19 19:07
テストの結果を見ると、フィルタは正常なような気がします。
スクリプト内で、最後の行しかグループを作成しないようなロジックになってませんか?

解決できなそうなら、もう一度現在のスクリプトを掲示してください。
つぐ
会議室デビュー日: 2007/05/13
投稿数: 16
投稿日時: 2007-06-19 19:25
ぴよこ様

ご返信ありがとうございます。
以下にこれまで頂いた情報を元にテストしているスクリプトを記します。
ご確認頂ければ幸いです。

なお、現時点でLDAPクエリ部分が解決していない状態ではありますが、

「sAMAccountName、msSFU30Nam、GidNumber のうち何れか1つでもマッチすれば グループを作成しない。」

というようにするには、これまでご教授頂いた内容から、
以下のようにすれば良いかと思い、こちらもテストしてみたのですが、

strFilter="(&(objectClass=group)(samAccountName= "& strData(0) &")(msSFU30Name= "& strData(2) &")(gidNumber="& strData(4) &"))"

先の<テスト3>のCSVファイルを使用すると、グループができてしまいます。
やはり、LDAPクエリスクリプトに問題があるのでしょうか?


--- 以下 ----
'
' groupadd.vbs
'

strDCName = "itsv01.ad01.local"
strDomain = "DC=ad01,DC=local"
strNode = "OU=test"
strNISDomain = "ad01"


Const ForReading = 1

intAddNum = 0
intNoAddNum = 0

Set strArgs = Wscript.Arguments
If strArgs.Count = 0 then Wscripts.Quit
InputFile = strArgs(0)

WScript.Echo(Date & " " & Time & " グループ登録開始")
WScript.Echo("--------------------------------------------")

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFileInput = objFSO.OpenTextFile(InputFile, ForReading)

Do Until objFileInput.AtEndOfLine
strData = Split(objFileInput.ReadLine, ",")
strsAMAccountName = strData(0)
strdescription = strData(1)
strmsSFU30Name = strData(2)
strmsSFU30NisDomain = strData(3)
strgidNumber = strData(4)

strFilter="(&(objectClass=group)(|(samAccountName= "& strsAMAccountName &")(msSFU30Name= "& strmsSFU30Name &")(gidNumber="& strgidNumber &")))"
msgbox(strFilter)
strAttribute="distinguishedName"
scope="subtree"
strUserQuery="<LDAP://" & strDCName & ">;" & strFilter & ";" & strAttribute & ";" & scope

Set objConnection=CreateObject("ADODB.Connection")
objConnection.Provider="ADsDSOObject"
objConnection.Open "ADs Provider"

Set objCommand=CreateObject("ADODB.Command")
objCommand.ActiveConnection=objConnection
objCommand.Properties("Page Size")=1000

objCommand.CommandText=strUserQuery
Set objRecordSet=objCommand.Execute(strUserQuery)

if objRecordSet.EOF then
Set objOU = GetObject("LDAP://" & strNode & "," & strDomain)
Set objGroup = objOU.Create("Group", "CN=" & strsAMAccountName)
objGroup.Put "sAMAccountName", strsAMAccountName
objGroup.Put "description", strdescription
objGroup.Put "msSFU30Name", strmsSFU30Name
objGroup.Put "msSFU30NisDomain", strmsSFU30NisDomain
objGroup.Put "gidNumber", strgidNumber
objGroup.SetInfo

WScript.Echo(strsAMAccountName & " グループを登録しました。")
intAddNum = intAddNum + 1
else
WScript.Echo(strsAMAccountName & " は既に該当グループがあります。")
intNoAddNum = intNoAddNum + 1
end if
Loop

WScript.Echo("--------------------------------------------")
WScript.Echo(Date & " " & Time & " グループ登録終了")
WScript.Echo("登録グループ : " & intAddNum)
WScript.Echo("登録不可グループ : " & intNoAddNum)

objConnection.Close
objFileInput.Close
Set objFileInput = Nothing
Set objFSO = Nothing

--- 以上 ---

[ メッセージ編集済み 編集者: つぐ 編集日時 2007-06-19 19:34 ]

スキルアップ/キャリアアップ(JOB@IT)