【问题标题】:How to reliably determine which components of SQL Server 2008 are installed, using C#?如何使用 C# 可靠地确定安装了 SQL Server 2008 的哪些组件?
【发布时间】:2012-10-21 09:40:26
【问题描述】:

我想使用 C# 以编程方式实现以下目标。

SQL Server 2008 中安装的查询组件 例如

  1. 升级工具
  2. 调试符号
  3. 复制支持
  4. 在线图书
  5. 开发工具

我曾尝试使用 SQL Server 的 SMO API 尝试查询信息集合以及配置集合,但找不到上述三点中的任何一个。

我需要能够以编程方式确定哪些 SQL Server 2008 组件已安装,哪些未安装,就像 SQL Server 安装设置首先检查安装了哪些组件一样。

一种方法是查询 SQL Server 安装日志文件,但如果 SQL Server 完全不存在或有人删除了该日志文件,则无济于事。

我需要可靠地确定已安装的 SQL Server 组件

请帮忙。

谢谢

史蒂夫

【问题讨论】:

    标签: c# sql-server installation components smo


    【解决方案1】:

    您最好的选择可能是通过 WMI 查询 Win32_Product。您可以使用WMI Code Creator v1.0 来帮助您创建适当的查询。您还可以查看WQL (SQL for WMI) 了解支持的查询语法和ManagementObjectSearcher Class

    这样的事情应该可以解决问题:

    using System;
    using System.Management;
    using System.Windows.Forms;
    
    namespace WMISample
    {
        public class MyWMIQuery
        {
            public static void Main()
            {
                try
                {
                    ManagementObjectSearcher searcher = 
                        new ManagementObjectSearcher("root\\CIMV2", 
                        "SELECT * FROM Win32_Product WHERE Name LIKE '%SQL%'"); 
    
                    foreach (ManagementObject queryObj in searcher.Get())
                    {
                        Console.WriteLine("-----------------------------------");
                        Console.WriteLine("Win32_Product instance");
                        Console.WriteLine("-----------------------------------");
                        Console.WriteLine("InstallDate: {0}", queryObj["InstallDate"]);
                        Console.WriteLine("InstallLocation: {0}", queryObj["InstallLocation"]);
                        Console.WriteLine("Name: {0}", queryObj["Name"]);
                        Console.WriteLine("SKUNumber: {0}", queryObj["SKUNumber"]);
                        Console.WriteLine("Vendor: {0}", queryObj["Vendor"]);
                        Console.WriteLine("Version: {0}", queryObj["Version"]);
                    }
                }
                catch (ManagementException e)
                {
                    MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
                }
            }
        }
    }
    
    1. 升级工具以升级顾问结束
    2. 调试符号是某些应用程序按需从符号服务器中提取的,并且不会显示在 Win32_Products 中。
    3. 似乎无法通过对 Win32_Products 的普通 WMI 查询检测到复制支持
    4. Books Online 以 Books Online 结尾(英文)
    5. 开发工具以 BI Development Studio 结束

    您可以通过运行 SQL Server 安装发现报告了解已安装的功能(需要管理员权限):

    1. 转到“开始”菜单
    2. 点击所有程序
    3. 单击 Microsoft SQL Server
    4. 点击配置工具
    5. 点击 SQL Server 安装中心
    6. 点击工具部分链接
    7. 单击已安装的 SQL Server 功能发现报告

    您还可以通过运行setup.exe /ACTION=RUNDISCOVERY /Q(在 SQL Server 2008 R2 的情况下从C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\SQLServer2008R2)从命令行创建报告。报告文件通常位于C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Log\YYYYMMDD_HHmmSS,其中 YYYYMMDD_HHmmSS 是报告运行的日期和时间。 SqlDiscoveryReport.xml 可能是对以编程方式使用最有用的一种。请注意,这些位置可能会根据用户在初始设置期间选择的安装位置和 SQL Server 版本而有所不同。

    【讨论】:

    • 感谢您的回复。我已经在使用这种 WMI 方法(也许我没有查询正确的 WMI 类,但我只能获得已安装的产品,这些产品没有显示第一部分中提到的足够详细信息。我将其标记为答案,因为我认为它可能不可能..谢谢
    • 我对此进行了更多思考,并在 SQL Server 功能发现报告中添加了一些附加信息。
    • 使用此命令从 PowerShell 查询 Win32_Product:Get-WmiObject -Class 'Win32_Product' -Filter "Name LIKE '%SQL%'"
    【解决方案2】:

    避免使用 Win_32 产品,请参阅 here

    请改用CreateObject("WindowsInstaller.Installer")

    【讨论】:

    • 为什么要避免 Win32_Product?它很慢,但它会产生结果。如果您只需要运行一次,速度可能不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多