如何使用 C# 可靠地确定安装了 SQL Server 2008 的哪些组件?

Posted

技术标签:

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

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

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

    升级工具 调试符号 复制支持 在线图书 开发工具

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

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

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

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

请帮忙。

谢谢

史蒂夫

【问题讨论】:

【参考方案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);
            
        
    

    升级工具以升级顾问结束 调试符号是某些应用程序按需从符号服务器中提取的,并且不会显示在 Win32_Products 中。 似乎无法通过对 Win32_Products 的普通 WMI 查询检测到复制支持 Books Online 以 Books Online 结尾(英文) 开发工具以 BI Development Studio 结束

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

    转到“开始”菜单 点击所有程序 单击 Microsoft SQL Server 点击配置工具 点击 SQL Server 安装中心 点击工具部分链接 单击已安装的 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?它很慢,但它会产生结果。如果您只需要运行一次,速度可能不是问题。

以上是关于如何使用 C# 可靠地确定安装了 SQL Server 2008 的哪些组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用这些部件在 C# 中可靠地构建 URL?

如何确保在崩溃 c# 时保存应用程序状态

在 C# 中,如何可靠地杀死进程树 [重复]

如何可靠地确定Passbook是否可用?

如何在 Xcode 8 上可靠地安装和设置快速测试框架?

如何从 C# 连接到 SQL 数据库?