dnsHostName属性が無いサーバがいる環境でS.DS.AD.Utils.Compare実行するとNullReferenceException

皆さんごきげんよう。ういこうです。某サイトで本ブログの人気記事ランキングを見たら上位 4 記事が全部 Windbg というあたりにアイデンティティクライシスを感じる今日この頃ですが皆様いかがお過ごしでしょうか。今日は ADSI の問題についてひとつ事例を御紹介します。 【今日のお題】 Windows NT 4 ドメインがひっそりいる環境で .NET Framework 3.5 までのバージョンの System.DirectoryServices.ActiveDirectory.DirectoryServer.GetDirectoryEntry() を実行された際に System.NullReferenceException が発生する場合があります。.NET Framework 4 では発生しません。 【問題の概要】 某雑誌の某漫画「女子だらけの人気絶好調のアイドルグループに男子一人がひそかにまぎれてドキッ★」のように、「Windows Server 2000 以降の OS のドメイン コントローラの中に一人だけまぎれた NT4 サーバちゃん」という環境など、dnsHostName 属性が無いドメイン コントローラがいる環境を対象とした  .NET Framework のバージョンが 3.5 までの環境上で上記メソッドを実行した場合に発生します。 — 例外発生時のコール スタック (マネージのスタック) 2010/9/26 08:06:23 System.NullReferenceException is System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。 場所 System.DirectoryServices.ActiveDirectory.Utils.Compare(String s1, String…


[ADSI:ADODB]AD から 1000 件以上のユーザ オブジェクトをクエリすると、W2K8 以降から 80072023 などが発生することがある Ver1.1

本日は、Windows Server 2008 / Windows Vista 以降の端末上で、ADODB をつかって AD から 1000 件以上のユーザ オブジェクトをクエリすると、80072023 (ERROR_DS_SIZELIMIT_EXCEEDED) や On Error Resume Next 指定を用いている場合は実装によって無限ループなど予期しない可能性が発生するという件についてご報告いたします。 【問題の概要】 Windows Server 2008 環境にて ADODB +  On Error Resume Next 指定を用いて 1000 件以上ユーザオブジェクトが存在する Active Directory 上からユーザ オブジェクトを Page Size を指定しないでクエリすると、結果セットのループ参照実装でビジーループとなり CPU 使用率が 100 % になる。一方、Windows Server 2003 上で実施しても発生しない。 なお、この現象が発生している状態で On Error Resume Next 指定をはずすと、エラーが発生していることが確認できる。…


[WMI : C++] WMI プロバイダ以外 CoCreateInstance には CLSID_WbemAdministrativeLocator クラス識別子を指定してはいけない

今日は WMI コンポーネント使用時の CoCreateInstance() で指定するクラス識別子の違いについてのお話しをご紹介させていただきます。 【概要】 WMI を使用するプログラムを C++ で作成する際に、まず IWbemLocator インターフェースを取得して、そこから WMI の実行ターゲットコンピュータ(ローカルまたはリモート)の IWbemServices インターフェース (= WMI サービス) を取得する処理を行います。 このまず最初の IWbemLocator インターフェースを取得する際に CoCreateInstance() の第一引数 REFCLSID には、プログラムの目的によって以下のように指定するクラス識別子を使い分ける必要があります。 ・WMI プロバイダ自体(あるいはフィジカル コンシューマー)を作成している場合 ⇒ CLSID_WbemAdministrativeLocator クラス識別子 ・それ以外の一般的な WMI クライアント アプリケーションの場合 (端的にいえば WMI の処理を実施するだけのアプリケーション) ⇒ CLSID_WbemLocator クラス識別子 【詳細】 -a. CoCreateInstance() の使用法について (1) WMI プロバイダ作成の場合 – “CLSID_WbemAdministrativeLocator“ 例えば、以下の MSDN ライブラリ…


[WMI基礎] トラブルシュートの基礎知識 (4)/n : アクセス拒否発生!WMIPrvSEの実行ユーザの権限を確認しよう!

皆さんごきげんよう。ういこです。 今日は WMI のトラブルシュートの続き、”アクセス拒否系 – WMI プロバイダの実行権限は適切に割り当てられているか?” をお送りします。 WMI のアクセス拒否系でよくひっかかるのが、WMI をコールしたプロセスの実行権限が適切なはずなのに、なぜかアクセス拒否が返るというところです。実は、このとき WMI の呼び出し側の他、その先の WMI のプロバイダ ホストと呼ばれるプロセス実行アカウントの権限も同時に考慮する必要があります。 以下、これまでのあらすじです。 ************************************************ [WMI基礎] トラブルシュートの基礎知識 (1)/n : WMI の動作基盤のテストから始めよう http://blogs.technet.com/jpilmblg/archive/2010/04/04/wmi-1-n-wmi.aspx [WMI基礎] トラブルシュートの基礎知識 (2)/n : WMI 詳細ログと WMIDiag ダイジェスト http://blogs.technet.com/jpilmblg/archive/2010/04/05/wmi-2-n-wmi-wmidiag.aspx [WMI基礎] トラブルシュートの基礎知識 (3)/n : DCOM の既定の構成であるか確認し、動作するか確かめてみよう http://blogs.technet.com/jpilmblg/archive/2010/04/10/wmi-3-n-dcom.aspx ************************************************ WMI を使用すると、WMIPrvSE.exe というプロセスが WMI を呼び出したプロセスとは別に立ち上がります。この WMIPrvSE は、”WMI プロバイダ ホスト” とよばれ、実際の WMI の処理の仲介を行い、その先の実際のシステムからの情報取得などを行うモジュールとやり取りなどを行います。  一般的には、WMI…


[ADSI] 障害情報 : WinNT プロバイダを用いて ADsOpenObject() をコールするとメモリリーク発生

本日は新規作成された ADSI 案件の障害情報についてのご報告です。WinNT プロバイダを用いて ADsOpenObject() をコールあるいは System.DirectoryServices.DirectoryEntry オブジェクトを生成すると CoUninitialize() がコールされるまでメモリが増加しつづけます。Release() をコールしても増加動作はコールされるごとに継続して発生しつづけるという現象となります。LDAP プロバイダを使用した場合は発生しません。 [技術情報] 文書番号: 2021561 – 最終更新日: 2010年5月12日 – リビジョン: 1.0 資格情報のセットと共に ADsOpenObject API を使用すると、メモリ リークが発生する http://support.microsoft.com/default.aspx?kbid=2021561 [現象] AdsOpenObject() を WinNT プロバイダを用いて呼び出すと、一回呼び出すごとに 8byte メモリが増加します。 この割り当てられた 8byte のメモリは ADsOpenObject() が返すオブジェクトの Release() を呼び出すことでは開放されず、増加分は CoUninitialize() を呼び出すまで開放されません。 メモリ使用量が上限に達してメモリ確保に失敗すると ERROR_BAD_NETPATH が返るなど、問題が発生することがあります。 なお、その時点のプログラムのメモリ割り当て / 動作状況によって、返されるエラーは異なる可能性があります。 [詳細] 内部にはサーバーの "IPC$" リソースに対するクレデンシャルが格納されているテーブルがありますが、クレデンシャルの取得が行われると、CCredTable にエントリが追加されます。この情報は基本的に配列で保持されます。サイズが満杯になると、配列サイズを 10…


[ILM 2007] Creating a provisioning code (Already object exists でエラーになっちゃうよ)

こんにちは、ぴろとでございます。先日、Provision された Person Object (娘) が、Pending Export 状態であった旨、お伝えしておりました。この度、無事なんのエラーもなく、Export and Check 処理が完了しました。これからが、大変な毎日が待っていると重々覚悟をしているのですが、まずはほっと胸をなでおろす今日この頃です。 今回の記事は Provisioning をテーマに書いてみたいと思います。 とある一家が家族が増えたことを契機に、家庭にある Family ドメインの ID 管理を自動化したいと思いつき、ILM 2007 FP1 を用いて ID 同期を行うつもりのようです。はてさて、どうなることやら…。 パパ 「うちにも家族が増えたし、ID 管理を容易化したいと思うんだが…」 ママ 「え?そんなに家族がいないし、手作業でやればいいじゃん」 パパ 「子どもだって、今後もっと増えるかもしれないし、3 人以上いたら管理が必要なんだよ」 ママ 「どうせ、パパが管理しているわけだし好きにすればいいじゃない?」 … こんなすったもんだがあったかなかったかは、また別の話になりますが、以下のシステム要件で行うようです。 – システム要件 ・CSV ファイルに管理されている家族人員の内容を元に、Family ドメインに Person を追加・変更を行う必要がある。 ・Family ドメインは既存ドメインのため、すでに Father と Mother の Person オブジェクトが存在している。 ・Daughter は、生まれたばかりなので CSV ファイルに追記したばかり。…


[WMI基礎] トラブルシュートの基礎知識 (3)/n : DCOM の既定の構成であるか確認し、動作するか確かめてみよう

皆様ご機嫌よう。ういこです。今日は、WMI の虎舞竜シュート続き「WMI でアクセス拒否 (Access Denied) 案件」についてご紹介したいと思います。 特に、リモート コンピュータを WMI でどうにかしてくれようと思っているときに良く出くわすのですが、もう端的に状況を表しているようで「そして僕は途方に暮れる」状態になっちゃう、それがアクセス拒否です。拒否されました、って、どうすんねん!と思ったことありませんか?私はあります。 男女関係でもそうですね。気になるあの子にアプローチしたら「…なんかイヤ」といきなり拒否されて、「俺様の何が嫌なんじゃぁあ!」というシチュエーション、ありますよね。そうそう、そこです。「俺の何が悪いんだ」のところを見ていきましょう。 まずは優しく「僕のどこが嫌で拒否ってるの?」と聞いてみましょう 最初にいきなり拒否ってる本人 (WMI) に聞いたって何か言ってくれるとは限りません。人間関係でもそうですが、こういうときはまず彼女 (WMI) の親友 (DCOM たん) から情報を収集することをお勧めします。 …話がそれました。すみません。WMI でいきなり拒否られたとき、まず確認すべきは DCOM と WMI の設定です。つぎに Windows ファイアウォールなどを見ましょう。なんでいきなり DCOM? と思う方もいらっしゃるかも知れませんが、実は WMI は DCOM とさらにその先にいる RPC (リモート プロシージャ コール) に密接にかかわっています。というより、DCOM の上に構築されているのです。既定の DCOM のセキュリティ設定を変更すると、それが原因で WMI も影響を受けます。まあ友達に悪口吹き込まれたのかも?ってところですか。 そこで、一番手っ取り早いのは、元の既定の構成に戻してあげることです。 では、何が既定の構成なのか?ですが、以下を参照にして見比べてください。 DCOM の既定のセキュリティ設定を確認する DCOM の設定は DCOMCNFG で確認、変更が出来ます。 (1) Windows XP…


[FIM2010] WSS日本語版だとFIM Portal Setup 前にWSS英語言語パックを入れる必要がある(Setup Failure) v1.1

みなさんごきげんよう。ういこです。木の芽時のなんだか胸騒ぎの放課後な春、皆様いかがお過ごしでしょうか。 さて、今日は緊急特集 [WSS 3.0 日本語版を入れると、ポータルセットアップ前に WSS の Language Pack で英語入れとかないと Forefront Identity Manager 2010 のポータルがインストール出来ないわよ!] をお送りします。 というか、私がはまったんですが。 【どんなハマり方をしたのか?】 "Identity Manager Service and Portal" から、"Install Service and Portal" を選択して、セットアップをたたいたら "Deploying solution packs" のところで突然 Rollback しちゃって FIM ポータルがインストールできません。 そこで、以下のように Windows Installer の詳細ログを取って中身を見てみたら、エラーが出て、ロールバックしてしまっていました…。 ↑これのあと、Rollback が突然発生。エラーが発生したから早く終わったと…。↓ — Windows Installer のログの取り方。 まず、Windows Installer がどういう僕たちの失敗をしていたかを確認するためにログを取りながら導入をしてみます。以下は、D ドライブ(DVD ドライブ)の Service and Portal ディレクトリ配下にある…


[WMI基礎] トラブルシュートの基礎知識 (2)/n : WMI 詳細ログと WMIDiag ダイジェスト

皆様ご機嫌よう。ういこです。今日は寒いです。昨日の花見は死ぬかと思いました。お尻が寒くて。 さて、本日も先日のトラブルシュートの記事の続きです。 WMI のサービス自体は基本的な部分は動作している様子なのに、それなのにどうも処理がうまくいかない場合の切り分けについてです。前回はこちら。 [WMI基礎] トラブルシュートの基礎知識 (1)/n : WMI の動作基盤のテストから始めよう http://blogs.technet.com/jpilmblg/archive/2010/04/04/wmi-1-n-wmi.aspx ”トラブルシュート時のチェックリスト : (1) WMI のテストをしよう” の続きです。 トラブルシュート時のチェックリスト (2) WMI のログをさらに詳しく取ってみる こうした場合、特定のクラスやクエリ発行後の動作などを追いかけてみることになります。 具体的には、以前このブログでもご紹介させて頂いた、"WMI のログ" を "詳細 (Verbose)" で取得することになります。 WMI のログは既定ではエラー時のみの取得になるので、もしかしたらエラーほどではなくても、処理の流れに問題の端緒となる部分があってもそうしたところまでは確認ができませんが、詳細モードにしていただくことで、WMI の処理を細かくトラックすることができるのです。 この方法は、デバッガを入れることが出来ない本番環境などでも有効です。 — WMI のログについて ・既定では、C:\WINDOWS\system32\WBEM\Logs\ にログが出力されます。いろんなログがありますが、物によっては更新日時が全然昔のものもあったりします。問題発生時の時刻近辺に更新されたものをご覧になることで、効率よくデータを見ることができます。 ・ログには、実際に実行されたメソッド名、その実行結果(エラーの場合は、エラーコードなど)が表示されます。 ・WMI 関連の動作が実施された場合にログされます。なので、WMI の処理が実施されていなければ、ログされることはありませんため、詳細モードにしたからといって、OS が起動されている間中、ログが無尽蔵に膨れ上がるわけではありません。 ・WMI のログサイズの上限は、既定値が決まっています。既定は 65536 バイトです。これ以上のサイズになる場合は、それまでログされていたファイルを拡張子 *.log から *.lo_ に変更し、一世代分だけバックアップを保存し、あらたにログファイルを作成します。つまり、何かあった場合、log ファイルだけでなく、lo_ ファイルも見たほうがよいということになります。 ・ログサイズは自分で設定することが出来ます。XP / 2003…


[WMI基礎] トラブルシュートの基礎知識 (1)/n : WMI の動作基盤のテストから始めよう v1.1

皆さんごきげんよう。ういこです。 ついに 4 月!新入社員の皆さま就職おめでとうございます。今月は多分「基礎から知ってみようシリーズ」をお届する見込みは予定です。今日は、その第一弾「WMI トラブルシュートの基礎知識」をお送りしたいと思います。 ************************************************★ 関連トピック ★[WMI基礎] トラブルシュートの基礎知識 (2)/n : WMI 詳細ログと WMIDiag ダイジェスト http://blogs.technet.com/jpilmblg/archive/2010/04/05/wmi-2-n-wmi-wmidiag.aspx(2010/04/05 Up)************************************************ はじめに : WMI ってそもそも何さ? Windows Management Instrumentation (WMI) は OS に付属する管理基盤です。管理基盤ってことは何かを管理するわけですが、たとえばプロセスやアプリケーション、サービスの情報からハードウエア情報など、コンピュータ上の機能のかなりの部分を管理する仕組みみたいなものです。 まあ要は簡単にシステムの管理をするために用意された機能と思っていればだいたい合ってます。 今は微妙に知らない人もいるかもしれない Windows Millennium (Windows Me : サポート提供終了) 以降、Windows 2000 から現行 OS の Windows 7 まで搭載されています。 Windows 95 / Windows 98 / Windows NT4 (いずれもサポート提供終了) は、別途ダウンロードすることで使用することができます。 Windows…