6月4日 道場で使用したスクリプト(ユーザー登録、OU作成、グループ作成)

6月4日のITPro道場に参加くださった皆様、および VBScript をこよなく愛しPowerShellになんか負けるか!という皆様へ

ITPro道場当日に実行したスクリプトですが、せっかくですので、広く利用者のみなさんにも見ていただくために、こちらに掲載します。

#ITPro道場をご存じない方は、こちらをご覧ください

※スクリプト実行時の注意

スクリプトは「ここから」から「ここまで」をドラッグしてコピーし、メモ帳等のテキストエディタに貼り付けてください。
先頭が「'(シングルクオーテーション)」で括られている行はコメント行ですので、削除しても問題ありません。
ファイル名は何でも結構ですが、拡張子を vbs として保存していただければ動作します。
実行するにあたり、事前に以下のように「cscript.exe」をスクリプトホストとして設定しておいてください。

cscript でスクリプトの実行環境をコマンドプロンプトにしておく

 

' ここから
'

' ************************************************************************************
' ドメインオブジェクトの取得
' ************************************************************************************
' まずはActive Directoryの最も基本的な情報であるドメインオブジェクト(objDomain)
' を取得します。'このオブジェクトを元に、様々な処理を行います。
' 以下の4行はお約束で、自分が参加しているドメインのオブジェクトが返されます。
' 自分が参加している以外のドメインオブジェクトが必要な場合には、DomainPath に
' 「 dc=microsoft,dc=com 」のようにドメインのDN(Distinguished Name)を指定してください。

Set objRootDSE = GetObject("")
DomainPath = objRootDSE.Get("DefaultNamingContext")
containerADsPath = "LDAP://" & DomainPath
Set objDomain = GetObject(containerADsPath)

' ************************************************************************************
' ITPro道場 OUの作成
' ************************************************************************************
' ユーザーID作成先の「いれもの」であるOU(Organizational Unit)を作成します
' 作成するOUの名前は「ITPro道場」です。
' スクリプトを見ていただくとわかるように、上で作成したドメインオブジェクト(objDomain)
' に対してCreateを行っています。
' はじめての方は、なんとなーくでよいので雰囲気をつかんでください。
' 以下の行により、objOU_Dojo というOUオブジェクトが作成されます。
' 以降、OUに対する処理は objOU_Dojo を使用します。

Set objOU_Dojo = objDomain.Create("organizationalUnit", "ou=ITPro道場")

' Createのあとは、SetInfo でコミットしておきます。どんな処理もそうですが、
' コミットしないと消えてなくなります。

objOU_Dojo.SetInfo

' Wscript.Echoは、メッセージを出力するための命令です。
' ここでは、作成したOUの名前を表示しています。
' つまり「 ITPro道場 」が表意されるわけです。

Wscript.Echo objOU_Dojo.name & " を作成しました"

' ************************************************************************************
' ITPro道場 OUの下に、新宿支店OUを作成する
' ************************************************************************************
' 次に、OU=ITPro道場 の下に、OU=新宿支店 を作成します。
' ここで注意してください。
' 作成先は、OU=ITPro道場 の配下ですので、Create は、
' objDomain ではなく、先ほど作成した objOU_Dojo に対して行います。

Set objOU_Sinjuku = objOU_Dojo.Create("organizationalUnit", "ou=新宿支店")
Wscript.Echo objOU_Sinjuku.name & " を作成しました"
objOU_Sinjuku.SetInfo

' ************************************************************************************
' ITPro道場 OUの下にユーザー yamada を作成する
' ************************************************************************************
'次にユーザーを作成します。
'はじめに、ユーザー作成に必要な情報を変数に格納します。
'sAMAccountName という変数がユーザーIDになります。

strSn = "山田"
strGivenName = "太郎"
strCN = "CN=" & sn & " " & givenName
strsAMAccountName = "yamada"
strPasswd = "password"

' ユーザー登録に必要な値を準備したらユーザーオブジェクトを作成します。
' ここでも注意してください。
' ユーザーを作成するのは、OU=ITPro道場 配下ですから、
' objOU_Dojo に対して Create を実行します。
' ユーザーの作成方法はいくつかあるのですが、ここでは
' ひとまず以下の流れを覚えてください。
' 留意していただきたいのは、以下の行の strCN です。
' strCN には、「cn=山田 太郎」が格納されています。
' AD(もしくはldap)では、DN( Distinguished Name)と呼ばれる、
' いわば、LDAP上のパスでオブジェクトが識別されます。
' ユーザーもオブジェクトのひとつですから、DNで識別されます。
' 山田太郎さんの場合には、cn=山田 太郎,ou=新宿支店,ou=ITPro道場,dc=example,dc=jp が
' DNとなります。

Set objUser = objOU_Dojo.Create("user",strCN)

' Put は、属性を設定するときに使用します。
' 以下の行では、sn という属性に、strSN つまり ”山田” を格納しているわけですね。

objUser.Put "sn", strSn
objUser.Put "givenName", strGivenName

' ユーザーを作成するときには、必ずユーザーIDが必要です。
' sAMAccountName は、Active Directory特有の属性で、ユーザーIDが格納されます。
' ちなみに、Linux等でActive Directoryを使用して認証する場合、ldap.conf には
' ユーザーIDとして sAMAccountName をマップするように設定したりします。

objUser.Put "sAMAccountName", strsAMAccountName

' ユーザーオブジェクトのコミットします
' コミットしないと、パスワードを設定することができないので注意してください

objUser.SetInfo

' GetInfoを使用すると、コミットした値を再取得します。
' 作成したユーザーの属性を後の処理で使用する場合には、
' 念のためにこの処理を行っておくとよいでしょう。

objUser.GetInfo

' パスワードをセットする場合には、SetPassword という特殊なメソッドを使用します。

objUser.SetPassword passwd

' 初回ログオン時にパスワードの変更要求を行わない場合には、以下のように
' PasswordRequired を false に設定します

objUser.PasswordRequired = False

' スクリプトでユーザーを作成した場合、作成したままだとアカウントは無効になっています。
' すぐにしようするのであれば、必ず AccountDisabled を false に設定しましょう。
' 「無効化」を「無効にする」ということです。注意してください。

objUser.AccountDisabled = False

' ここまでの設定をコミットします
' なお、コミットのタイミングに決まりはありません。
' 適宜行ってください。

objUser.SetInfo
Wscript.Echo "ユーザー" & objUser.sAMAccountname & " を作成しました"

' ************************************************************************************
' グループを作成します
' ************************************************************************************
' 以下は、グループの種類をあらわす定数値です
' 今回はグローバルグループを作成しますので、&h2 を使用することになります

ADS_GROUP_TYPE_GLOBAL_GROUP = &h2
ADS_GROUP_TYPE_LOCAL_GROUP = &h4
ADS_GROUP_TYPE_UNIVERSAL_GROUP = &h8

' グループにはセキュリティグループと配布グループがありますが、
' 今回はセキュリティグループを作成します。
' &h80000000 は、セキュリティグループをあらわす定数です。
' こうした定数値は MSDNに解説されていますので、
' https://msdn2.microsoft.com/en-us/library/default.aspx で、
' adsi group create をキーワードに検索してみてください。

ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000

' グループを objOU_Dojo 配下に作成します

strGroupname = "G-Kacyo"
Set objGroup = objOU_Dojo.Create("group", "cn=" & strGroupName)
objGroup.Put "sAMAccountName", strGroupName

' グループの種類は、定数値を「論理和」で指定します。論理和ですから、OR を使います。
' なお、1行に書くと長くなりすぎる場合には、アンダースコアを行末に指定して次の行に
' 続けて書くことができます。

objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or _
  ADS_GROUP_TYPE_SECURITY_ENABLED
objGroup.SetInfo
WScript.Echo "グループ " & objGroup.sAMAccountName & " を作成しました。"

' ユーザー yamada さんをグループメンバとして登録します。
' グループのメンバを追加する方法はいくつかありますが、
' 以下の方法はメンバ追加に特化した方法ではなく、
' グループが持つ member 属性 に値を追加するという汎用的な方法です。
' このスクリプトの中で一番難しいかもしれません。
' Putex というのは 「Put メソッドが拡張されたもだ」程度に覚えてください。
' 以下のような書式で記述します。
' objGroup.Putex <操作内容>,<属性>,<値>
' <操作内容> とは「クリア(1)」「更新(2)」「追加(3)」「削除(4)」のいずれかを
' 指定します。ここでは、既存の値はそのままに新たなメンバを追加するために 3 を使用しています。
'既存の値を全て削除し、yamada さんだけにするのであれば 2 を指定します。yamada さんを
' 削除するのであれば 3 になります。
' <属性> には操作対象の属性の名前を指定します。今回は、メンバーを変更する
' ので、グループオブジェクトの member 属性を指定しています。グループのメンバ
' シップというのは、member 属性で管理されていて、この中にメンバであるユーザー
' のDNがごそっと入っているわけです。
' <値>には member 属性に格納したいユーザーのDNを指定するわけですが、
' したの行をごらんいただければお分かりのとおり、「array」というよく分からない
' 単語が出てきていますよね。array というのは、その名のとおりアレイ値を意味
' するわけですが、member は複数値を要求する属性なので、仕方なく yamadaさん
' 一人であるにもかかわらず array 関数で複数値形式に変換しています。
' もちろん、yamada さん以外に suzuki さんも追加する必要があれば、各値をカンマ区切りして、
' 次のように書くこともできます。
' array("cn=suzuki,ou=ITPro道場,ou=新宿支店,ou=example,dc=jp", _
'           cn=yamada,ou=ITPro道場,ou=新宿支店,ou=example,dc=jp")

objGroup.Putex 3,"member",array(objUser.distinguishedName)
objGroup.SetInfo

WScript.Echo "グループ " & objGroup.sAMAccountName & " に、メンバ " & objUser.sAMAccountName & " を追加しました。"

WScript.Echo "すべて完了しました。"

' ここまで

以上で解説終了ですが、スクリプトはいかがですか?
これを知っているか知らないかとでは、管理の幅がまったく違います。

スクリプトを学習するための情報は、WEB上にたくさん転がっていますのでサーチしていただければ検索結果を得ることができるでしょう。

今回使用したスクリプトは、ADSI (Active Directory Services Interface)というライブラリを使用しています。
検索する際には、「adsi group add」とか「adsi password modify」といったように、adsi というキーワードをつけるとヒットしやすくなります。

以下に参考サイト を記しておきます。

スクリプトを一から学ぶには TechNetのスクリプトセンター
慣れている人がリファレンスとして使うなら MSDNのスクリプトサイト

いつか時間があれば、ITPro向け開発道場 みたいな企画もやってみたいですね(DEVエバ主催で...)。