如何获取已安装的 OLE DB 提供程序的列表?

Posted

技术标签:

【中文标题】如何获取已安装的 OLE DB 提供程序的列表?【英文标题】:How to get a list of installed OLE DB providers? 【发布时间】:2016-10-17 09:14:04 【问题描述】:

Microsoft Excel 允许从“其他来源”导入数据。一种选择是使用 OLE DB 提供程序。

如何获取可用 OLE DB 提供程序的列表?

【问题讨论】:

【参考方案1】:

如果您有可用的 powershell,只需将其粘贴到 powershell 命令提示符中:

foreach ($provider in [System.Data.OleDb.OleDbEnumerator]::GetRootEnumerator())

    $v = New-Object PSObject        
    for ($i = 0; $i -lt $provider.FieldCount; $i++) 
    
        Add-Member -in $v NoteProperty $provider.GetName($i) $provider.GetValue($i)
    
    $v

学分和更高级的用法: http://dbadailystuff.com/list-all-ole-db-providers-in-powershell

【讨论】:

【参考方案2】:

我正在回答我自己的问题,因为这比我预期的更难找到。 Google-fu 只能回答我的部分问题;我需要从各种博客条目和官方文档中综合信息。

下面是 VBScript,您可以将其复制/粘贴到文本文件中并在 Windows 上运行。您不需要本地管理员权限即可运行此版本。

根据注册表的大小和 CPU 的速度,运行可能需要一分钟。结果是一个带有文本的消息框,可以使用Ctrl+C 将其复制到剪贴板。

主要参考:https://sysmod.wordpress.com/2014/07/11/vbscript-to-list-installed-oledb-providers/

'List of installed OLEDB providers on local computer
Option Explicit
Const HKEY_CLASSES_ROOT     = &H80000000
Const HKEY_CURRENT_USER     = &H80000001
Const HKEY_LOCAL_MACHINE    = &H80000002
Const HKEY_USERS        = &H80000003
Const HKEY_CURRENT_CONFIG   = &H80000005

Dim OutText, strComputer, objRegistry
Dim num
Dim ProgIdDict

strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
OutText = "Note: Strike Ctrl+C to copy full text to clipboard"
Num = 1
Set ProgIdDict = CreateObject("Scripting.Dictionary")

' I discovered these registrations can appear in three different places.
' Use ProgIdDict to prevent dupes in the output
Append objRegistry, HKEY_CLASSES_ROOT, "HKEY_CLASSES_ROOT", "CLSID", ProgIdDict, Num, OutText
Append objRegistry, HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE", "SOFTWARE\Classes\CLSID", ProgIdDict, Num, OutText
Append objRegistry, HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE", "SOFTWARE\Classes\Wow6432Node\CLSID", ProgIdDict, Num, OutText

Sub Append(ByVal objRegistry, ByVal HKEYConstant, ByVal HKEYConstantStr, ByVal KeyPrefixStr, ByVal ProgIdDict, ByRef Num, ByRef OutText)

    Dim Key, arrKeys
    Dim strKeyPath, strValue, uValue

    objRegistry.enumKey HKEYConstant, KeyPrefixStr, arrKeys

    for each key in arrKeys

        strKeyPath = KeyPrefixStr & "\" & key

        ' if key exists...
        ' I noticed something weird where non-MSOLAP entries use the first style,
        ' and MSOLAP entries use the second style.
        If 0 = objRegistry.GetDWordValue(HKEYConstant, strKeyPath, "OLEDB_SERVICES", uValue) _
        Or 0 = objRegistry.GetDWordValue(HKEYConstant, strKeyPath & "\OLEDB_SERVICES", "", uValue) _
        Then
            objRegistry.GetStringValue HKEYConstant,strKeyPath & "\ProgID","",strValue
            If Not ProgIdDict.Exists(strValue) _
            Then
                ProgIdDict.Add strValue, strValue
                OutText=OutText & vbcrlf & vbcrlf
                'get the (Default) value which is the name of the provider
                objRegistry.GetStringValue HKEYConstant,strKeyPath,"",strValue
                OutText=OutText & num & ") " & strValue & vbcrlf & "Key: \\" & HKEYConstantStr & "\" & KeyPrefixStr & "\" & key
                ' and the expanded description
                objRegistry.GetStringValue HKEYConstant,strKeyPath & "\OLE DB Provider","",strValue
                OutText=OutText & vbcrlf & "OLE DB Provider: " & strValue
                objRegistry.GetStringValue HKEYConstant,strKeyPath & "\ProgID","",strValue
                OutText=OutText & vbcrlf & "ProgID: " & strValue
                objRegistry.GetStringValue HKEYConstant,strKeyPath & "\VersionIndependentProgID","",strValue
                OutText=OutText & vbcrlf & "VersionIndependentProgID: " & strValue
                num = 1 + num
            End If
        end if
    next

End Sub

Wscript.Echo OutText

【讨论】:

令人惊叹。谢谢!【参考方案3】:

另一个使用 PowerShell 的解决方案,这次利用 .NET 代码(感谢 jrich523.wordpress.com)。

将其插入 PowerShell 控制台:

(New-Object system.data.oledb.oledbenumerator).GetElements()

产生这样的输出:

SOURCES_NAME        : SQLOLEDB Enumerator
SOURCES_PARSENAME   : DFA22B8E-E68D-11d0-97E4-00C04FC2AD98
SOURCES_DESCRIPTION : Microsoft OLE DB Enumerator for SQL Server
SOURCES_TYPE        : 2
SOURCES_ISPARENT    : False
SOURCES_CLSID       : DFA22B8E-E68D-11d0-97E4-00C04FC2AD98

【讨论】:

最好写成(New-Object System.Data.OleDb.OleDbEnumerator).GetElements() ...【参考方案4】:

在 Windows 资源管理器中:

    在任何地方创建一个文本文件。例如temp.txt。 将扩展名更改为“udl”。例如。 temp.udl。 双击 temp.udl。 转到[提供者]选项卡。观察“OLE”列表

【讨论】:

【参考方案5】:

我遇到了一个问题,即 Steinar Herland 的 powershell 脚本没有找到我的 oledb 提供程序。我写了一个小 C# 程序。

    using System.Data.OleDb;    
    var oleEnum = new OleDbEnumerator();
    var elems = oleEnum.GetElements();
    if (elems != null && elems.Rows != null)
       foreach (System.Data.DataRow row in elems.Rows)
          if (!row.IsNull("SOURCES_NAME") && row["SOURCES_NAME"] is string)
             Console.WriteLine(row["SOURCES_NAME"]);

【讨论】:

【参考方案6】:

OLEDB 提供了一个类,它将为您枚举所有 OLE DB 提供程序。

Microsoft OLE DB Root Enumerator?

ProgID:“MSDAENUM” clsidc8b522d0-5cf3-11ce-ade5-00aa0044773d CLSID_OLEDB_ENUMERATOR (来自 sdk 中的 msdaguid.h

步骤

创建枚举器

ISourcesRowset enum = (ISourcesRowset)CreateComObject(CLSID_OLEDB_ENUMERATOR);

以 OLEDB IRowset 的形式获取结果:

IRowset rowset = enum.GetSourcesRowset(null, IRowset, 0, null);

IRowset 接口,就像 OLEDB 的其余部分一样......无情。这是 API 的噩梦,是在 Java 风靡一时的时候梦寐以求的。幸运的是,微软围绕 OLEDB 创建了一个友好的包装器:称为 ActiveX 数据对象 (ADO)。它甚至提供了一个方便的函数来将 OLEDB IRowset 包装到 ADO Recordset(适配器模式)中:

Recordset rs = (Recordset)CreateComObject(CLASS_Recordset);
(rs as ADORecordsetConstruction).Rowset = rowset;

现在您可以迭代结果:

SOURCES_NAME                SOURCES_PARSENAME                       SOURCES_DESCRIPTION                                   SOURCES_TYPE  SOURCES_ISPARENT  SOURCES_CLSID
--------------------------  --------------------------------------  ----------------------------------------------------  ------------  ----------------  --------------------------------------
SQLOLEDB                    0C7FF16C-38E3-11d0-97AB-00C04FC2AD98  Microsoft OLE DB Provider for SQL Server              1             False             0C7FF16C-38E3-11d0-97AB-00C04FC2AD98
MSOLAP                      10154F28-4979-4166-B114-3E7A7926C747  Microsoft OLE DB Provider for Analysis Services 10.0  1             False             10154F28-4979-4166-B114-3E7A7926C747
MSOLAP                      10154F28-4979-4166-B114-3E7A7926C747  Microsoft OLE DB Provider for Analysis Services 10.0  3             False             10154F28-4979-4166-B114-3E7A7926C747
MSDataShape                 3449A1C8-C56C-11D0-AD72-00C04FC29863  MSDataShape                                           1             False             3449A1C8-C56C-11D0-AD72-00C04FC29863
SQLNCLI11                   397C2819-8272-4532-AD3A-FB5E43BEAA39  SQL Server Native Client 11.0                         1             False             397C2819-8272-4532-AD3A-FB5E43BEAA39
ADsDSOObject                549365d0-ec26-11cf-8310-00aa00b505db  OLE DB Provider for Microsoft Directory Services      1             False             549365d0-ec26-11cf-8310-00aa00b505db
MSOLEDBSQL                  5A23DE84-1D7B-4A16-8DED-B29C09CB648D  Microsoft OLE DB Driver for SQL Server                1             False             5A23DE84-1D7B-4A16-8DED-B29C09CB648D
MSOLEDBSQL Enumerator       720818D5-1465-4812-839F-9F15C38A52CB  Microsoft OLE DB Driver for SQL Server Enumerator     2             False             720818D5-1465-4812-839F-9F15C38A52CB
SQLNCLI11 Enumerator        8F612DD2-7E28-424f-A2FD-C2EECC314AA2  SQL Server Native Client 11.0 Enumerator              2             False             8F612DD2-7E28-424f-A2FD-C2EECC314AA2
Windows Search Data Source  9E175B8B-F52A-11D8-B9A5-505054503030  Microsoft OLE DB Provider for Search                  1             False             9E175B8B-F52A-11D8-B9A5-505054503030
MSDASQL                     c8b522cb-5cf3-11ce-ade5-00aa0044773d  Microsoft OLE DB Provider for ODBC Drivers            1             False             c8b522cb-5cf3-11ce-ade5-00aa0044773d
MSDASQL Enumerator          c8b522cd-5cf3-11ce-ade5-00aa0044773d  Microsoft OLE DB Enumerator for ODBC Drivers          2             False             c8b522cd-5cf3-11ce-ade5-00aa0044773d
MSOLAP                      DBC724B0-DD86-4772-BB5A-FCC6CAB2FC1A  Microsoft OLE DB Provider for Analysis Services 14.0  1             False             DBC724B0-DD86-4772-BB5A-FCC6CAB2FC1A
MSOLAP                      DBC724B0-DD86-4772-BB5A-FCC6CAB2FC1A  Microsoft OLE DB Provider for Analysis Services 14.0  3             False             DBC724B0-DD86-4772-BB5A-FCC6CAB2FC1A
Microsoft.Jet.OLEDB.4.0     dee35070-506b-11cf-b1aa-00aa00b8de95  Microsoft Jet 4.0 OLE DB Provider                     1             False             dee35070-506b-11cf-b1aa-00aa00b8de95
SQLOLEDB Enumerator         DFA22B8E-E68D-11d0-97E4-00C04FC2AD98  Microsoft OLE DB Enumerator for SQL Server            2             False             DFA22B8E-E68D-11d0-97E4-00C04FC2AD98
MSDAOSP                     dfc8bdc0-e378-11d0-9b30-0080c7e9fe95  Microsoft OLE DB Simple Provider                      1             False             dfc8bdc0-e378-11d0-9b30-0080c7e9fe95
MSDAORA                     e8cc4cbe-fdff-11d0-b865-00a0c9081c1d  Microsoft OLE DB Provider for Oracle                  1             False             e8cc4cbe-fdff-11d0-b865-00a0c9081c1d

Microsoft 记录了 ISourcesRowset::GetSourcesRowset 中的列 archive

SOURCES_NAME (0):数据存储或枚举器的固定名称。

SOURCES_PARSENAME (1):传递给IParseDisplayName 以获得数据源对象或枚举器的名字对象的字符串。

SOURCES_DESCRIPTION (2):OLE DB 数据源对象或枚举器的描述。

SOURCES_TYPE (3):指定行是描述数据源对象还是枚举器:

DBSOURCETYPE_DATASOURCE_TDP (1):表示表格数据提供者 DBSOURCETYPE_ENUMERATOR(2):表示一个枚举器 DBSOURCETYPE_DATASOURCE_MDP (3):表示多维(OLAP)提供者 DBSOURCETYPE_BINDER(4):表示支持直接 URL binder 的 provider binder 如果一段代码既可以用作数据源对象又可以用作枚举器,则它会在行集中列出两次,每个角色一次。

SOURCES_ISPARENT (4):如果行描述了一个枚举器,如果枚举器是父枚举器,SOURCES_ISPARENTVARIANT_TRUE;也就是说,其枚举包含刚刚调用ISourcesRowset::GetSourcesRowset 的枚举器的枚举器。这允许消费者向后遍历枚举。枚举器是否能够枚举其父级是特定于提供者的。否则,SOURCES_ISPARENT 为 VARIANT_FALSE。

如果该行描述了一个数据源对象,则 SOURCES_ISPARENT 会被消费者忽略。

【讨论】:

【参考方案7】:

如果您安装了 MS Excel,为什么还要经历所有这些脚本/powershell 的所有麻烦?您可以使用 Excel 从其他来源导入数据,它将显示所有已安装的 OLEDB 数据源。

【讨论】:

请注意,如果您想弄清楚您是否有 64 位提供程序,但您的 Office 版本运行在 32 位,这将无济于事。 (反之亦然 - 寻找具有 64 位版本 Office 的 32 位提供商。)

以上是关于如何获取已安装的 OLE DB 提供程序的列表?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle OLE DB驱动如何安装?

请求的 OLE DB 提供程序 Microsoft.ACE.OLEDB.16.0 未注册。如果未安装 32 位驱动程序,请在 64 位模式下运行该软件包

OLE DB 提供程序“ADSDSOObject”尚未注册 - 在 Azure SQL 托管实例中

Microsoft Office 12.0 Access 数据库引擎 OLE DB 提供程序问题

SQL Server 2008 R2 中缺少 Microsoft Office 12.0 Access 数据库引擎 OLE DB 提供程序?

Microsoft Office 12.0 Access 数据库引擎 OLE DB Provider