公用程式焦點SMSMap

Jeff Tondt

下載本文程式碼: UtilitySpotlight2007_07.exe (2477KB)

一張圖片勝過千言萬語。這句耳熟能詳的諺語,在這裡指的是透過一張圖片,就能詮釋出複雜的故事背景。或者也可以這麼說:一張簡單的圖片,遠比大量的文字更具影響力。此外,圖片也能適切地描繪出想像的結果,以便快速吸收大量資料。

對於像我這樣的 System Management Server (SMS) 玩家而言,若能在單一圖片中清楚看到整個 SMS 階層架構,將有助於我了解整個基礎結構配置的方式。或許您可以利用這樣的圖片,向管理階層顯現出 SMS 移轉計劃的前後差異。在某些疑難排解個案中,這樣的圖表對於尋找解決方案,或者至少在尋求他人協助時,確實有很大的幫助。當然,身為一位有責任感的 SMS 管理員,您必定還有諸多理由而必須記錄系統階層架構。

製作架構圖

您當然也可以自行繪製出類似的圖表。只要捲起袖子,手工繪出 SMS 階層架構,然後再用雙手記錄網站上所有設定內容,也能辦得到。但若您使用 Microsoft® Operations Manager (MOM) 來監控 SMS server,就可以利用它來繪製出您的階層架構。不過我得在此說明,MOM 並非好用的圖片編輯器,當然也無法為您記錄網站設定。市面上或許有其他方法或現成好用的工具,但是到目前為止,我還找不到任何一種能夠建立出漂亮的圖片,又能記錄網站設定的工具 (至少至今仍無法讓我滿意)。

因此,我決定自行製作工具。而 SMSMap 1.0 也就此誕生。SMSMap 屬於 Visual Basic® .NET 應用程式,在 SMS SDK 中使用 SMS managed 程式庫,並可透過 COM 將 Microsoft Visio® 自動化。公用程式查詢目標的 SMS 站台伺服器,然後建立視覺效果吸引人的 Visio 圖表,並且將網站設定匯出為 XML 檔案。由於 XML 是最適合記錄網站設定的方式,因此選擇此語言撰寫。此外,我還選擇顯示 SMS 的角色,而不僅只顯示與其他 SMS Server 相關的實體伺服器。此舉可允許透過 Visio 層級修補圖表,以便透過各種觀點來看 SMS 階層架構。

圖 1 弧形格式

圖 1** 弧形格式 **

目前這個程式共有六種不同的 Visio 圖表格式可供選擇。例如,[圖 1] 使用弧形格式顯示一個非常簡單的 SMS 階層架構,而 [圖 2] 則使用流程圖格式顯示相同的階層架構。此公用程式即使在大型階層架構中,仍可運作良好,但我希望儘量能將作業簡化。

圖 2 流程圖格式

圖 2** 流程圖格式 **

總有一天,SMSMap 極有可能持續發展,並且能夠記錄所有網站設定。但目前則只能記錄 SMS 站台角色及所有界限。輕輕鬆鬆就能將許多網站設定匯出為 XML 檔案。

使用 SMSMap

SMSMap 的來源程式碼以及安裝檔案位於 TechNet Magazine 網站。安裝時,只要執行 SMSMapSetup.msi,即可帶領您逐步完成安裝程序。請記住,SMSMap 需要使用 Visio,因此必須先安裝 Visio。安裝完成後,請執行 C:\Program Files\Microsoft\smsmap\smsmap.exe (除非您將檔案安裝到非預設的其他位置)。

您可以從任何電腦上執行 SMSMap;不一定要從 Site Server 執行 (況且大多數 SMS Site Server 未必安裝有 Visio)。輸入您希望展開查詢的 SMS Site Server 名稱。如果您要查詢整個階層架構,則有可能是中心站台,或者可能是任何子系主要 Site Server,但若是後者的情況下,就只能取得該子系主要站台以下的階層架構。接下來,輸入具權限可使用 domain\username 格式查詢 SMS 的帳戶,然後輸入該帳戶的密碼 (密碼不會顯示出來,因此即便有其他人在場亦可執行)。

六個選項按鈕可供您選擇配置方式,而您也可以選擇是否允許或防止 SMS 角色顯示於圖表中。這些核取方塊位於 [選項 (Options)] 索引標籤下。按下 [繪圖 (Draw)] 按鈕即可開始使用該公用程式。一開始會先檢查是否有 Visio 可供使用,接著查詢指定的 SMS primary site server,並將物件新增至 Visio 圖表中。Visio 圖表在 SMSMap 處理物件的過程中,或許看起來不美觀,但最後公用程式會依照您一開始所指定的格式整理圖表。

深入探討

現在,您已經知道為何要使用 SMSMap 來記錄 SMS 階層架構,也了解其使用方法。如果有人還想要更進一步發揮開發人員的專長,我們不妨來深入了解這個公用程式的運作方式。

SMSMap 會使用 Managed SMS Site Server 介面來收集 SMS 資訊,而 Visio 主要 Interop 組件會產生 Visio 圖表,以進行所有必要的圖形配置。SMS 2003 SDK 3.1 版包含最新版本的 Managed SMS Site Server 介面。這組 Managed 介面可讓您透過任何支援 Microsoft .NET Framework 的程式語言或應用程式,來連接和設定 SMS Site Server。

這些介面使用 System.Management 命名空間,以透過 Windows® Management Instrumentation (WMI) 與 SMS 提供者互動。若要使用這些介面,您必須使用 .NET 相容的程式語言來開發自己的應用程式 (例如 C#、Visual Basic .NET 等),並參考 .NET 組件在 SMS SDK 中所提供的 Microsoft.SystemsManagementServer.Automation.dll。

.NET Management 類別可以有效整理許多 WMI 物件模型的特性,以呈現出一致、物件導向的模型。WMI 連接、物件列舉、方法執行、物件刪除、物件擷取和事件補捉的基本工作,全部都能透過 .NET Management 類別達成。

Visio 主要 Interop 組件

主要 Interop 組件可讓您利用 Managed 程式碼,以程式設計的方式來控制如 Visio 等的 COM 應用程式。Visio 主要 Interop 組件可讓您將 Visio 功能整合與延伸至 Managed 應用程式中。

如果您的電腦上已安裝 .NET Framework,當您後續安裝 Visio 時,安裝程式就會將 Visio 主要 Interop 組件加入您電腦的全域組件快取 (Global Assembly Cache,GAC) 中。您可以從 Managed 應用程式加入 Visio 主要 Interop 組件的參考。

將參考加入專案之後,即可從 Managed 應用程式開始處理 Visio 物件。Visio 具有可擴充的物件模型,可提供一組類別、介面和列舉,以便透過程式設計的方式建立圖表。

程式流程

現在我已經介紹了 Visio 和 SMS 的主要元件介面,接下來則要說明公用程式本身的流程。

使用 Managed 介面的第一步,是連接到 SMS 提供者。只要建立一個 SMSProvider 類別的新執行個體,即可完成第一步。就內部而言,此類別會找出指定之 Site Server 的 SMS 提供者,並使用固定的一組認證與其連接。如果提供者位於本機電腦上,連接到提供者時就會以目前登入的認證來取代提供的認證。雖然您可以在 SMS server 上執行 SMSMap,我仍建議在另一個已安裝 Visio 的工作站上執行 SMSMap。大多數的 SMS site server 基於諸多因素考量,並未安裝 Visio。

當您在 SMS 站台上透過 SMSProvider 類別存取資料時,安全性權限會視為您使用 SMS 管理員主控台 (SMS Administrators Console)。也就是說,例如您嘗試透過 SMSProvider 組態某個 site server 的設定,您用來連接到提供者的帳戶權限,必須和使用系統管理員主控台的權限相同。

SMSProvider 類別提供 GetSiteSettings 方法,以便您取得目前站台 (也就是提供者所屬站台) 或者任何具有特定站台碼的網站設定。[圖 3] 中的程式碼片段顯示 SMSMap 如何連接到目標 site server 的提供者。使用者認證應該以 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()
...

下一步是設定 XML 檔案,以針對目標 site server 收集和記錄 SMS 資訊,如 [圖 4] 所示。

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()

...

接下來,必須在 Visio 圖表中繪製目標站台,並且於 UI 和記錄中更新,如 [圖 5] 所示。

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 和記錄檔。最後,[圖 6] 顯示如何利用公用程式啟動時的格式選項,將 Visio 圖表格式化。然後關閉 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()

...

這只是一切的開端

當然,這一切才剛剛開始,尚有許多可改善的空間。裝置管理點 (Device Management Points) 需要進一步研究調查,因為我在 SDK 中找不到。另外還可以加入許多其他的網站設定,以便完整記錄站台。或許還需要花更多的心力來加入更廣泛的 Visio 配置設定,好讓大大小小的階層架構看起來更漂亮。每個配置類型在嘗試建立有效的顯示結果時,都有其困難之處。此外,加入對 System Center Configuration Manager 2007 的支援,當然也是接下來十分重要的步驟。但即便這個 SMSMap 甫推出第一版,仍可以幫助 SMS 管理員顯示整體結構,並可以使用 Visio 層級與透明度來嘗試一些假設案例。

如果您下載來源程式碼,即可擴充公用程式以符合您個人的需求。我已經在 Windows XP SP2 with Visio 2003 和 Windows Vista™ Enterprise with Visio 2007 上測試過 SMSMap。如果您對於此公用程式有任何建議,歡迎寫信給我,我的電子郵件是 jeff.tondt@microsoft.com

Jeff Tondt 是 Microsoft Consulting Services 的資深顧問 (Senior Consultant II),專精的領域包括系統管理、自動化以及修補程式管理。他是 SMS 專家,連絡方式為 jeff.tondt@microsoft.com

© 2008 Microsoft Corporation and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.