- PR -

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

投稿者投稿内容
つぐ
会議室デビュー日: 2007/05/13
投稿数: 16
投稿日時: 2007-06-18 10:35
Webや手元にある書籍などを参考にしていますが、
どうしても分からないため、
以下に質問内容を記させて頂きます。

なお、私はWindows管理初心者で、
Windowsのバッチファイル・WSH(VBScript)作成経験はほとんどありません。
特に、VBscript の方が分かっていません。
ただし、Linux の bash のスクリプト作成は多少経験があります。

なにかご教授頂ければ幸いです。
何卒宜しくお願い致します。


■環境
 ○ad01 : Win2003ServerR2 SE ドメインコントローラ(以降、DC)
      SUA による NIS・パスワード同期サーバサービスあり
 ○ad02 : Win2003ServerR2 SE ドメインコントローラ
      SUA による NIS・パスワード同期サーバサービスあり
 ○fs01 : ファイルサーバ
      SUAによるNFSサーバサービスあり
      \\\\fs01\\home\\ユーザ名のホームディレクトリ
      を作成する

■実現したいこと
 グループ登録用CSVファイルを用意して、
 ad01 上で バッチ(or スクリプト)を実行し、グループを登録したい。

■質問内容(現在分からないこと・できないこと)
 Q1.下記「groupadd.vbs」のようなスクリプトを作成していますが、
  「groupadd.vbs」を実行すると、以下のメッセージが表示され、
  「strsAMAccountName」というグループができてしまいます。
 
  >cscript tgrouadd02.vbs tgrouplist-01.csv //nologo
  strsAMAccountName: testgroup04
  strdescription: テストグループ04
  strmsSFU30Name: testgroup04
  strmsSFU30NisDomain: ad01
  strGidNumber: 2004
  strsAMAccountName: testgroup05
  strdescription: テストグループ05
  strmsSFU30Name: testgroup05
strmsSFU30NisDomain: ad01  
strGidNumber: 2005
  tgrouadd02.vbs(43, 2) (null): オブジェクトは既に存在します。
 
  「objGroup.Put "sAMAccountName", strsAMAccountName」の記述に
  問題があると思うのですが、
  testgroup04、testgroup05、testgroup06 をグループを作成するためには、
  どのような変更を行えばよいのでしょうか。
 
 Q2.以下スクリプトに、CSVファイルに書かれているグループ名・グループIDが
  すでに ActiveDirectory に存在しているかどうかを
  判定する内容を盛り込みたいのですが、
  どのような記述をしたらよいか分かりません。
  どのようにすればよいのでしょうか。


--- 以下 ----------------------------------------------------------------------

'================================================================
' groupadd.vbs
'================================================================

strDomain = "DC=ad01,DC=local"
strNode = "OU=test"
strNISDomain = "ad01"


Const ForReading = 1
Const ForWriting = 2

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

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

intNume = 0

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

WScript.Echo("strsAMAccountName: " & strsAMAccountName)
WScript.Echo("strdescription: " & strdescription)
WScript.Echo("strmsSFU30Name: " & strmsSFU30Name)
WScript.Echo("strmsSFU30NisDomain: " & strmsSFU30NisDomain)
WScript.Echo("strGidNumber: " & strGidNumber)

Set objOU = GetObject("LDAP://OU=test,DC=ad01,DC=local")
Set objGroup = objOU.Create("Group", "CN=strsAMAccountName")
objGroup.Put "sAMAccountName", strsAMAccountName
objGroup.SetInfo
objGroup.Put "description", strmsSFU30Name
objGroup.Put "msSFU30Name", strmsSFU30Name
objGroup.Put "msSFU30NisDomain", strmsSFU30NisDomain
objGroup.Put "GidNumber", strGidNumber

intNum = intNum + 1
Loop

WScript.Echo(intNum & " グループが追加されました。")

objFileInput.Close
Set objFileInput = Nothing
Set objFSO = Nothing

'================================================================

■グループ登録用 CSVファイル
testgroup04,テストグループ04,testgroup04,ad01,2004
testgroup05,テストグループ05,testgroup05,ad01,2005
testgroup06,テストグループ06,testgroup06,ad01,2006

--- 以上 ----------------------------------------------------------------------


[ メッセージ編集済み 編集者: つぐ 編集日時 2007-06-18 11:21 ]
ぴよこ
ベテラン
会議室デビュー日: 2006/12/11
投稿数: 61
投稿日時: 2007-06-18 12:54
×Set objGroup = objOU.Create("Group", "CN=strsAMAccountName")
○Set objGroup = objOU.Create("Group", "CN=" & strsAMAccountName)

ぴよこ
ベテラン
会議室デビュー日: 2006/12/11
投稿数: 61
投稿日時: 2007-06-18 13:17
samAccountNameが「test_group」なグループがあるかチェック。


--------------------------------------
strDCName="test_dc_server"
strFilter="(&(samAccountName=test_group)(objectClass=group))"
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
msgbox("なし")
else
msgbox("あり")
end if

msgbox("end")
-----------------------------------
つぐ
会議室デビュー日: 2007/05/13
投稿数: 16
投稿日時: 2007-06-18 14:01
ぴよこ様

早速のご返答ありがとうございます!

Q1.に関してご指摘頂いた箇所を含め、以下のようにに変更したところ
登録することができました。

Set objOU = GetObject("LDAP://OU=test,DC=ad01,DC=local")
Set objGroup = objOU.Create("Group", "CN=" & strsAMAccountName")
objGroup.Put "sAMAccountName", strsAMAccountName
objGroup.Put "description", strmsSFU30Name
objGroup.Put "msSFU30Name", strmsSFU30Name
objGroup.Put "msSFU30NisDomain", strmsSFU30NisDomain
objGroup.Put "GidNumber", strGidNumber
objGroup.SetInfo

また、この件に関しては実はもう1つ分からないことがあります。

Set objOU = GetObject("LDAP://OU=test,DC=ad01,DC=local")

に関してです。

スクリプトの最初で変数に代入している値を利用して上記を記述したく、
以下のようにしたのですが、上手く行きませんでした。

Set objOU = GetObject("LDAP://" & "OU=" & strNode & "," & strDomain)

こちらも質問したかったのですが、
まずはグループ登録できるかどうかが問題でしたので、後回しにしていました。
& の使い方が間違っているのでしょうか?
それとも根本的に記述が間違っているということでしょうか?

重ね重ね申し訳ありませんが
ご教授いただけると幸いです。
チャブーン
大ベテラン
会議室デビュー日: 2006/11/25
投稿数: 149
投稿日時: 2007-06-18 15:59
チャブーンです。

----
strDomain = "DC=ad01,DC=local"
strNode = "OU=test"
strNISDomain = "ad01"

< snip >

Set objOU = GetObject("LDAP://" & "OU=" & strNode & "," & strDomain)
----

なんですよね?であれば、Set objOU = GetObject("LDAP://OU=OU=test,DC=ad01,DC=local") となってうまくいかないのでしょう。

Set objOU = GetObject("LDAP://" & strNode & "," & strDomain)

とすればどうでしょう。
つぐ
会議室デビュー日: 2007/05/13
投稿数: 16
投稿日時: 2007-06-18 17:02
チャブーン様

ご返答ありがとうございます。
ご指摘通りでした。

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

とすることで動作することが確認できました。

あとは、Q2.の方なのですが、
ぴよこ様からご提示頂いたサンプルの内容を理解し、
組み込もうとしています。

宜しくお願い致します。
つぐ
会議室デビュー日: 2007/05/13
投稿数: 16
投稿日時: 2007-06-18 19:07
ぴよこ様、チャブーン様のおかげで、
以下のようなスクリプトを作成し、グループを登録することができるようになりました。
ありがとうございました。

しかし、さらに分からない点が出てきました。

現状のスクリプトですと、samAccountName が既にある場合は
グループ登録されませんが、samAccountName は異なるが、
msSFU30Name、GidNumber は同一である項目が、CSVファイルにある場合、
グループ登録ができてしまいます。

これらも既にADに登録されている場合もグループ登録できないようにしたいのですが、
ぴよこ様からご提示頂いたスクリプトの中身がきちんと理解できていないため、
どのように書き加えていけば良いか分かっておりません。
ご助言頂けると大変助かります。

宜しくお願い致します。


--- 以下 -------------------------------------------------------

'
' 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="(&(samAccountName= "& strsAMAccountName &")(objectClass=group))"
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/05/13
投稿数: 16
投稿日時: 2007-06-18 20:56
つぐです。

先のスクリプトから、条件分岐を作成すれば判定が可能かと思い、
以下のようにスクリプトを変更しましたが、
以下のエラーが表示され、未だグループ登録されていないグループも、登録できない状況になってしまいました。

解決方法が分からない状況です。
何かご教授頂けると幸いです。
宜しくお願い致します。


> cscript groupadd.vbs tgrouplist-01.csv //nologo
2007/06/18 20:48:49 グループ登録開始
--------------------------------------------
groupadd.vbs(86, 4) (null): エラーを特定できません


--- 以下 --------------------------------------------------

'
' groupadd.vbs
'

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

Const ForReading = 1
'Const ForWriting = 2

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)

For i = 0 To 4
Select Case i
Case 0
strsAMAccountName = strData(i)
strFilter = "(&(sAMAccountName = "& strsAMAccountName &")(objectClass=group))"
Case 1
strdescription = strData(i)
strFilter = "(&(description = "& strdescription &")(objectClass=group))"
Case 2
strmsSFU30Name = strData(i)
strFilter = "(&(msSFU30Name = "& strmsSFU30Name &")(objectClass=group))"
Case 3
' strmsSFU30NisDomain = strData(i)
' strFilter = "(&(msSFU30NisDomain = "& strmsSFU30NisDomain &")(objectClass=group))"
Case 4
strGidNumber = strData(i)
strFilter = "(&(GidNumber = "& strGidNumber &")(objectClass=group))"
End Select

'strFilter = "(&(samAccountName = "& strsAMAccountName &")(objectClass=group))"
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
Next
Loop

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

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

--- 以上 --------------------------------------------------

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