Windows 使用VBScript检查注册表项是否存在

Windows 使用VBScript检查注册表项是否存在,windows,vbscript,registry,Windows,Vbscript,Registry,我以为这很容易,但显然没有人这么做。。。 我正在尝试查看是否存在注册表项。我不在乎里面是否有任何值,比如(默认值) 这就是我一直在尝试的 Set objRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv") objRegistry.GetStringValue &H80000003,".DEFAULT\Network","",regValue If IsEmpty(regValue) Then Wscript.E

我以为这很容易,但显然没有人这么做。。。 我正在尝试查看是否存在注册表项。我不在乎里面是否有任何值,比如(默认值)

这就是我一直在尝试的

Set objRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv")
objRegistry.GetStringValue &H80000003,".DEFAULT\Network","",regValue

If IsEmpty(regValue) Then
    Wscript.Echo "The registry key does not exist."
Else
    Wscript.Echo "The registry key exists."
End If
我只想知道HKEY_用户\默认\网络是否存在。我在搜索时发现的任何东西似乎都是在讨论如何操作它们,并且基本上假设密钥确实存在,因为它是神奇地创建的,如果它不存在的话。

编辑(对不起,我以为你想要VBA)。

每当您试图从注册表读取一个不存在的值时,就会返回一个空值。因此,您所要做的就是检查空值

使用
IsNull
而不是
IsEmpty

Const HKEY_LOCAL_MACHINE = &H80000002

strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & _ 
    strComputer & "\root\default:StdRegProv")

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
strValueName = "Test Value"
objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

If IsNull(strValue) Then
    Wscript.Echo "The registry key does not exist."
Else
    Wscript.Echo "The registry key exists."
End If
我找到了解决办法

dim bExists
ssig="Unable to open registry key"

set wshShell= Wscript.CreateObject("WScript.Shell")
strKey = "HKEY_USERS\.Default\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Digest\"
on error resume next
present = WshShell.RegRead(strKey)
if err.number<>0 then
    if right(strKey,1)="\" then    'strKey is a registry key
        if instr(1,err.description,ssig,1)<>0 then
            bExists=true
        else
            bExists=false
        end if
    else    'strKey is a registry valuename
        bExists=false
    end if
    err.clear
else
    bExists=true
end if
on error goto 0
if bExists=vbFalse then
    wscript.echo strKey & " does not exist."
else
    wscript.echo strKey & " exists."
end if
dim bExists
ssig=“无法打开注册表项”
设置wshShell=Wscript.CreateObject(“Wscript.Shell”)
strKey=“HKEY\U用户\.Default\Software\Microsoft\Windows\CurrentVersion\internetsettings\Digest\”
出错时继续下一步
当前=WshShell.重新研磨(strKey)
如果错误号为0,则
如果right(strKey,1)=“\”则'strKey是一个注册表项
如果指令(1,错误描述,ssig,1)为0,则
bExists=true
其他的
bExists=false
如果结束
else的strKey是注册表值名称
bExists=false
如果结束
清楚
其他的
bExists=true
如果结束
错误转到0
如果bExists=vbFalse,则
wscript.echo strKey&“不存在。”
其他的
wscript.echo strKey&“存在。”
如果结束

看看脚本编写人员!博客:

他们讨论在远程计算机上执行检查,并显示如果从键中读取字符串值,并且如果该值为Null(与空相反),则该键不存在

关于使用“遗憾”方法,如果“KEY”一词指的是保存注册表值的路径(或文件夹),并且如果该键中的叶项被称为“值”,则使用WSHECKE.RADAD(STRKEY)检测密钥存在(相对于值存在性)考虑以下(如在WindowsXP上观察到的):

如果strKey name不是现有注册表路径的名称,则错误描述将显示“注册表项中的根无效”。。。错误号为0x80070002


如果strKey指定了一个已存在但不包含尾随“\”的注册表路径,则Regrad方法会将strKey解释为path\value引用,而不是简单的path引用,并返回相同的Err.Number,但带有“无法打开注册表项”的Err.Description。错误消息中的术语“键”似乎表示“值”。这与strKey引用路径存在但该值不存在的路径\值时得到的结果相同。

这里的两种方法中的第二种可以满足您的需要。我刚刚使用了它(在这个线程中没有发现成功之后),它对我很有用

守则:

Const HKCR = &H80000000 'HKEY_CLASSES_ROOT
Const HKCU = &H80000001 'HKEY_CURRENT_USER
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Const HKUS = &H80000003 'HKEY_USERS
Const HKCC = &H80000005 'HKEY_CURRENT_CONFIG

Function KeyExists(Key, KeyPath)
    Dim oReg: Set oReg = GetObject("winmgmts:!root/default:StdRegProv")
    If oReg.EnumKey(Key, KeyPath, arrSubKeys) = 0 Then
        KeyExists = True
    Else
        KeyExists = False
   End If
End Function

避免重磨和错误处理技巧的最简单方法。注册表的可选友好常量:

Const HKEY_CLASSES_ROOT   = &H80000000
Const HKEY_CURRENT_USER   = &H80000001
Const HKEY_LOCAL_MACHINE  = &H80000002
Const HKEY_USERS          = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
然后检查:

Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

If oReg.EnumKey(HKEY_LOCAL_MACHINE, "SYSTEM\Example\Key\", "", "") = 0 Then
  MsgBox "Key Exists"
Else
  MsgBox "Key Not Found"
End If
以上内容的重要注意事项:

  • 有4个参数被传递给EnumKey,而不是通常的3个
  • 等于零表示密钥存在
  • 键名后的斜杠是可选的,不是必需的

    • 为了防止其他人遇到这种情况,我以WhoIsRich的例子对其进行了一些修改。在调用ReadReg时,我需要执行以下操作:ReadReg(“应用”、“HKEY\U当前用户\应用\版本”),这样就可以从注册表中读取版本号(如果存在)。我也在使用HKCU,因为它不需要管理员权限才能写入

      Function ReadReg(RegKey, RegPath)
            Const HKEY_CURRENT_USER = &H80000001
            Dim objRegistry, oReg
            Set objRegistry = CreateObject("Wscript.shell")
            Set oReg = GetObject("winmgmts:!root\default:StdRegProv")
      
            if oReg.EnumKey(HKEY_CURRENT_USER, RegKey) = 0 Then
              ReadReg = objRegistry.RegRead(RegPath)
            else
              ReadReg = ""
            end if
      End Function
      

      被接受的答案太长,其他答案对我不起作用。我要把这个留着以后用

      Dim sKey, bFound
      skey = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\SecurityHealth"
      
      with CreateObject("WScript.Shell")
        on error resume next            ' turn off error trapping
          sValue = .regread(sKey)       ' read attempt
          bFound = (err.number = 0)     ' test for success
        on error goto 0                 ' restore error trapping
      end with
      
      If bFound Then
        MsgBox = "Registry Key Exist."
      Else
        MsgBox = "Nope, it doesn't exist."
      End If
      
      这是注册表树的列表,请根据当前任务选择自己的基础

      HKCR = HKEY_CLASSES_ROOT
      HKCU = HKEY_CURRENT_USER
      HKLM = HKEY_LOCAL_MACHINE
      HKUS = HKEY_USERS
      HKCC = HKEY_CURRENT_CONFIG
      

      与VBA相反,
      On Error Goto{label}
      在VBScript上不起作用,但您可以使用
      On Error Resume Next
      并通过
      err.Number
      err.Description
      读取
      err
      对象,但这并不能满足我的需要。我需要知道钥匙是否存在。不是值:数据对。根据默认值“”进行测试就可以了。但是,您提供的在搜索中容易找到的复制/粘贴不会区分该值是否存在、是否为空或是否为null。我需要知道是否只有密钥存在。出于好奇,上面的链接已经死了,我找不到缓存页面;它的副本似乎是,但另一种方式是@mteckt给出的答案,当我检查该页面时,该页面仍然处于活动状态。确实如此。很抱歉,我一定是在短暂停机或其他情况下访问了它。还有一个重要提示:如果使用
      HKEY\U LOCAL\U MACHINE
      作为第一个参数,请在If语句之前设置一个常量,如下所示:
      Const HKEY\U LOCAL\U MACHINE=&H8000002
      @Beems Good point,为了避免混淆,我们添加了常量。有人能解释一下第四个参数吗?谢谢