[ADSI プログラミング デバッグ] スクリプトの動作レース、デバッグでお悩みの方へ

こんにちは、ILM 一家の自称癒し系キャラのパパ(お父さん)です。
早いもので、我が家の息子(実子)も来年中学です、この息子、もちろん ILM一家のお母さん(ういこさん) が産んだ子ではないのですが、なぜか顔の感じがお母さん(ういこさん) に似てます。 何かの業でしょうか....
この息子、幼少時、仏教系の幼稚園に通っており、年に一度配られる、仏様のありがたい飴をのどに詰まらせて、危うく自分が仏様になりかけるという、伝説の持ち主です。 よく無事に育ったものです。
ちなみに飴をのどに詰まらせた場合、お湯を飲ませれば良いそうですが、そういう事は、救急車呼ぶ前に教えてほしいですよね。

今回は、ADSI プログラミング デバッグについて、お話したいと思います。
ADSI による AD に対するプログラミングとしては、VBscript を使用される方が多いと思います。
VBscript での、動作トレース、デバッグについては、皆様、苦労されているのではないでしょうか。
VBscript でこれらを実現するためには、次のような手法を使うのが一般的です。

・プログラム実行位置、変数値などの確認情報を Echo 出力する。 ・プログラム実行位置、変数値などの確認情報を FileSystemObject 等でログファイル出力する。 Script デバッガを使用して、動作 / 状態をトレースする。

これら、前 2つは動作/状態把握のために、追加のコード実装が必要となります。
また、Script デバッガは、最新 OS に対応していないほか、Visual Studio 等の開発環境とくらべると機能が制限され、使い勝手も良いとはいえない状況です。

では、このような状況で、どのような手法があると思いますか?
私は、既存の Visual Studio 開発環境を使用してしまうのが、一つの解決策だと考えています。

使用する Visual Studio ですが、VBScript と言語互換の高い、Visual Basic 6.0 が良かったのですが、10年以上前のリリース製品であり現在は入手できません。 また、ライセンスを持っていらっしゃっても、マイクロソフトのサポートライフサイクルが切れている現状では、お勧めできるものではない状況です。
そこで、言語互換性では、VBscript、Visual Basic 6.0 との親和性は高くありませんが、現在、無償提供されている Visual Basic 2008 Express Edition を使って、ADSI、VBscript コードに近いコード内容を動作させる方法をご紹介します。

Visual Basic 2008 では .NET Framework 提供クラスを使用したプログラミングを行います。
Active Directory へのアクセスは、System.DirectoryServices 名前空間を使用することになります。
ここまでを聞くと、ADSI との実装の違い、互換性を懸念されるでしょう。 しかし、この名前空間は、ADSIを内部使用して機能実装している部分があり、ADSI のネイティブオブジェクトを触るためのプロパティを提供しています。 これが、System.DirectoryServices 名前空間 の DirectoryEntry.NativeObject です。

DirectoryEntry で操作対象の Active Directory オブジェクトを参照してしまえば、以降、NativeObject
を介することで、VBscript で ADSI を使用した操作に類似したプロパティ、メソッド操作が行えます。
実際に、VBscript と Visual Basic 2008 のコード差異を見ていただきましょう。

<VBScript コード例 >
'スクリプトセンター: パスワードの最終設定時の判別

'https://www.microsoft.com/japan/technet/scriptcenter/scripts/ad/users/pwds/uspwvb09.mspx

'---------------------------------------------------------------

  Set objUser = GetObject _

                            ("LDAP://CN=ILM_Papa, CN=Users, DC=microsoft, DC=com")

  dtmValue = objUser.PasswordLastChanged

  WScript.echo "pwdLastSet is: " & dtmValue

'---------------------------------------------------------------

<Visual Basic 2008 コード例 >
操作手順
1. Visual Basic 2008 Express Edition を起動
2. [ファイル]-[新しいプロジェクト]メニューから、[コンソールアプリケーション]プロジェクトを作成する
3. [プロジェクト]-[参照の追加]メニューから、"System.DirectoryServices" コンポーネントを参照する
4. 以下コードを記述する
5. [デバッグ]-[デバッグの開始] メニューで デバッグ実行されます

'---------------------------------------------------------------

 Imports System.DirectoryServices

Module Module1

    Sub Main()

        Dim adsiUser As Object

        Dim dtmValue As String

        Dim objUser = New DirectoryEntry _

                                 ("LDAP://CN=ILM_Papa, CN=Users, DC=microsoft, DC=com")

        'ADSI オブジェクトを取得する

        adsiUser = objUser.NativeObject

        dtmValue = adsiUser.PasswordLastChanged

        Console.WriteLine("pwdLastSet is: " & dtmValue)

    End Sub '(★)

End Module

'---------------------------------------------------------------

Visual Basic 2008 では、手順 5 の際に、End Sub 行 (上記コード(★) 部分) にブレークポイントを設定しておけば、コンソール出力後の部位でデバッグブレークします。
また、手順 5 の操作で、[デバッグ]-[ステップイン] メニュー(F8)を使用することで、ステップ実行や、ステップ実行中の変数のクイックウォッチ/ウオッチ式の設定も可能です。

GetObject を DirectoryEntry での取得、Wscript.Echo を Console.WiteLine での出力とする変更は文法の差異となります。 コード量が多く見えますが、定義、宣言以外の追加部分は NativeObject 参照部位のみの追加となっているのが確認いただけるでしょうか。

なお、Visual Basic 2008 Express Edition は以下より、無償ダウンロード、使用が可能です。

  Visual Studio 2008 Express Edition
  https://www.microsoft.com/japan/msdn/vstudio/express/

  Visual Basic 2008 Express Edition with Service Pack 1
  https://go.microsoft.com/?LinkId=9348302

Visual Basic 2008 では 本来、DirectoryServices 名前空間の提供機能を使用することが好ましいといえますが、このように、ADSI オブジェクトも使用可能であり、強力なデバッグ機能を利用できるというメリットがあります。 よろしければ、一度お試しいただいてはいかがでしょうか。

また、機会がございましたら、Active Directory の .NET プログラミングについて、あらためまして、本 Blog 上でご紹介したいと考えています。

~ お父さんより ~