AADCでのArgumentOutOfRangeExceptionエラーの原因と対処法

★★★ Live配信告知 ★★★

Azureでクラウドネイティブな開発をするための方法について、世界一わかりみ深く説明致します!!複数回シリーズでお届けしている第7回目は、「どんと来いDocker」をテーマに、なかなかにわかりにくいDockerの概念を優しく紐解きます!!
【2021/10/28(木) 12:00〜13:00】

この記事では、Azure AD Connect(以下AADC)でArgumentOutOfRangeExceptionエラーが発生したときの原因と解決方法についてまとめています。

概要

Azure AD Connectのインストール時、[Connectディレクトリ]から[Azure ADサインイン]に遷移するときに以下のようなエラーが発生しました。。

 

以下はログの内容の一部です。

 

対策

今回、このエラーの原因となっていたのは同期対象のADに不正な独自クラススキーマが存在していたことでした。具体的には「構造化クラスのサブクラスである補助クラス」が存在するADに接続した場合、上記のエラーが発生します。

切り分け

まず、上記の条件がエラーの原因であるか切り分けます。

Ldifdeコマンドでtopのサブクラスでない補助クラスのdnとサブクラスを表示します。以下はADサーバで直接実行する例です。

 

出力ファイルを確認し、subClassOfが構造化クラスになっているものがあればそれがエラーの原因である可能性が高いです。筆者の環境の場合は構造クラスpersonのサブクラスである補助クラスが存在していたために発生していました。

 

このエラーを解決するには問題のクラスを無効化する必要があるのですが、そのクラスを使用している場合は無効化すると影響が出る場合があります。そのため、問題のクラスを使用しているか確認します。

以下のコマンドで問題となるクラスを補助クラスとして使用しているクラスを検索します。

 

何も出力されていなければ当該クラスは使用されていないため、以下の解決方法により無効化できます。出力された場合、その属性を使用しているシステムを停止するなどし、影響がでないようにしてから無効化します。

解決方法

スタートメニューで[ADSIエディター]と検索し、ADSIエディターを起動します。

[操作]>[接続]から接続ダイアログを起動し、[既知の名前付けコンテキストを選択する] から [スキーマ] を選択して [OK] をクリックするとスキーマの一覧が表示されます。

スキーマの一覧から先程確認したクラススキーマを選択し右クリック>[プロパティ]を選択します。

 

属性エディターの一覧から[isDefunct]を選択し[編集]をクリックします。

 

[True]を選択し[OK]をクリックします。再度有効化する場合は[isDefunct]を[False]にします。

 

これでAADCを再度インストールすると、エラーが出なくなりました。

解説

エラー22行目から画面表示と同様のエラーが出ているのでここが原因かと思いきや、1,2行目から発生している「Calling refresh schema」の失敗が原因でした。

このエラーの原因は「構造化クラスのサブクラスである補助クラス」の存在が原因でした。なぜこのクラスがエラーを引き起こすかというと、そもそもLDAPの仕様に準拠していない状態になっているからです。

ADは、ディレクトリツリーの情報を保存するために内部でLDAPを使用しています。このLDAPでは補助クラスを構造化クラスのサブクラスにすることはできない仕様になっています。

オブジェクトクラス

LDAPにはオブジェクトクラスという概念があります。一つ一つの属性をそれぞれエントリに割り当てるのではなく、共通点のある複数の属性をオブジェクトクラスにまとめて、オブジェクトクラスをインスタンスに割り当てます。例えばユーザに割り当てる属性をまとめたperson、デバイスに割り当てる属性をまとめたdeviceなどがあります。

オブジェクトクラスには3つの種類が存在します。構造化クラス、抽象クラス、補助クラスです。

構造化クラスは唯一インスタンスを生成できるクラスです。

抽象クラスはインスタンスを生成することができないクラスです。そのままオブジェクトクラスとして使用するのではなく、構造化クラスに派生させることで使用します。

補助クラスは複数のクラスの共通の属性をまとめるクラスです。クラスを派生させ、そこに属性を保持させると完全な木構造になりますが、この場合複数のオブジェクトクラスは共通の属性を持つことができません。そこで補助クラスに共通の属性を定義し、それぞれのクラスに補助クラスの定義を含めることで実現します。

オブジェクトクラスの派生ルール

3種類のオブジェクトクラスにはスーパークラス(派生元)とサブクラス(派生先)に以下の表のようなルールがあります。これらの仕様はRFC4512で規定されています。

  サブクラス
構造化クラス 抽象クラス 補助クラス
スーパークラス 構造化クラス
抽象クラス
補助クラス
  • 構造化クラスは構造化クラスのみをサブクラスにできる
  • 抽象クラスはすべてのクラスをサブクラスにできる
  • 補助クラスは抽象クラス、補助クラスをサブクラスにできる

以上より、補助クラスを構造化クラスのサブクラスにすることはできません。

 

今回のエラーの原因は規定外にも関わらずADで「構造化クラスのサブクラスである補助クラス」を設定できてしまうことでした。

インスタンスを生成する構造化クラスを共通部分として定義する補助クラスに派生させるという設計をすることは考えにくいので、設定のミスによるものではないかと考えられます。

参考

https://tex2e.github.io/rfc-translater/html/rfc4512.html

https://social.technet.microsoft.com/Forums/en-US/b0f3d2b7-736f-432c-bc68-783648454cb3/error-6306-and-quotunable-to-process-create-messagequot-when-trying-to-create-a-ad-connection?forum=sharepointadminprevious





ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!


ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

Be the first to comment

Leave a Reply

Your email address will not be published.


*