2008/5/10 土曜日

AD上のオブジェクトのプロパティを一括で変更する@ADSI

Filed under: Windows Server 2003, スクリプト — pnpk @ 3:07:35

後から後からごちゃごちゃ追加していったらなんだか訳のわからないVBスクリプトになってしまいました。
たぶん動くと思いますがエラー処理をほぼやっていないので過信しないでください。

このスクリプトは

ADSIを使ってAD上のコンピュータのプロパティの管理者の値をテキストファイルから一括で入れる(削除する)スクリプト

です。

そもそもPCViewなんかを使ってコンピュータを管理していたことがあったんですが、そこから一括でActive Directory上に値を入れられないものかと思って作ってみたわけです。

とりあえずコンピュータオブジェクトの管理者タブに最後にログインしたユーザの名前を入れたくて作ったので

managedBy

以外の値には対応していないです。男らしいでしょ。

テキスト文書を適当に作ってタブ区切りで

PC名 ユーザ名

の一覧を作ればあとはVBSを実行するだけです。

管理者タブに値を入力する場合、ユーザのdistinguishedNameを入れないといけないのでそのへんがややこしくなっています。プログラマーの人ならサクッと作るんだろうなーなんて思いながらHey, Scripting Guy!を読みつつ書いていました。

もし使うのであれば“’”が全角になってしまっているのでそこだけ半角に置換して使ってください。

実行にはAD上のオブジェクトを変更できる権限が必要です。

ちなみにこのスクリプトを実行してAD上のオブジェクトがおかしくなったなんて言われても責任取れませんのでよろしくお願いします。

‘AD上のコンピュータのプロパティの管理者の値をテキストファイルから一括で入れる(削除する)スクリプト
‘追加する場合はWriteStatus、削除する場合はDeleteStatusを実行。
‘2008.05.10
‘cscript C:\Script\一発でADSIの値更新.vbs

Option Explicit

Const ADS_SCOPE_SUBTREE = 2

‘テキストにあるかどうか検索
Dim objFS,objText
Dim strPCList
Dim strReadLine

‘↓PCとユーザ一覧を記載するテキストのパス
‘(例)PC-001 pnpk
strPCList = “C:\Script\list.txt”

Set objFS = WScript.CreateObject(”Scripting.FileSystemObject”)
Set objText = objFS.OpenTextFile(strPCList) ‘除外するリストのパスを入力

‘↓テキストから文字列を読み込んでタブで区切って配列にする
Do Until objText.AtEndOfStream
strReadLine = UCase(objText.ReadLine)

‘ Wscript.Echo strReadLine

Dim strValue
Dim strPCDN
Dim strUserDN
Dim strPropertyName
Dim strPropertyValue
Dim lngLoop
Dim QueryPCNAME2DN
Dim QueryUserNAME2DN

strValue = Split(strReadLine, ” “, -1, vbTextCompare)

‘コンピュータ名からDNを探し出すクエリ
QueryPCNAME2DN = “SELECT distinguishedName FROM ‘LDAP://dc=pnpk,dc=local’ WHERE objectCategory=’computer’ AND name = ‘” & strValue(0) & “‘”
‘ユーザ名(sAMAccountName)からDNを探し出すクエリ
QueryUserNAME2DN = “SELECT distinguishedName FROM ‘LDAP://dc=pnpk,dc=local’ WHERE objectCategory=’user’ AND sAMAccountName = ‘” & strValue(1) & “‘”

‘ Wscript.Echo QueryPCNAME2DN
‘ Wscript.Echo QueryUserNAME2DN

strPCDN = QueryADSI(QueryPCNAME2DN)
strUserDN = QueryADSI(QueryUserNAME2DN)
strPropertyName = “managedBy”
‘↓書き込む場合
Call WriteStatus(strPCDN,strPropertyName,strUserDN)
‘↓削除する場合
‘ Call DeleteStatus(QueryADSI(QueryPCNAME2DN),”managedBy”)

Loop

objText.Close

‘ADSIにクエリを投げてDN名を返す
‘QueryADSI(SQL文)
‘戻り値 DN名
Function QueryADSI(SQL)
Dim objConnection,objCommand,objRecordSet

Set objConnection = CreateObject(”ADODB.Connection”)
Set objCommand = CreateObject(”ADODB.Command”)
objConnection.Provider = “ADsDSOObject”
objConnection.Open “Active Directory Provider”
Set objCommand.ActiveConnection = objConnection

objCommand.Properties(”Page Size”) = 1000
objCommand.Properties(”Searchscope”) = ADS_SCOPE_SUBTREE

objCommand.CommandText = SQL

Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF

QueryADSI = ShowStatus(objRecordSet.Fields(”distinguishedName”).Value)

objRecordSet.MoveNext
Loop

Set objConnection = Nothing
Set objCommand = Nothing
Set objRecordSet = Nothing
End Function

‘DNからその他の情報を取得
Function ShowStatus(DN)
Dim objDN

Set objDN = GetObject(”LDAP://” & DN )
ShowStatus = objDN.distinguishedName
Set objDN = Nothing
End Function

‘コンピュータオブジェクトに管理者を追加
‘WriteStatus(コンピュータDN名,対象のプロパティ名,対象の値)
‘(例)
‘WriteStatus(”CN=PC003,OU=コンピュータ,”managedBy”,DC=pnpk,DC=local”,”CN=pnpk,OU=ユーザ,DC=pnpk,DC=local”)
Sub WriteStatus(strPCDN,strProperty,strValue)
Dim objADSysInfo,objUser
Dim strUser,strGivenName

Set objUser = GetObject(”LDAP://” & strPCDN)

‘ Wscript.Echo strPCDN
‘ Wscript.Echo strProperty
‘ Wscript.Echo strValue

objUser.Put strProperty,strValue
objUser.SetInfo
objUser.GetInfo

Wscript.Echo strProperty & “に” & objUser.Get(strProperty) & “が書き込まれました。”

Set objADSysInfo = Nothing
Set objUser = Nothing
End Sub

‘項目を削除する場合
‘DeleteStatus(コンピュータDN名,削除対象のプロパティ名)
‘(例)
‘DeleteStatus(”CN=PC003,OU=コンピュータ,DC=pnpk,DC=local”,”managedBy”)
Sub DeleteStatus(strPCDN,strProperty)
‘On Error Resume Next
Const ADS_PROPERTY_CLEAR = 1

‘ Wscript.Echo strPCDN
‘ Wscript.Echo strProperty

Dim objPC
Dim strProp

Set objPC = GetObject(”LDAP://” & strPCDN)

objPC.PutEx ADS_PROPERTY_CLEAR,strProperty, 0
objPC.SetInfo

Wscript.Echo strProperty & “の値削除は成功しました”

Set objPC = Nothing
End Sub

Popularity: 3%

コメント (1) »

  1. CGI・PHPスクリプト検索・登録…

    フリー、シェアCGI・PHPスクリプトをキーワード、96のカテゴリーから検索できます。ダウンロードランキングの実施による人気度の評価もあり! シェアスクリプトでも、登録 (more…)

    トラックバック by scriptEYE — 2008/5/18 日曜日 @ 12:44:53

コメント RSS トラックバック URI

コメントをどうぞ

HTML convert time: 0.512 sec. Powered by WordPress ME