实用工具特别推荐SMSMap

Jeff Tondt

下载这篇文章的代码: UtilitySpotlight2007_07.exe (2477KB)

一幅图画胜过千言万语。这句著名的谚语表达的意思是,错综复杂的事情使用一张图像即可说明,或者说一张图像比大量的文字更有说服力。这句话也恰当地形容了可视化的目标,即必须迅速汲取大量的数据。

对于像我这样的系统管理服务器 (SMS) 痴迷者来说,把整个 SMS 层次结构看作一幅图画可以帮助我理解基础结构是如何部署的。或许您可以使用这样的图画,来展示管理一个 SMS 迁移计划的前后景象。在某些故障诊断案例中,这样的图表对于找出解决办法或至少获得他人的帮助是十分有益的。当然,作为一名负责任的 SMS 管理员,出于其他种种原因,您需要用文档记录系统的层次结构。

绘制图画

您完全可以靠自己绘制这样的图表。您完全可以卷起袖子,手动绘制 SMS 层次结构,亲手记录站点的设置。如果您使用 Microsoft® Operations Manager (MOM) 来监视 SMS 服务器,那么它也可以用来绘制层次结构的图表,不过我必须说明,MOM 并不是完全适用的图表工具,当然它也不会记录您的站点设置。也许还有其他方法或便捷的工具,但我还没有遇到过足以创建完美的图画和帮助记录站点设置的东西,或者至少没有达到我满意的程度。

所以,我决定自已动手。于是,SMSMap 1.0 诞生了。SMSMap 是一个 Visual Basic® .NET 应用程序,它使用 SMS SDK 中 SMS 管理的库,并通过 COM 自动执行 Microsoft Visio®。该实用工具查询目标 SMS 站点服务器,然后创建一个形象生动的 Visio 图表,并将站点设置导出到一个 XML 文件中。选择 XML 是因为它是记录站点设置的最恰当的方式。我还决定显示 SMS 角色,而不仅仅是与其他 SMS 服务器相关的物理服务器。这样可以通过 Visio 的层对图表进行补充,以便从多个视角查看 SMS 的层次结构。

图 1 放射格式

图 1** 放射格式 **

目前在该程序中可选择六种不同格式的 Visio 图表。例如,图 1 采用放射格式显示非常简单的 SMS 层次结构,图 2 则采用流程图格式显示相同的层次结构。对于大得多的层次结构来说,该实用工具也表现非常出色,但在这里我想让事情简单些。

图 2 流程图格式

图 2** 流程图格式 **

某些情况下,SMSMap 可能会发展为记录所有的站点设置。目前,它只记录 SMS 站点角色和所有的边界。稍加努力,便可将更多的站点设置导出到 XML 文件中。

使用 SMSMap

SMSMap 的源代码和安装文件可从《TechNet 杂志》网站获得。要安装该程序,只需执行 SMSMapSetup.msi,即可帮助您完成安装过程。请记住,SMSMap 使用 Visio,所以您还必须事先安装 Visio。安装后,请执行 C:\Program Files\Microsoft\smsmap\smsmap.exe(除非您将它安装到默认位置以外的其他位置)。

您可以在任意计算机上运行 SMSMap,而无需在站点服务器上运行它(而且许多 SMS 站点服务器不太可能安装 Visio)。输入您希望发起查询的 SMS 站点服务器的名称。如果您希望查询整个层次结构,此服务器可为中心站点,否则,它可以是任意子级主站点服务器,但在这种情况下,您只能获得该子级主站点以下的层次结构。接下来,使用 domain\username 格式输入有权查询 SMS 的帐户,然后输入该帐户的密码。(密码不会显示出来,所以您可以在别人面前输入。)

有六个单选按钮可用来选择布局,您可以选择在绘图中允许或者阻止 SMS 角色的出现。这些复选框位于“Options”(选项)选项卡下。按下“Draw”(绘制)按钮即可启动该实用工具。它首先检查 Visio 是否可用,然后查询指定的 SMS 主站点服务器,并将对象添加到 Visio 图表中。当 SMSMap 正在转储对象时,Visio 图表看起来可能不太美观,但实用工具最后会将它们组织成您一开始指定的格式。

深入探讨

现在您已了解使用 SMSMap 记录您的 SMS 层次结构的原因和方法。对于那些想展示其开发实力的人士,我们来进一步了解该实用工具的工作原理。

SMSMap 使用 Managed SMS Site Server Interfaces 收集 SMS 信息,使用 Visio Primary Interop Assemblies 生成具有所有必需形状的 Visio 图表。SMS 2003 SDK Version 3.1 包含了最新发布的 Managed SMS Site Server Interfaces。您可以使用这组托管接口,通过任何支持 Microsoft .NET Framework 的语言或应用程序连接和配置 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 的主要组件接口,下面我来解释一下实用工具自身的流程。

使用托管接口的第一步是连接到 SMS 提供者。这可以通过创建一个 SMSProvider 类的新实例来实现。该类会在内部查找指定站点服务器的 SMS 提供者,并使用一组给定的凭据连接到该提供者。如果提供者在本地计算机上,则连接到提供者时将使用当前登录的凭据,而不是提供的凭据。虽然可以在 SMS 服务器上运行 SMSMap,但我建议您在装有 Visio 的独立工作站上运行它。大多数 SMS 站点服务器出于显而易见的原因并未安装 Visio。

当您通过 SMSProvider 类访问 SMS 站点上的数据时,从安全权限的角度来说,就如同使用 SMS 管理员控制台一样。举例来说,如果您试图通过一个 SMSProvider 配置某站点服务器的设置,那么,您连接到提供者所用的帐户必须具有如同使用管理员控制台一样的同一组权限。

SMSProvider 类提供了一个 GetSiteSettings 方法,通过该方法可获得当前站点(提供者所属站点)或具有特定站点代码的任意站点的站点设置。图 3 中的代码片断说明 SMSMap 如何连接到目标站点服务器的提供者。用户凭据预期以 Domain\User 格式传递。您还可以指定“.”来表示当前计算机。图 3 中还含有帮助在用户界面中显示结果及用于日志记录的代码。

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

下一步是建立用于收集和记录目标站点服务器 SMS 信息的 XML 文件,如图 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 图表中绘制,并在用户界面和日志中更新,如同在图 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、用户界面和日志中记录这些信息。最后,图 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()

...

只是一个开始

当然,这只是一个开始,还有很多改进的可能。设备管理点需要进行检查,我在 SDK 中还没有看到它们。为了完整记录一个站点,还可添加另外一些站点设置。也许在添加更多种类的 Visio 布局设置方面还有一些更多的工作要做,从而让小型和大型层次结构看起来更美观。每一布局类型在试图产生有效的显示效果时都存在其自身的问题。当然,添加对 System Center Configuration Manager 2007 的支持是非常重要的下一个步骤。但即便如此,SMSMap 第一版还是能帮助 SMS 管理员通过 Visio 的层和透明度来显示全貌,并尝试一些“假设分析”方案。

如果您下载源代码,便可以扩展该实用工具,以满足自己的需要。我分别在 Windows XP SP2 和 Visio 2003 以及 Windows Vista™ Enterprise 和 Visio 2007 上对 SMSMap 进行了测试。如果您有关于如何改进该实用工具的建议,请给我发电子邮件:jeff.tondt@microsoft.com

Jeff Tondt是 Microsoft Consulting Services 的一名 II 级资深顾问。他关注的领域包括系统管理、自动化和修补程序管理。他是一名 SMS 主题事项专家,他的联系方式如下:jeff.tondt@microsoft.com

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.