[ADSI] メリクリ!ボクの AD に Computer Account をいっぱい増やそう!の巻

みなさん今日は。本日はクリスマスイヴですね。

先日某ネットショップのメルマガを見ていたら、「何でクリスマスソングは微妙に悲しいのが多いんだろう?」という風に書いてあって、確かにあるいみリアル究極生物ワムウ様(※仮称) のアレとか Atom プロセッサーの子供のひと(※仮称) のアレとか、どれも微妙にリアルサイレントナイトな感じですね。クリスマスはいっぱい人が集ってパーティするのが楽しいのではないでしょうか。あと湿ってない鶏肉が食べたいけどいつもあそこはこの日人が並んでるしいつものクリスピーがないってどういうことなんでしょう。あえて今クリスピーが食べたいのに!

でも先日から子供にうつされた嘔吐下痢症がひどく、イヴなのにご飯食べられなくて昼休みこれを更新しているのが悲しいです。でも意地でもケーキ食ってやるです。

さてそんな本日イヴにお届けするコンテンツは「いっぱい人が居ると楽しいよね!ボクの AD Computer Account をいっぱい増やそう! 」の巻です。

集え!アカウント!

******************** (← この辺がクリスマスっぽい)

さてこのスクリプトのミソは [Active Directory ユーザーとコンピュータ] (ADUC) でアカウントを作る際についている [Windows 2000 以前のコンピュータに、このアカウントの使用を許可] チェック ボックス相当の処理をしているってところです。

このスクリプトでは、ADUC のこんな処理相当のことと、配慮をしています。

 ・ [ 新しいオブジェクト - コンピュータ ] 画面

 [次のユーザーまたはグループを使うと、このコンピュータを

 ドメインにに参加させることができます。]の「変更」を押下

 ・ 「ユーザーまたはグループの選択 ] 画面

 同一ドメインの[Domain Users]を選択して、「OK」を押下

 ・ [ 新しいオブジェクト - コンピュータ ] 画面

 [Windows 2000 以前のコンピュータに、

 このアカウントの使用を許可]にチェックを入れて、

 「次へ」を押下


・samAccountName 属性の文字数制限の考慮

コード例は下記です。適宜ループを入れて増やしてください。説明のしやすさのため、単一処理でご案内しております。

・・・おお、コードが入ると緑と赤ですごいクリスマス気分!!

 

   '' <---- コードここから---->

    '定数/変数定義

Const UF_WORKSTATION_TRUST_ACCOUNT = &H1000

Const UF_ACCOUNTDISABLE = &H2

Const UF_PASSWD_NOTREQD = &H20

Const ADS_ACETYPE_ACCESS_ALLOWED = &H0

Const ADS_ACEFLAG_INHERIT_ACE = &H2

Dim strTargetOU 'アカウントの作成先OUを設定

Dim objContainer 'アカウントの作成先OUオブジェクトを格納

Dim strComName 'アカウント名を設定

Dim objComputer 'アカウントオブジェクトを格納

Dim intFlag 'アカウントフラグを設定

Dim strDescription 'Description属性値を設定

Dim strSamAccountName 'samAccountName属性値を設定

Dim strPassword 'アカウントパスワードを設定

    '作成対象OU へバインド

        strTargetOU = "OU=testOU,DC=testsvr01,DC=microsoft,DC=com"

        Set objContainer = GetObject("LDAP://" + strTargetOU)

    'コンピュータアカウント作成

        strComName = "Test0001"

        Set objComputer = objContainer.Create("computer", "CN=" & strComName)

    'アカウントプロパティ設定

        intFlag = UF_WORKSTATION_TRUST_ACCOUNT or UF_ACCOUNTDISABLE or UF_PASSWD_NOTREQD

        strDescription = "TestPC_" + strComName

        if len(strComName) =< 15 then

        strSamAccountName = UCase(strComName) + "$"

        strPassword = LCase(strComName) + "$"

        else

        strSamAccountName = UCase(left(strComName,15)) + "$"

        strPassword = LCase(left(strComName,15)) + "$"

        end if

        objComputer.Put "userAccountControl", intFlag

        objComputer.Put "description", strDescription

        objComputer.Put "samAccountName", strSamAccountName

        objComputer.SetInfo

        objComputer.SetPassword strPassword

        objComputer.SetInfo

    'アクセス権設定(Domain Users)

        Set secDescriptor = objComputer.Get("ntSecurityDescriptor")

        Set dACL = secDescriptor.DiscretionaryAcl

        Set ACE = CreateObject("AccessControlEntry")

        ACE.AccessMask = -1

        ACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED

        ACE.AceFlags = ADS_ACEFLAG_INHERIT_ACE

        ACE.Trustee = "Domain Users"

        dACL.AddAce ACE

        secDescriptor.DiscretionaryAcl = dACL

        objComputer.Put "ntSecurityDescriptor", Array(secDescriptor)

        objComputer.SetInfo

    '作成アカウントの有効化

        objComputer.AccountDisabled = False

        objComputer.SetInfo

    '' <---- コードここまで---->

 

参考資料 :

Active Directory のセキュリティ定数

https://www.microsoft.com/japan/technet/scriptcenter/topics/security/adenums.mspx

スクリプトを使用した Active Directory セキュリティの管理

https://www.microsoft.com/japan/technet/scriptcenter/topics/security/exrights.mspx

"Domain Users" アクセス権限 (ACL) 追加

"Domain Users" のドメイン参加設定は、コンピュータアカウントに対する "Doamin Users" のアクセス権(ACL) を設定する操作となります。スクリプトコードでは事前にRepAdminによる更新動作を確認している、"nTSecurityDescriptor" 属性を設定するスクリプトコードを実装します。

Windows 2000 以前 (NT4.0) 対応の考慮

[Windows 2000 以前のコンピュータに、このアカウントの使用を許可] 設定は、コンピュータアカウント作成時の初期コンピュータアカウントパスワードを、Windows NT4.0 のパスワード制限に対応した内容で生成することを意図したものとなります。

初期パスワードはコンピュータ名を元に設定されますが、NT4.0 ではパスワード長が 15文字に制限されるため、この設定を有効にすることでコンピュータ名が 16文字以上だった場合、15文字に短縮し設定いたします。本制限は、NT4.0 を使用しない場合は必要ないものとなります。

ただし、このコンピュータアカウントパスワードは定期的にドメインコントローラにより自動更新され、このタイミングでは接続バージョンに即した内容に改変される事が予想されますので、16文字以上のコンピュータ名を指定した場合も 15文字に制限するよう実装を行う必要があります。

samAccountName 属性の文字通制限の考慮

ADUC では SamAccountName(Windows 2000以前のコンピュータ名)の長さを自動的に 15文字に制限するように機能いたします。

提供いただきましたスクリプトでは、コンピュータ名(CN)に "$" を付加するのみの実装のため、16文字以上を設定した場合に samAccountName に 15文字を超える名称が指定される結果となります。

この考慮は、前項(NT4.0対応の考慮と同様の実装を SamAccountName 属性に対して行う内容となります。

 

おまけ :

[Windows 2000 以前のコンピュータに、このアカウントの使用を許可 ] チェックボックスの許可対象 OS は何?

答え ⇒ Windows 2000 は含まれません。チェック ボックスの許可対象は Windows NT 4 SP3 以降、Windows 98、ME を含みますが、(※1) Windows 95 / MS-DOS は含みません。(※2)

(※1)How to enable Windows 98/ME/NT clients to logon to Windows 2003 based Domains

 https://support.microsoft.com/default.aspx?scid=555038

(※2)Error Message When Windows 95 or Windows NT 4.0 Client Logs On to Windows Server 2003 Domain

 https://support.microsoft.com/default.aspx?scid=811497

 

すごく閑話休題な話

クリスマスプレゼントって悩みませんか?私は去年、息子にコレジャナイロボソフビ版(いわばバッタもののバッタもの…みたいな位置づけ?出来は最高)をあげたのですが、箱を空ける瞬間を動画に取ってやろうと待ち構えていたら、「おかあさん!僕がほしかったのはこれだよ!! 」といわれてしまい、うにょーと思ったです。今年は本当は誕生日に上げようと思ってたのに、いい子じゃなかったからあげそびれたウルトラマンのなんかカードのセットとひろとくんがくれたミニ四駆を渡す予定です。本当はバーチャルボーイ(中古屋で買ってきたやつ)にしてやろうと思いましたが、諸事情によりとりやめました。

ちなみに コレジャナイロボはグッドデザイン賞受賞の逸品 です。

みなさま、良いクリスマスを!

~ ういこう@なんで食わないのにやせないの?~

 

(12/25 追加) 定数定義部分下記 2 行

 

Const ADS_ACETYPE_ACCESS_ALLOWED = &H0

Const ADS_ACEFLAG_INHERIT_ACE = &H2

・今回はあくまでもコンピュータ アカウントを増やすことに特化したコードです。ACE のフラグなどの組み合わせは複雑ですので、自身のシステムに組み込まれる際はシステム要件とあわせ、どのような組み合わせをするかについて検討ください。DSACLS などで確認した値を設定するようにするなどの対応を行うのも良いかと思います。

 Windows Server 2003 および Windows 2000 で Dsacls.exe を使用する方法

 https://support.microsoft.com/kb/281146/ja

・パスワード設定関連の処理は内部で複雑な動作をいたしますため、それぞれの処理セクションごとに SetInfo しています。