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

42

微软Excel允许从“其他来源”导入数据。其中一个选项是使用OLE DB提供程序。

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


将近7年过去了,仍然没有可接受的答案? - Andreas
8个回答

60

如果您有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


21

因为这个问题比我预想的更难找到答案,所以我自己回答了这个问题。 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

19

利用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()... - SamB

14
在Windows资源管理器中:
  1. 创建一个文本文件,可以是任何位置,例如temp.txt。
  2. 将扩展名更改为“udl”。例如temp.udl。
  3. 双击temp.udl。
  4. 转到[提供程序]选项卡。观察“OLE”列表。

7
OLEDB提供了一个类,可以为您枚举所有的OLE DB提供程序。 Microsoft OLE DB Root Enumerator
  • ProgID: "MSDAENUM"
  • clsid: {c8b522d0-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);
< p >像OLEDB的其余部分一样,IRowset接口是无情的。它是一个API的噩梦,是在Java风行的时代梦想出现的。幸运的是,微软在OLEDB周围创建了一个友好的包装器:ActiveX Data Object(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}

微软记录了ISourcesRowset::GetSourcesRowset中的列 档案

  • 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绑定器的提供程序绑定器 如果一个代码片段既可以作为数据源对象,也可以作为枚举器使用,则在行集中会列出两次,每次都扮演不同的角色。
  • SOURCES_ISPARENT (4): 如果该行描述一个枚举器,则当枚举器是父枚举器时,SOURCES_ISPARENTVARIANT_TRUE;也就是说,正在进行枚举的枚举器中包含了刚才调用ISourcesRowset::GetSourcesRowset的枚举器。这允许使用者通过枚举器向后遍历。枚举器是否能够枚举其父级是由提供程序特定的。否则,SOURCES_ISPARENT为VARIANT_FALSE。

    如果该行描述数据源对象,则使用者将忽略SOURCES_ISPARENT。


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

Excel Import Data Wizard


2
请注意,如果您试图确定自己是否拥有64位提供程序,但您的Office版本正在运行32位版本,则这将无法帮助。(反之亦然-找到一个32位提供程序和一个64位Office版本。) - Zev Spitz

4

我曾经遇到一个问题,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"]);

2

我通过@Steinar Herland编辑了代码。

如果你只想显示ACCESS OLEDB提供程序,请将以下内容粘贴到powershell命令提示符中:

foreach ($provider in [System.Data.OleDb.OleDbEnumerator]::GetRootEnumerator())
{
    if ($provider.GetValue(0) -like "Microsoft.ACE*")
    {
        $v = New-Object PSObject
        Add-Member -in $v NoteProperty "Provider Name" $provider.GetValue(0)
        Add-Member -in $v NoteProperty "Description" $provider.GetValue(2)
        $v
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接