- - PR -
ActiveDirectory に CSVファイルからグループ登録をするスクリプト作成
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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-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 &")))" 重ね重ね申し訳ありませんが、 宜しくお願い致します。 | ||||
|
投稿日時: 2007-06-19 15:43
strFilter="(&(objectClass=group)(|(samAccountName= "& strsAMAccountName &")(msSFU30Name= "& strmsSFU30Name &")(GidNumber="& strGidNumber &")))"
↑こんな感じかな? インデント付けてみると、ちょっとわかりやすい?かも。
(編集内容)インデントついてなかった・・・ [ メッセージ編集済み 編集者: ぴよこ 編集日時 2007-06-19 15:44 ] [ メッセージ編集済み 編集者: ぴよこ 編集日時 2007-06-19 15:46 ] | ||||
|
投稿日時: 2007-06-19 17:05
ぴよこ様
ご返信ありがとうございます。 ご説明頂いた内容で、 LDAPフィルタの & と | のかかっている位置が分かりました。 そこで、早速スクリプトの中に書いて実行してみたのですが、 以下が解決できない状態です。 1.samAccountName と strmsSFU30Name は存在せず、 GidNumber はすでに存在しているCSVファイルを読み込んで実行すると、 登録できてしまいました。 →本当は登録されないようにしたい。 2.msSFU30Name のみ異なり、他の属性値は存在する CSV ファイルを作成すると 登録できてします。 →本当は登録されないようにしたい。 このようなケースを登録させないようにしたいのですが、 ご教授頂いたフィルタの内容では不足なのでしょうか? それとも私がこまでに記している内容に問題があるのでしょうか? 、とここまで書いて思ったことですが、 初めのフィルタの条件の記載を間違えていることに気づきました。 申し訳ありません。 先ほど、以下
と書きましたが、 「sAMAccountName、msSFU30Nam、GidNumber のうち何れか1つでもマッチすれば グループを作成しない。」 の間違いです。 この場合、LDAPフィルタはどのようになりますでしょうか。 頂いた情報から私も調べたり試したりしておりますが、 正解が得られないため ご質問ばかりさせて頂いて申し訳ありませんが 宜しくお願い致します。 | ||||
|
投稿日時: 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-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 ] | ||||
|
投稿日時: 2007-06-19 19:07
テストの結果を見ると、フィルタは正常なような気がします。
スクリプト内で、最後の行しかグループを作成しないようなロジックになってませんか? 解決できなそうなら、もう一度現在のスクリプトを掲示してください。 | ||||
|
投稿日時: 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 ] |