WSH Memo 4
ADSIの使用例
ADSI(Active Directory Service Interfaces)を使うとWindows 2000のActive Directoryを
WSHで操作できるようになります。
Active Directoryの全てのオブジェクトに一定の操作を加えるときなどに便利になるでしょう。
Classでオブジェクトの種類を得ます(User, Computer等)
オブジェクトの各プロパティはGET("名前")で得ます。(Postal Code,Addressなど)
例@ VB Scriptを使った簡単な例。
' ログイン名をCN名と同じにするスクリプト
' diに対象ディレクトリを書く
di="OU=sample1,DC=acme,DC=com"
Sub ModifyUsers(oObject)
Dim oUser
For Each oUser in oObject
Select Case oUser.Class
Case "user"
st1=oUser.GET("cn")
st2=oUser.GET("sAMAccountName")
if st1<>st2 then
oUser.Put "sAMAccountName",st1
OUT.WriteLine st2&","&st1
st1=st1 & "@acme.com"
oUser.Put "userPrincipalName",st1
oUser.SetInfo
co=co+1
End If
Case "organizationalUnit" , "container"
ModifyUsers(oUser)
End select
Next
End Sub
Dim i,mes,tit,oDomain
co=0
mes=di& chr(13) & "実行しますか?"
tit="アカウント修正ツール"
i=MsgBox(mes,vbOKCancel+vbInformation,tit)
if i=vbCancel then WScript.Quit
set F=WScript.CreateObject("Scripting.FileSystemObject")
fn=Replace(Time,":","`")
set OUT=F.CreateTextFile("モ"&fn&".log",True)
OUT.WriteLine di
Set oDomain=GetObject("LDAP://"&di)
ModifyUsers(oDomain)
Set oDomain=Nothing
MsgBox CStr(co)&"個修正した"
OUT.WriteLine CStr(co)&"個修正した"
OUT.Close
WScript.Quit
例A
Active Directoryの一括編集はエクスポート・インポートで行へば済みますが、
CN名は変更できないかもしれません。ADSIでオブジェクトの移動させて実現する例を示します。
' CN名を表示名にするスクリプト
di="OU=sample1,DC=widget,DC=co,DC=jp"
Sub GetUsers(oObject)
Dim oUser
For Each oUser in oObject
Select Case oUser.Class
Case "user"
uss(co)=oUser.cn
ussd(co)=oUser.distinguishedName
ust(co)=oUser.displayName
co=co+1
' Case "organizationalUnit" , "container"
' GetUsers(oUser)
End select
Next
End Sub
Dim i,oDomain,mes,tit,uss(2000),ussd(2000),ust(2000)
co=0:coe=0
mes=di & "の" &chr(13)&"を変更しまか?"
tit="表示名修正ツール"
i=MsgBox(mes,vbOKCancel+vbInformation,tit)
if i=vbCancel then WScript.Quit
set F=WScript.CreateObject("Scripting.FileSystemObject")
fn=Replace(Time,":","`")
set OUT=F.CreateTextFile("CN"&fn&".log",True)
Set oDomain=GetObject("LDAP://"&di)
GetUsers(oDomain)
for i=0 to co-1
if IsEmpty(ust(i)) then
OUT.WriteLine uss(i)&",表示名なし"
coe=coe+1
Else
Set usr=oDomain.MoveHere("LDAP://" & ussd(i), "CN="&ust(i))
' msgbox ussd(i)& chr(13)&ust(i)
OUT.WriteLine uss(i)&","& ust(i)
End if
next
Set oDomain=Nothing
MsgBox Cstr(co)&"中"&CStr(co-coe) & "個修正した"
OUT.WriteLine Cstr(co)&"中"&CStr(co-coe) & "個修正した"
OUT.Close
WScript.Quit
例B
CSVファイルを読み込んで更新する例。シートの行は、
account,OU名,姓,名,company,department,physicalDeliveryOfficeName,title,mail,telephoneNumber
とした場合です。
' CSVファイルをもとにActive Directoryを更新
di="DC=goo,DC=ne,DC=jp"
Dim i,mes,tit,oDomain,ks,co
co=0
set A=WScript.Arguments
if A.Count=0 then MsgBox "ファイルをドラッグしてください。":WScript.Quit
mes=di& chr(13) & "に"&A(0)&"を修正しますか?"
tit="アカウント修正ツール"
i=MsgBox(mes,vbOKCancel+vbInformation,tit)
if i=vbCancel then WScript.Quit
set F=WScript.CreateObject("Scripting.FileSystemObject")
fn=Replace(Time,":","`")
set OUT=F.CreateTextFile("Log"&fn&".log",True)
set CSV=F.OpenTextFile(A(0),1)
OUT.WriteLine di
Do Until CSV.AtEndOfStream
st=CSV.ReadLine:ks=split(st,",",-1,1)
lda="LDAP://CN="&ks(0)&",OU="&ks(1)&","&di
Set oUser=GetObject(lda)
oUser.Put "sn",ks(2)
oUser.Put "givenName",ks(3)
oUser.Put "displayName",ks(4)&" "&ks(5)
oUser.Put "company",ks(6)
oUser.Put "department",ks(7)
oUser.Put "physicalDeliveryOfficeName",ks(8)
oUser.Put "title",ks(9)
oUser.Put "mail",ks(10)
oUser.Put "telephoneNumber",ks(11)
oUser.SetInfo
OUT.WriteLine chr(34)&lda&chr(34)&","&ks(3)&","&ks(4)&","&ks(5)&","&ks(6)&","&ks(7)&","&ks(8)&","&ks(9)&","&ks(10)
co=co+1
Loop
MsgBox CStr(co)&"個修正した":OUT.WriteLine CStr(co)&"個修正した"
OUT.Close
CSV.Close
WScript.Quit
戻る