web-dev-qa-db-ja.com

VBScriptを使用してレジストリキーが存在するかどうかを確認する

これは簡単だと思いましたが、明らかに誰もそれをしません...レジストリキーが存在するかどうかを確認しようとしています。その中に(デフォルト)などの値があるかどうかは気にしません。

これは私が試してきたことです。

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_USERES\.DEFAULT\.Networkが存在するかどうかを知りたいだけです。私が検索で見つけたものはほとんどそれらを操作することについて議論しているようであり、キーが存在しない場合は魔法のように作成されるため、キーが存在することをほぼ仮定します。

12
MTeck

私は解決策を見つけました。

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
10
MTeck

ここの2つの方法の2つ目は、あなたが望むことをします。私はちょうどこのスレッドで成功しなかった後、それを使用しましたが、それは私のために働いています。

http://yorch.org/2011/10/two-ways-to-check-if-a-registry-key-exists-using-vbscript/

コード:

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
8
chris_k

RegReadおよびエラー処理のトリックを回避する最も簡単な方法。レジストリのオプションのフレンドリーなconst:

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

上記の重要事項:

  • EnumKeyには通常の3つではなく4つのパラメーターが渡されます。
  • ゼロはキーが存在することを意味します。
  • キー名の後のスラッシュはオプションであり、必須ではありません。
5
WhoIsRich

他の誰かがこれに遭遇した場合に備えて、WhoIsRichの例を取り上げて少し変更しました。 ReadRegを呼び出すとき、次のことを行う必要がありました。ReadReg( "App"、 "HKEY_CURRENT_USER\App\Version")これにより、レジストリからバージョン番号があれば、それを読み取ることができます。また、書き込みに管理者特権を必要としないため、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
2
Jonathan

Scripting Guy!をご覧ください。ブログ:

レジストリに値が存在するかどうかを確認する方法はありますか?

リモートコンピューターでのチェックについて説明し、キーから文字列値を読み取り、値が(空ではなく)Nullの場合、キーが存在しないことを示します。

RegReadメソッドの使用に関して、「キー」という用語がレジストリ値が保持されるパス(またはフォルダー)を指し、そのキーのリーフアイテムが「値」と呼ばれる場合、WshShell.RegRead(strKey)を使用して(値の存在とは対照的に)キーの存在を検出するには、次のことを考慮してください(Windows XPで観察されます)。

StrKey名が既存のレジストリパスの名前でない場合、Err.Descriptionは「レジストリキーの無効なルート」を読み取り、Err.Numberが0x80070002になります。

StrKeyが存在するレジストリパスの名前に末尾の「\」を含まない場合、RegReadメソッドはstrKeyを単純なパス参照ではなくパス\値参照として解釈し、同じErr.Numberを返しますがErrを返します。 「レジストリキーを開けません」の説明。エラーメッセージの「キー」という用語は、「値」を意味するように見えます。これは、strKeyがパスが存在するパス\値を参照しているが、値が存在しない場合に得られる結果と同じです。

0
kbulgrien

編集(VBAが欲しかったと思います)

レジストリから存在しない値を読み取ろうとすると、Nullが返されます。したがって、Null値を確認するだけです。

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
0
vulkanino