使用Excel VBA查找注册表项

使用Excel VBA查找注册表项,excel,vba,registry,Excel,Vba,Registry,我想检查用户是否安装了Microsoft SQL本机客户端2008(sqlncli10)或本机客户端2012(sqlncli11) Dim key As String Dim myShell As Object Set myShell = CreateObject("WScript.Shell") key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\SQLNCLI11\CurrentVersion\Version"

我想检查用户是否安装了Microsoft SQL本机客户端2008(sqlncli10)或本机客户端2012(sqlncli11)

Dim key As String
Dim myShell As Object
Set myShell = CreateObject("WScript.Shell")

key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\SQLNCLI11\CurrentVersion\Version"
'key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion"

Dim strKey As String
strKey = myShell.RegReadkey(key)
查找本机客户端时,我收到错误:

注册表项“HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft SQL Server\SQLNCLI11\CurrentVersion\Version”中的根目录无效

但是,当尝试WindowsNT版本时,它可以正常工作

我用HKLM替换了HKEY_LOCAL_机器:但这也不起作用

编辑


我想我刚想明白了。当我签入注册表时,它存在于64位部分。然而,VBA检入32位,软件的根成为Wow6432Node。因此,它在Wow6432Node\Microsoft\Microsoft SQL Server中进行检查,但密钥不存在。但是我找到了另一个路径SOFTWARE\Microsoft\Microsoft SQL Server Native Client 10或11,它同时存在于32位和64位中。

此代码适用于我:

Dim key As String
Dim objShell As Object

Set objShell = CreateObject("WScript.Shell")
key = objShell.RegRead _
    ("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\SQLNCLI11\CurrentVersion\Version")

我只是在Excel2010VBA编辑器中执行了此操作。

使用下面的函数代替WScript。这将适用于32位和64位

Function ReadRegistry(RootKey, Key As String, Value As String, Optional RegType As Integer = 32) As String


    ' Reads a REG_SZ value from the local computer's registry using WMI.
    ' Parameters:
    '   RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788(VS.85).aspx for a list of possible values).
    '   Key - The key that contains the desired value.
    '   Value - The value that you want to get.
    '   RegType - The registry bitness: 32 or 64.


    Dim oCtx, oLocator, oReg, oInParams, oOutParams

    Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
    oCtx.Add "__ProviderArchitecture", RegType

    Set oLocator = CreateObject("Wbemscripting.SWbemLocator")
    Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv")

    Set oInParams = oReg.Methods_("GetStringValue").InParameters
    oInParams.hDefKey = RootKey
    oInParams.sSubKeyName = Key
    oInParams.sValueName = Value

    Set oOutParams = oReg.ExecMethod_("GetStringValue", oInParams, , oCtx)

    ReadRegistry = oOutParams.sValue
End Function

Sub test()
  Const HKEY_CURRENT_USER = &H80000001
  MsgBox ReadRegistry(HKEY_CURRENT_USER, "Software\Microsoft\Office\15.0\Outlook\Security", "OutlookSecureTempFolder")
End Sub

这已经得到了回答:同样的结果。我可以找到Windows NT,但当对SQL本机客户端执行完全相同的操作时,它找不到它。这就是我的代码所做的,并且对于某些情况,它说它是注册表项中的无效根,但Win NT版本除外。为了检查system32中存在的dll,我做了一个非常糟糕的变通方法。我唯一能想到的是VBA中的权限检查问题。我想您可以通过让Excel作为管理员执行来检查这一点。至少你知道你的代码还可以!很高兴你有了解决办法。我刚发现我想。当我签入注册表时,它存在于64位部分。然而,VBA是传统的,它是32位的,软件的根是Wow6432Node。因此,它在Wow6432Node\Microsoft\Microsoft SQL Server中进行检查,但在那里不存在。但我找到了另一个路径SOFTWARE\Microsoft\Microsoft SQL Server本机客户端10或11,它同时存在于32位和64位中。谢谢你的帮助。Santosh——你去年在一些JSON问题上帮了我很大的忙()。我有一个相关的问题,我想让你来处理一下,看看进一步研究是否有什么用。我可以直接联系你吗?还是我必须开始一个线程?