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


戻る