ユーティリティ スポットライトSMSMap

Jeff Tondt

この記事で使用しているコードのダウンロード: UtilitySpotlight2007_07.exe (2477KB)

百聞は一見にしかず。この有名なことわざは、複雑な物語もたった 1 枚の絵で伝えることができるとか、1 枚の絵が大量の文章より強い影響力を持つといったことを表しています。また、このことわざは、ビジュアル化 (視覚化) の目標を的確に捉えています。ビジュアル化により、大量のデータがすばやく吸収される必要があります。

私のような System Management Server (SMS) マニアにとって、SMS の全体階層を 1 枚の図で見ると、インフラストラクチャのレイアウトの理解に役立ちます。おそらく、SMS の移行計画を管理する場合、移行前後の状態を示すためにこのような図を使用している方もいるでしょう。特定のトラブルシューティングを行う場合、解決方法を見つける際にこのような図が非常に役立つこともあります。少なくとも、他人から支援を受ける場合には役に立ちます。もちろん、責任ある SMS 管理者であれば、さまざまな理由からシステム階層を文書化することは必要です。

図を入手する

このような図を自分自身で描けないということではありません。確かに、袖をまくり、手作業で SMS 階層を描き、サイト設定を手書きで文書化することはできます。Microsoft® Operations Manager (MOM) を使用して SMS サーバーを監視しているなら、MOM を使用して階層図を作成できます。ただし、MOM は作図には不向きであり、サイト設定が文書化されるわけではありません。他の方法や手軽なツールがあるかもしれませんが、十分に満足のいく図を作成でき、サイト設定の文書化に役立つものはこれまで見たことがありません。少なくとも、私にとっては満足のいくものはありませんでした。

そこで、自作することにしました。このようにして SMSMap 1.0 が生まれました。SMSMap は、SMS SDK の SMS マネージ ライブラリを使用して、COM 経由で Microsoft Visio® の自動化を行う Visual Basic® .NET アプリケーションです。このユーティリティは、対象の SMS サイト サーバーに照会し、視覚に訴える Visio 図面を作成して、サイト設定を XML ファイルにエクスポートします。サイト設定を文書化する際に XML を選択したのは、互換性に最も優れているためです。他の SMS サーバーに関連付けられた物理的なサーバーだけではなく SMS の役割も示すようにしました。そのため、Visio レイヤをいろいろと操作して、SMS 階層を複数の視点から考察することができます。

図 1 放射型図表

図 1** 放射型図表 **

現在、このユーティリティでは 6 つの形式の Visio 図面を選択できます。たとえば、図 1 では、非常に単純な SMS 階層が放射型図表を使用して示されていますが、図 2 では、同じ階層がフロー チャート形式を使用して示されています。このユーティリティは、これよりはるかに大規模な階層でもまったく正常に機能しますが、ここでは簡単な階層にとどめておきます。

図 2 フロー チャート形式

図 2** フロー チャート形式 **

いつか SMSMap の機能を強化し、すべてのサイト設定を文書化できるようにするつもりです。現時点では、SMS サイトの役割とすべての境界のみが文書化されます。もっと多くのサイト設定を XML ファイルにエクスポートできるようにするのは簡単です。

SMSMap を使用する

SMSMap のソース コードとインストール ファイルは、**TechNet Magazine Web サイトから入手できます。SMSMap のインストールは SMSMapSetup.msi を実行するだけであり、表示される指示に従えばインストールできます。SMSMap では Visio を使用するので、Visio も忘れずにインストールしておく必要があります。SMSMap をインストールしたら、C:\Program Files\Microsoft\smsmap\smsmap.exe を実行します (既定以外の場所にインストールした場合は、このパスも異なります)。

SMSMap はどのコンピュータからでも実行できます。つまり、サイト サーバーから SMSMap を実行する必要はありません (おそらく、SMS サイト サーバーには Visio がインストールされていません)。クエリを最初に実行する SMS サイト サーバー名を入力します。この SMS サイト サーバー名は、階層全体についてのクエリを実行する場合はセントラル サイトにすることもできますが、子プライマリ サイト サーバーにもできます。この例では、子プライマリ サイトから下の階層のみを取得します。次に、SMS に対してクエリを実行できるアクセス許可を持つアカウントを、ドメイン\ユーザー名形式で入力し、次にそのアカウントのパスワードを入力します (このパスワードは表示されないため、この作業は人前でもできます)。

6 個のオプション ボタンを使用してレイアウトを選択できます。また、SMS の役割を図に示すかどうかも選択できます。これらのチェック ボックスは、[Options (オプション)] タブにあります。[Draw (描画)] をクリックすると、ユーティリティが開始されます。最初に、Visio を使用できるかどうかを確認します。次に、指定した SMS プライマリ サイト サーバーに対してクエリが実行され、Visio 図面にオブジェクトが追加されます。SMSMap からオブジェクトが無造作に出力されている間の Visio 図面は見づらいですが、実行終了時に、最初に指定した形式に編集されます。

詳しい説明

ここまでは、SMSMap を使用して SMS 階層を文書化する理由と方法について見てきました。開発者としての頭脳を働かせたい人のために、ここからは SMSMap のしくみについて詳しく見ていきましょう。

SMSMap では、Managed SMS Site Server Interfaces を使用して SMS 情報を収集し、Visio プライマリ相互運用機能アセンブリを使用して必要な図形をレイアウトする Visio 図面を生成しています。SMS 2003 SDK Version 3.1 には、最新リリースの Managed SMS Site Server Interfaces が含まれています。このマネージ インターフェイスのセットを使用して、Microsoft .NET Framework 対応の言語またはアプリケーションを通じて SMS サイト サーバーに接続することや SMS サイト サーバーを構成することができます。

これらのインターフェイスでは、System.Management 名前空間を使用して Windows® Management Instrumentation (WMI) 経由で SMS プロバイダと通信します。これらのインターフェイスを使用するには .NET 互換の言語 (C#、Visual Basic .NET など) を使用してアプリケーションを開発し、SMS SDK で提供される .NET アセンブリ、Microsoft.SystemsManagementServer.Automation.dll を参照する必要があります。

.NET Management クラスは、WMI オブジェクト モデルの多く特異性を整理して、一貫性のあるオブジェクト指向モデルを提供します。WMI 接続、オブジェクトの列挙、メソッドの実行、オブジェクトの削除、オブジェクトの取得、イベントのキャプチャなどの基本的な作業は、この .NET Management クラスを使用してすべて実現できます。

Visio プライマリ相互運用機能アセンブリ

プライマリ相互運用機能アセンブリを使用すると、Visio などの COM アプリケーションをマネージ コードを使用してプログラムから制御できます。Visio プライマリ相互運用機能アセンブリを使用すると、Visio の機能をマネージ アプリケーションに統合し、拡張することができます。

既に .NET Framework をコンピュータにインストールしていれば、その後の Visio のインストール時に、インストーラによって Visio プライマリ相互運用機能アセンブリがコンピュータのグローバル アセンブリ キャッシュ (GAC) に追加されます。Visio プライマリ相互運用機能アセンブリへの参照は、マネージ アプリケーションから追加できます。

プロジェクトに参照を追加すると、Visio オブジェクトをマネージ アプリケーションから操作できるようになります。Visio のオブジェクト モデルは広範にわたっており、一連のクラス、インターフェイス、および列挙値が用意されているため、プログラムから作図できます。

プログラム フロー

ここまでは、Visio と SMS の主要コンポーネントのインターフェイスについて説明してきました。次は SMSMap 自体の処理の流れについて説明します。

マネージ インターフェイスを使用する際の最初の手順は、SMS プロバイダへの接続です。これは、SMSProvider クラスの新規インスタンスを作成することによって実現できます。このクラス内部では、指定されたサイト サーバーの SMS プロバイダを検索し、既存の一連の資格情報を使用して SMS プロバイダに接続します。SMS プロバイダがローカル コンピュータに存在する場合は、SMS プロバイダへの接続時に、指定された資格情報の代わりに現在ログインしているユーザーの資格情報が使用されます。SMSMap を SMS サーバーで実行することもできますが、Visio がインストールされた別のワークステーションで SMSMap を実行することをお勧めします。大半の SMS サイト サーバーには Visio がインストールされていないことが明白だからです。

SMS サイト上のデータに SMSProvider クラス経由でアクセスする場合のセキュリティ権限は、SMS 管理コンソールを使用しているときと同様に扱われます。つまり、たとえば、SMSProvider を使用してサイト サーバーの設定を構成する場合、管理コンソールを使用している場合と同様の権限のセットが、プロバイダに接続するアカウントにも必要です。

SMSProvider クラスには GetSiteSettings メソッドが用意されており、このメソッドを使用して、現在のサイト (プロバイダが所属するサイト) のサイト設定、または特定のサイト コード備えた任意のサイトのサイト設定を取得できます。SMSMap から対象のサイト サーバーのプロバイダへの接続方法を図 3 のコードに示します。ユーザーの資格情報は、Domain\User 形式で渡します。"." を使用して、現在のコンピュータを示すこともできます。図 3 には、結果を UI に表示するのに役立つコードや、ログに記録するコードも示しています。

Figure 3 GetSiteSettings のコード

Imports System.Management
Imports Microsoft.SystemsManagementServer.Automation

 oProvider = New SMSProvider(txtServer.Text, txtUser.Text, txtPassword.Text)
 oSite = oProvider.GetSiteSettings()
 Trace.WriteLine(“Connected to “ & txtServer.Text & “: “ & My.Computer.Clock.LocalTime)
 ListBox1.Items.Add(“Connected to “ & txtServer.Text & “: “ & My.Computer.Clock.LocalTime)
 Application.DoEvents()
...

次の手順では、図 4 に示すように、対象サイト サーバーの SMS 情報の収集と記録用の XML ファイルをセットアップします。

Figure 4 XML ファイルの作成

‘ First, Create the XML File 
 oWriter = New XmlTextWriter(m_sXmlFile, System.Text.Encoding.UTF8)
 oWriter.WriteStartDocument()
 oWriter.WriteStartElement(“Hierarchy”)

 ‘ Export Target Site to XML
 oWriter.WriteStartElement(“Site”)
 oWriter.WriteAttributeString(“Code”, oSite.SiteCode.ToString.ToUpper)
 oWriter.WriteStartElement(“SiteServer”)
 oWriter.WriteAttributeString(“Name”, oSite.SiteServer.ToString.ToUpper)
 oWriter.WriteEndElement()
 oWriter.WriteStartElement(“ParentSiteCode”)
 oWriter.WriteAttributeString(“SiteCode”, “THIS_IS_THE_TOP”)
 oWriter.WriteEndElement()

...

次に、図 5 に示すように、対象サイトを Visio 図面に描画し、UI を更新し、ログを出力する必要があります。

Figure 5 Visio でのサイトの描画

 ‘Draw Central Site
 dblXLocation = 4.25
 dblYLocation = 8.5
 vApp = New Visio.Application()
 vDoc = vApp.Documents.Add(“”)
 vStencil = vApp.Documents.OpenEx(TEMPLATEPATH, 4)
 ‘ Add Layers
 vExistingLayers = CType(vDoc.Pages(1).Layers, Visio.Layers)
 vLayer = CType(vExistingLayers.Add(“Site”), Microsoft.Office.Interop.Visio.Layer)

...

 If oSite.SiteType = SiteTypes.PrimarySite Then
 vFlowChartMaster = vStencil.Masters(“Primary Site”)
 ElseIf oSite.SiteType = SiteTypes.SecondarySite Then
 vFlowChartMaster = vStencil.Masters(“Secondary Site”)
 End If
 vToShape = vApp.ActivePage.Drop(vFlowChartMaster, dblXLocation, dblYLocation)
 vLayer.Add(vToShape, preserveMembers)

...

対象サイトの下位階層全体に対して実行するには、SMS に対するクエリの実行と Visio での描画を行う上記の基本コードと同じコードを実行します。これは Level という再帰的に呼び出される関数で、この関数を使用すれば、どのような規模の階層でもすべての子サイトに対してクエリが実行されるようになります。Level は、SMS サイト情報を収集し、収集したサイトの子サイトごとに、その情報を XML、UI、およびログに記録します。最後に、SMSMap の起動時に選択した形式を使用して、Visio 図面の書式を設定する方法を図 6 に示します。その後、XML ファイルとログ ファイルを閉じます。

Figure 6 仕上げ

 vDoc.Pages(1).Layout()
 vDoc.Pages(1).ResizeToFitContents()

 ‘Calculate the page width and height with a 5% boundary 
 visCell = vDoc.Pages(1).PageSheet.Cells(“PageHeight”)
 dHeight = visCell.Result(“in”)
 visCell = vDoc.Pages(1).PageSheet.Cells(“PageWidth”)
 dWidth = visCell.Result(“in”)
 dHeight = dHeight + 1
 dWidth = dWidth + 1
 vDoc.Pages(1).PageSheet.Cells(“PageHeight”).Result(“in”) = dHeight
 vDoc.Pages(1).PageSheet.Cells(“PageWidth”).Result(“in”) = dWidth
 vDoc.Pages(1).CenterDrawing()
 Trace.WriteLine(“Arranged Sites “ & oSite.SiteServer & “: “ & My.Computer.Clock.LocalTime)
 ListBox1.Items.Add(“Arranged Sites “ & oSite.SiteServer & “: “ & My.Computer.Clock.LocalTime)
 vFlowChartMaster = vStencil.Masters(“Background world”)
 vApp.ActivePage.Drop(vFlowChartMaster, 0, 0)

 ‘Finish up
 vDoc.SaveAs(SAVENEWFILE)
 vDoc.Close()
 vApp.Quit()
 vDoc = Nothing
 vApp = Nothing
 GC.Collect()

...

まだ始まったばかり

もちろん、これは第一歩にすぎず、多くの機能強化の可能性があります。デバイス管理ポイントについては、SDK に記載がないようなので調査が必要です。サイトを完全に文書化するには、その他の多数のサイト設定を追加することになります。大小の階層の見栄えをよくする場合は、Visio のレイアウト設定を広範にわたって追加する作業が必要になります。効果的な図面を作成しようとすると、それぞれのレイアウトに独自の難しさがあります。もちろん、System Center Configuration Manager 2007 のサポートを追加することは、次の手順として非常に重要です。しかし、この SMSMap の最初のバージョンでも、SMS 管理者が全体像を把握し、Visio のレイヤとわかりやすさを利用して、いくつかの仮説を試みるのに役立ちます。

ソース コードをダウンロードすれば、独自のニーズを満たすように SMSMap を拡張できます。SMSMap は、Visio 2003 をインストールした Windows XP SP2、および Visio 2007 をインストールした Windows Vista™ Enterprise でテスト済みです。SMSMap の機能強化に関するご提案は、jeff.tondt@microsoft.com 宛てに電子メール (英語のみ) をお送りください。

Jeff Tondt は Microsoft Consulting Services のシニア コンサルタント II です。得意分野は、システム管理、自動化、修正プログラム管理です。SMS に関する業務を専門にしています。連絡先は、jeff.tondt@microsoft.com (英語のみ) です。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.