web-dev-qa-db-ja.com

インストールされているOLE DBプロバイダーのリストを取得するには?

Microsoft Excelでは、「その他のソース」からデータをインポートできます。オプションの1つは、OLE DBプロバイダーを使用することです。

利用可能なOLE DBプロバイダーのリストを取得する方法は?

22
kevinarpe

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

37
Steinar Herland

これは私が期待したことを見つけるのが困難だったので、私は自分の質問に答えています。 Google-fuが私の質問の一部にしか答えられませんでした。さまざまなブログエントリや公式ドキュメントから情報を統合する必要がありました。

以下は、テキストファイルにコピー/貼り付けしてWindowsで実行できるVBScriptです。このバージョンを実行するためにローカル管理者権限は必要ありません。

レジストリのサイズとCPUの速度によっては、実行に最大1分かかる場合があります。結果は、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
13
kevinarpe

OLEDBは、すべてのOLE DBプロバイダーを列挙するクラスを提供します。

Microsoft OLE DB Root Enumerator????

  • ProgID: "MSDAENUM"
  • clsid{c8b522d0-5cf3-11ce-ade5-00aa0044773d}
  • CLSID_OLEDB_ENUMERATOR(frommsdaguid.hin the sdk)

残念ながら、ADO(ADOはOLE DBのフレンドリーなラッパーであり、MSDAENUMクラスは、ADOには、OLEDBプロバイダーのサポートが必要です。つまり、それに話しかけるしかないので、直接IRowsetです。

そしてOLE DB apiは...無慈悲です。

2
Ian Boyd