【AD基礎】AD スキーマとは?スキーマの仕組みや拡張について

  • 2022年11月17日
  • 2023年6月8日
  • AD DS

Active Directory ドメイン サービスを利用すると、システム管理者が各端末やユーザーを一元的に管理することができます。管理を行うサーバーをドメイン コントローラーと呼びますが、ドメイン コントローラーでは管理している端末やユーザーをオブジェクト データとして管理しています。

ユーザーやグループ、端末などのように、ドメイン コントローラーで扱うデータには様々な種類があるため、種類ごとにオブジェクト データの形式が異なります。種類ごとにオブジェクトで管理されるデータの形式を決めたものを「スキーマ」と呼びます。

今回は、Active Directory のスキーマについて紹介します。

 

AD スキーマとは

AD スキーマとは、AD で扱われるデータのひな形を定義したものです。

Active Directory ドメイン サービスでは、組織内のコンピューター、ユーザーなどのリソースを一元的に管理することができます。Active Directory ドメイン サービスで管理を行うサーバーのことをドメイン コントローラーと呼びますが、ドメイン コントローラーはドメイン内のコンピューターやユーザーなどのリソースは「オブジェクト」データとして管理しています。

コンピューターやユーザーなど、オブジェクトの種類によって管理されるデータも異なります。そのため、オブジェクトの種類(クラス)を分けて、各オブジェクトにどのような属性をもつのかを定義した「AD スキーマ」が用意されています。データのひな形のようなイメージとなります。AD で扱う全てのオブジェクトは、AD スキーマで定義されている形式に従ったデータになります。

AD スキーマで定義されているのは、オブジェクトの種類やデータ構文となります。例えば、ドメイン コントローラーで「ねこまる」というユーザーを作成するとき、AD ユーザー オブジェクトを作成する形となりますが、User クラスのスキーマに定義されているひな形に従って、オブジェクトが作成されます。

AD スキーマ では、 User クラスには DisplayName、Mail、TelephoneNumber、Title、LastLogon 等のような属性が定義されています。ユーザー オブジェクトを作成すると、 User スキーマで定義されたデータ構文に従ったオブジェクト データが作成されます。

 

スキーマの格納場所

Active Directory で管理されるデータは、AD データベースと SYSVOL で管理されています。AD スキーマは、AD データベース内で管理される全てのオブジェクトのスキーマを決めたものとなります。AD データベースは「パーティション」と呼ばれる単位で、データの格納領域が分けられています。その中に「スキーマ パーティション」という、AD スキーマのデータを管理しているパーティションが存在します。スキーマ自体も、AD データベース内にオブジェクトとして管理されています。

あわせて読みたい!

Active Directory ドメイン サービスとは、組織でシステム管理者が、組織内のユーザーやリソースを管理するためのサービスです。Active Directory ドメイン サービスに関する仕組みの概要については、以下の記事で紹介し[…]

スキーマ パテーションの複製範囲はフォレスト全体となり、フォレスト内のドメインは共通のスキーマを利用します。

 

AD スキーマの確認方法

AD スキーマで定義されている各クラスや属性を確認したい場合は、[Active Directory スキーマ] の管理コンソールが便利です。既定の状態では、[Active Directory スキーマ] の管理コンソールは利用できません。ドメイン コントローラー上でコマンド プロンプトを管理者権限で開き、 “regsvr32 schmmgmt.dll” を実行すると、MMC のスナップインから [Active Directory スキーマ] の管理コンソールを開くことができます。

 

 

AD スキーマのバージョン

Active Diretory ドメイン サービスで利用されているスキーマのバージョンは、Schema オブジェクトの objectVersion 属性で管理されています。ドメイン コントローラーに管理者権限でログオンして、[ADSI エディター] 上から Schema オブジェクトのプロパティ画面より、objectVersion 属性の値を確認できます。

 

 

スキーマ拡張とは

スキーマ拡張とは、AD スキーマに対して変更を行う操作のことです。具体的には、AD スキーマに新たなクラスや属性を追加したり、クラスに紐づく属性を追加したりする作業のことを指します。

AD スキーマはオブジェクトを作成する時のひな型となるものであるため、スキーマで定義されている属性以外の情報を設定することはできません。しかしながら、組織での運用方針に応じて、独自のクラスや属性を追加した AD オブジェクトを作成したいことがあるかと思います。例えば、User オブジェクトに社員番号などの独自の属性を追加して、ユーザーを管理したい等のシナリオです。独自のクラスや属性を定義したい場合は、AD スキーマ拡張によりクラスや属性を追加して定義することができます。

また、独自のスキーマ拡張以外にも、以下のシナリオでスキーマ拡張が必要になることがあります。

 

  • Active Directory のアップグレード
    ドメイン内にあるドメイン コントローラーの OS より、新しい OS バージョンのサーバーをドメイン コントローラーに昇格する際に、スキーマ拡張が必要となります。

     

     

  • Active Directory と連携したアプリケーションの利用
    Active Directory と連携して AD の情報を利用しているアプリケーションでは、アプリケーションが使用するオブジェクトや属性を追加するために、スキーマ拡張が必要なことがあります。

 

Active Directory にて、新たにドメイン コントローラーに昇格させるサーバーの OS が新しい場合、新しい OS に対応できるように、事前にスキーマ拡張をする必要があります。Active Directory をアップグレードする際に行うスキーマ拡張は、adprep.exe というプログラムを Windows OS に用意してあり、このプログラムを実施すると自動でスキーマ拡張されます。

AD スキーマを拡張する処理は、スキーマ マスターの役割をもつドメイン コントローラー上で行われます。しかしながら、adprep.exe を実行する作業は通常のドメイン コントローラーで実施しても問題なく、以下のようにスキーマ マスターに対してスキーマ拡張の要求を送信するという仕組みになっています。ldf ファイルというのは、スキーマ拡張する内容を定義しているファイルのことで、adprep.exe を実行したら ldf ファイルに定義されている内容でスキーマが拡張されます。

 

Windows Server 2008 R2 までは、事前に adprep.exe を実行してスキーマ拡張をしておく必要がありました。
Windows Server 2012 以降では、ウィザードでドメイン コントローラーを追加する際に、内部で自動で adprep を実施する処理が行われるため、ドメイン コントローラーに昇格する作業の前に、管理者が adprep を実行してスキーマ拡張の作業をする必要がなくなりました。
 
スキーマ拡張により追加したクラスや属性は削除することができません(=スキーマの変更を元に戻すことができません)。もし、スキーマ拡張を行った後に元のスキーマの状態に戻したい場合は、バックアップからリストアする作業を実施する必要があります。そのため、スキーマ拡張の作業は慎重に実施することをおすすめします。
 

スキーマ マスター

スキーマ マスターとは、AD スキーマを変更できる役割のことです。FSMO の役割の一つです。

AD スキーマの情報は、AD データベースのスキーマ パーティションに格納されています。AD スキーマは重要な情報であるため、スキーマ パーティションの情報を変更できるのは、スキーマ マスターの役割をもつドメイン コントローラーのみとなっています。スキーマ マスターの役割を保持できるドメイン コントローラーは、フォレストに 1 台だけとなります。

スキーマ拡張の作業を行う際に、スキーマ パーティションの情報が変更されます。スキーマ パーティションの情報の変更の処理を担うのは、スキーマ マスターの役割をもつドメイン コントローラーとなります。どのドメイン コントローラーからでもスキーマ拡張の作業自体は可能ですが、スキーマ パーティション上の情報を変更する処理はスキーマ マスター上で実行されますので、スキーマ マスターへの通信ができる必要があります。もし、スキーマ マスターの役割をもつドメイン コントローラーが利用不可となっている場合、スキーマ拡張を行うことはできません。

 

スキーマ拡張の手順

Active Directory ドメイン サービスの利用において、独自に定義したクラスや属性を定義して利用することができます。スキーマの拡張の方法としては、1) [Active Directory スキーマ] の管理コンソールを利用する、2) LDIF ファイルを使用する等の方法があります。今回は、[Active Directory スキーマ] の管理コンソールを利用して、独自定義のクラスや属性のスキーマを拡張する手順を紹介します。

OID 名前空間

Active Directory 内のすべてのオブジェクトは、一意の OID(オブジェクト識別子)が割り当てられています。OID は、Active Directory 内のオブジェクトを一意に識別するための一意の数値(トッド表記)です。独自に作成するクラスや属性にも OID を割り当てる必要がありますが、他のオブジェクトの OID と競合しないように一意の識別子である必要があります。Active Directory 内で OID が競合すると、レプリケーションでの問題が発生したり、データが欠損する等の問題が発生する可能性があります。

そのため、OID が重複しないように、クラスや属性に一意に割り当てることができる OID をスクリプトで確認することができます。

タイトル:Microsoft からオブジェクト識別子を取得する
https://learn.microsoft.com/ja-jp/windows/win32/ad/obtaining-an-object-identifier-from-microsoft?redirectedfrom=MSDN

1) スキーマ マスターにドメイン コントローラーに管理者権限でログオンします。

2) 上記の URL にアクセスし、スクリプトをコピーします。

3) メモ帳などのテキスト エディタで新しいドキュメントを作成し、コピーしたスクリプト内容をペーストして、vbs の拡張子を指定してドキュメントを保存します。

4) vbs ファイルをダブルクリックして実行します。

5) デスクトップに保存された oidInfo.txt を開きます。

6) oidInfo.txt の内容から、割り当てられた OID を確認します。

Your root OID is:
1.2.840.113556.1.8000.2554.27832.62497.14217.18296.37616.1701131.3655035

This prefix should be used to name your schema attributes and classes. For example: if your prefix is “Microsoft”, you should name schema elements like “microsoft-Employee-ShoeSize”. For more information on the prefix, view the Schema Naming Rules in the server Application Specification (http://www.microsoft.com/windowsserver2003/partners/isvs/appspec.mspx).

You can create subsequent OIDs for new schema classes and attributes by appending a .X to the OID where X may be any number that you choose. A common schema extension scheme generally uses the following structure:
If your assigned OID was: 1.2.840.113556.1.8000.2554.999999

then classes could be under: 1.2.840.113556.1.8000.2554.999999.1
which makes the first class OID: 1.2.840.113556.1.8000.2554.999999.1.1
the second class OID: 1.2.840.113556.1.8000.2554.999999.1.2 etc…

Using this example attributes could be under: 1.2.840.113556.1.8000.2554.999999.2
which makes the first attribute OID: 1.2.840.113556.1.8000.2554.999999.2.1
the second attribute OID: 1.2.840.113556.1.8000.2554.999999.2.2 etc…

 

上記の結果の場合、クラスと属性に割り当てられる OID は以下の通りとなります。

クラス:1.2.840.113556.1.8000.2554.999999.1.x
属性:1.2.840.113556.1.8000.2554.999999.2.x

上記の結果の場合、クラスと属性に割り当てられる OID は以下の通りとなります。

クラスの例:
1.2.840.113556.1.8000.2554.999999.1.1  (contoso-com-cat というクラスを作成する)
1.2.840.113556.1.8000.2554.999999.1.2  (contoso-com-panda というクラスを作成する)
1.2.840.113556.1.8000.2554.999999.1.3  (contoso-com-lion というクラスを作成する)

属性の例:
1.2.840.113556.1.8000.2554.999999.2.1  (contoso-com-name という属性を作成する)
1.2.840.113556.1.8000.2554.999999.2.2  (contoso-com-weight という属性を作成する)
1.2.840.113556.1.8000.2554.999999.2.3  (contoso-com-food という属性を作成する)

 

事前準備

スキーマを変更できるように、スキーマ マスターに関するレジストリを変更する必要があります。
[ファイル名を指定して実行] にて regedit と入力して [OK] をクリックし、レジストリ エディターを開いて編集します。

キーのパス:HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters
値の名前:Schema Update Allowed
値の型:REG_DWORD
設定値:1

 

また、スキーマ管理スナップインを使用するために、管理者権限でコマンド プロンプトを起動して、以下のコマンドを実行してスナップインのダイナミック リンク ライブラリ(DLL)ファイルを登録する必要があります。(OID を算出するスクリプトにも含まれているため、スキーマ マスター上でスクリプトを実行しているのであれば作業は省略可能です。)

regsvr32.exe schmmgmt.dll

 

クラスの作成

1) mmc を起動し、メニューから [ファイル] – [スナップインの追加と削除] をクリックします。

2) [スナップインの追加と削除] にて、”Active Directory スキーマ” を追加して [OK] をクリックします。

3) 画面の左ペインより、[コンソール ルート] – [Active Directory スキーマ] – [クラス] を右クリックして [新規作成] – [クラス] をクリックします。

4) “スキーマ オブジェクトの作成” の警告メッセージにて [続行] をクリックします。

5) 作成するクラスにて、必要な各種設定を行って [OK] をクリックします。

一般名:クラスの一般名を指定します。

LDAP 表示名:LDAP で利用される表示名を指定します。

一意な X500 オブジェクト ID : クラスで一意となる OID を指定します。指定する OID は OID 名前空間で確認した一意の値を指定します。

説明:クラスについて説明文を指定します。

親クラス:親となるクラスを指定します。

クラスの種類:クラスの種類を指定します。クラスの種類には、”構造型”、”抽象型”、”補助型” があります。

 

6) クラスで定義できる属性の紐づけ情報として、[必須] と [オプション] の項目に対象の属性を追加します。
    ※ 必須の属性は、クラスを定義するタイミングのみに指定できます。オプションとする属性は、クラスを定義した後もプロパティ画面から追加することができます。

7) [完了] をクリックします。

 

属性の作成

1) mmc を起動し、メニューから [ファイル] – [スナップインの追加と削除] をクリックします。

2) [スナップインの追加と削除] にて、”Active Directory スキーマ” を追加して [OK] をクリックします。

3) 画面の左ペインより、[コンソール ルート] – [Active Directory スキーマ] – [属性] を右クリックして [新規作成] – [属性] をクリックします。

4) “スキーマ オブジェクトの作成” の警告メッセージにて [続行] をクリックします。

5) 作成するクラスにて、必要な各種設定を行って [OK] をクリックします。

一般名:クラスの一般名を指定します。

LDAP 表示名:LDAP で利用される表示名を指定します。

一意な X500 オブジェクト ID : クラスで一意となる OID を指定します。指定する OID は OID 名前空間で確認した一意の値を指定します。

説明:クラスについて説明文を指定します。

構文:データの記述形式の型となる構文を指定します。

最大:データの文字数や数値の最大値を指定します。

最小:データの文字数や数値の最大値を指定します。

 

スキーマの反映

設定したスキーマをドメイン コントローラーに反映させるためには、スキーマ キャッシュを削除して、OS を再起動します。この作業の前提として、スキーマ マスターから最新のスキーマ情報が複製されていることが前提です。

1) ドメイン コントローラーに管理者権限をもつユーザーでログオンします。

2) [Windows 管理ツール] より [ADSI エディター] を開きます。

3) 画面の左ペインにて、[ADSI エディター] を選択した状態で、メニューより [操作] – [接続] をクリックします。

4) [接続の設定] にて、[接続ポイント] にて [既知の名前つけコンテキスト] にて “スキーマ” を選択して [OK] をクリックします。

5) 画面の左ペインにて、[スキーマ [<ホスト名>]] を右クリックして [今すぐスキーマを更新] をクリックします。

6) “スキーマ キャッシュが正しく更新されました” と表示されたら [OK] をクリックします。

7) OS を再起動します。

 

スキーマ作成における留意点

スキーマ拡張において、留意点として確認しておくべきポイントについて紹介します。

  • スキーマの変更を元に戻すことはできません。スキーマ拡張において作成したクラスや属性は削除することができません。
  • クラスや属性を追加する際に、代替として利用できるクラスや属性がないか確認してください。代替となるクラスと属性がある場合は、それを利用することを推奨します。
  • 既定で存在するクラスにカスタム属性を追加したい場合、カスタムの補助クラスを作成してカスタム属性をリンクして、クラスの [関係] タブの [補助型クラス] にカスタムの補助クラスを追加する手順が必要です。

 

スキーマ拡張における切り戻し

AD スキーマの情報を保持するスキーマ パーティションは、フォレスト全体が複製範囲となります。スキーマ拡張を行うと、その変更はフォレスト内の全てのドメイン コントローラーに複製されます。

一度スキーマ拡張の作業を行うと、スキーマを元に戻すことはできません。もしスキーマ拡張を行った後に切り戻しをする場合は、スキーマ拡張を実施する前に採取したバックアップでリストアする必要があります。スキーマ パーティションはフォレスト範囲で複製されるため、もし切り戻しをする際は、フォレスト内の全てのドメイン コントローラーをリストアする必要があります。

ドメイン コントローラーのバックアップとリストアは以下の記事を参考にしてください。

あわせて読みたい!

ドメイン コントローラーにおいて、何等かの設定を変更を行う時、バックアップを作業前に取得しておき、問題があった場合にリストアしたいということがあります。 今回は、ドメイン コントローラーのバックアップ、リストアを行うにおいて必要な知識につい[…]

基本的にはスキーマ拡張によりドメインに問題が発生することはありません。ただ、スキーマ拡張の影響を懸念して、切り戻しをする可能性を想定している場合は、切り戻しの方法として、①フォレスト内全てのドメイン コントローラーでリストア、② 複製を停止して、スキーマ マスターのみでスキーマ拡張を行い、問題があった場合はスキーマ マスターのみをリストアです。

 

①フォレスト内の全てのドメイン コントローラーでリストア

もし、スキーマ拡張をした後に切り戻しを行う場合、スキーマ パーティションはフォレスト範囲で複製されるため、全てのドメイン コントローラーをリストアする必要があります。フォレスト内の全てのドメイン コントローラーでリストアの作業を実施いただく必要がありますが、ドメイン単位で以下の通りにリストア作業を実施する必要があります。

  • AD データベース:全てのドメイン コントローラーで「権限のないリストア」
  • SYSVOL:1 台のみ「権限のあるリストア」、残りの全台は「権限のないリストア」

 

 

② 複製を停止して、スキーマ マスターのみでスキーマ拡張を実施

スキーマ マスターにてスキーマ拡張を実施します。スキーマ マスターのバックアップを採取して、スキーマ マスター上で出力方向の複製を停止した状態でスキーマ拡張の作業を実施します。出力方向の複製を停止することで、スキーマ拡張された情報は他のドメイン コントローラーへ複製されません。もし、スキーマ拡張の作業を実施した後に問題があった場合、スキーマ拡張されたスキーマ マスターのみでリストアします。

  • AD データベース:スキーマ マスターで「権限のないリストア」
  • SYSVOL スキーマ マスターで「権限のないリストア」

スキーマ拡張にあたり、スキーマ マスターで出力方向の複製を停止する手順は以下の通りです。

1) スキーマ マスターの役割をもつドメイン コントローラーに管理者権限をもつユーザーでログオンします。

2) 管理者権限でコマンド プロンプトを開きます。

3) 以下のコマンドを実行し、出力方向の複製を停止します。

    repadmin /option localhost +DISABLE_OUTBOUND_REPL

4) スキーマ拡張の作業を実施します。

5) スキーマ拡張の途中、または、スキーマ拡張後に何等かの問題が発生した場合には、スキーマ拡張を行ったスキーマ マスターのみでリストアの作業を行います。もし問題が発生しない場合には、下記のコマンドを実行して出力方向の複製を再開します。

   repadmin /option localhost -DISABLE_OUTBOUND_REPL

 

スキーマ キャッシュとは

スキーマ キャッシュとは、LDAP クライアントがスキーマ情報を参照する時に、繰り返し LDAP クエリを実施しなくてもよいように、各クライアント端末にてキャッシュされる情報です。スキーマ キャッシュは、Active Directory Service Interface (ADSI) というインターフェイスを使用するアプリケーションにて利用され、スキーマ情報をキャッシュするかどうか、またキャッシュしたスキーマ情報を参照するかどうかについては、アプリケーションの実装に依存します。

スキーマ キャッシュは、以下のフォルダに .sch ファイルとして保存されます。

〇 %LCOALAPPDATA%\Microsoft\Windows\SchCache
〇 %SYSTEMROOT%\SchCache

スキーマ拡張が行われると、LDAP クライアントが保持するスキーマ キャッシュの更新も行われます。スキーマ キャッシュの更新が行われるのは、クライアント端末が保持するスキーマ キャッシュのタイムスタンプとドメイン コントローラーが保持するスキーマのタイムスタンプ(modifyTimeStamp) を比較したときに、ドメイン コントローラーが保持する modifyTimeStamp のタイムスタンプの方が新しい場合です。ドメイン コントローラー側のタイムスタンプの方が新しい場合は、スキーマ拡張が行われたと判断して、クライアント端末側のスキーマ キャッシュを更新します。

 

スキーマ キャッシュの更新が行われるのは、スキーマ拡張が行われた後の 1 回のみです。
 
 
楽天ブックス
¥3,630 (2023/06/08 11:21時点 | 楽天市場調べ)
楽天ブックス
¥4,400 (2023/06/08 11:24時点 | 楽天市場調べ)