Solved

VBScript RegRead Function is not working as expected

Posted on 2011-02-17
13
1,461 Views
Last Modified: 2012-05-11
I have a simple function whereby I pass in the name of a Registry Key Path.
I have a const variable of HKLM = &H80000002.
I'm passing in the following Check on this path:
sKeyPath = "SYSTEM\CurrentControlSet\Services\Eventlog"

I just want to check to make sure that the "Eventlog" folder exists and that's it.
When I make the function call I've tried passing in the following different parameters:
If regKeyExists(sKeyPath) and If regKeyExists(HKLM & "\" & sKeyPath)

I'm getting this error and it's driving me nuts. I'm not sure what else it could be:
-2147024894

Please see code below.

Thanks Experts,
Wallace

Function regKeyExists(Key)
	On Error Resume Next
	
	Dim oShll, rKey
	Set oShll = CreateObject("WScript.Shell")
	rKey = oShll.RegRead(Key)
	MsgBox Err.Number
	If Err.Number <> 0 Then
		Err.Clear
		regKeyExists = False
	Else
		Err.Clear
		regKeyExists = True
	End If
	
	Set oShll = Nothing
End Function

Open in new window

0
Comment
Question by:wally_davis
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 5
  • 3
13 Comments
 
LVL 55

Accepted Solution

by:
Bill Prew earned 250 total points
ID: 34920242
You need a trailing backslash, as in:

regKeyExists("HKLM\SYSTEM\CurrentControlSet\Services\Eventlog\")

~bp
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 34921284
Bill is right, but you can have your function make sure there is a trailing backslash as well.

Regards,

Rob.
Function regKeyExists(Key)
	On Error Resume Next
	
	If Right(Key, 1) <> "\" Then Key = Key & "\"
	Dim oShll, rKey
	Set oShll = CreateObject("WScript.Shell")
	rKey = oShll.RegRead(Key)
	MsgBox Err.Number
	If Err.Number <> 0 Then
		Err.Clear
		On Error GoTo 0
		regKeyExists = False
	Else
		Err.Clear
		On Error GoTo 0
		regKeyExists = True
	End If
	
	Set oShll = Nothing
End Function

Open in new window

0
 

Author Comment

by:wally_davis
ID: 34921954
Ok, I tried you're suggestions and to no avail. I'm doing some checking on the value that gets pass in to the Key variable (the parameter) in the Function regKeyExists(Key). I've tried prefixing the path sKeyPath = "SYSTEM\CurrentControlSet\Services\Eventlog\" with the the string of "HKLM" and the actual const variable where HKLM = &H80000002. So, it could look like one of the two prior to passing it in to the Function:
1. If regKeyExists(HKLM & "\" & sKeyPath & "\") Then OR
2. If regKeyExists("HKLM\" & sKeyPath & "\") Then

In the function itself I've displayed the value in the "Key" variable parameter to equate to this:
rKey = oShll.RegRead(Key)
So, var Key contains the Value "-2147483646\SYSTEM\CurrentControlSet\Services\Event Archiver Service" as it gets passed into this Key variable. After that, the rKey = Empty and the error I get is still -2147024894.
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 65

Expert Comment

by:RobSampson
ID: 34921997
Reg Read does not require any Hex constant values.  It only requires the standard user friendly string value of HKLM or HKCU, etc.

So, pass the value like this:

sKeyPath = "HKLM\SYSTEM\CurrentControlSet\Services\Event Archiver Service\"
If regKeyExists(sKeyPath) Then

Regards,

Rob.
sKeyPath = "HKLM\SYSTEM\CurrentControlSet\Services\Event Archiver Service\"

If regKeyExists(sKeyPath) Then
	MsgBox "Exists"
Else
	MsgBox "Does not exist"
End If

Function regKeyExists(Key)
	On Error Resume Next
	
	If Right(Key, 1) <> "\" Then Key = Key & "\"
	Dim oShll, rKey
	Set oShll = CreateObject("WScript.Shell")
	rKey = oShll.RegRead(Key)
	'MsgBox Err.Number
	If Err.Number <> 0 Then
		Err.Clear
		On Error GoTo 0
		regKeyExists = False
	Else
		Err.Clear
		On Error GoTo 0
		regKeyExists = True
	End If
	
	Set oShll = Nothing
End Function

Open in new window

0
 
LVL 55

Expert Comment

by:Bill Prew
ID: 34922591
As I mentioned in my first post, you need:

regKeyExists("HKLM\SYSTEM\CurrentControlSet\Services\Eventlog\")

~bp
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 34922669
LOL! Yes, that's true.
0
 

Author Comment

by:wally_davis
ID: 34927981
One last note guys, bp and Rob, you've both been a tremendous help.

I ran into one other snag. Let's say I have a KeyPath whose value is equal to:
HKLM\SYSTEM\CurrentControlSet\Services\Wallaces Key\".

Note the space in the last key "Wallaces Key". When I pass this in, it gives me an error of
-2147024894. I think this might have something to do with the fact the Key has a space (or could have multiple spaces). I tried passing the Key in with double quotes like this and it still fails when passed to the Function --> regKeyPath("""" & "HKLM\" & sKeyPath & "\" & """").

I'm sure there's a way through this problem. I just haven't found the fix for it. Thanks guys!
0
 

Author Comment

by:wally_davis
ID: 34928438
While I was thinking (ya, I know, dangerous huh) I'm also wondering if the Error Number of
-2147024894 is just another way of saying "This Subkey does not exist and this is the error I'm giving you as a result."

If you look at the function below, I get on of two values returned to the variable "rKey".
I get either a double-quote ("") and a Error Number of 0 if the Key exists or the var "rKey" will get "Empty" returned to it and an Error Number of -2147024894. Your experiences or thoughts on how you would handle it?
Function regKeyExists(Key)
	On Error Resume Next
	
	Dim oShll, rKey
	Set oShll = CreateObject("WScript.Shell")
	rKey = oShll.RegRead(Key)
	
	MsgBox Err.Number
	
	If Err.Number <> 0 Then
		Err.Clear
		On Error Goto 0
		regKeyExists = False
	Else
		Err.Clear
		On Error Goto 0
		regKeyExists = True		
	End If
End Function

Open in new window

0
 

Author Comment

by:wally_davis
ID: 34928477
Ah crap, I'm getting ahead of myself. I completely forgot that the key "HKLM\SYSTEM\CurrentControlSet\Services\Wallaces Key\" does exist and I'm still getting the Error Number of -2147024894 returned to me so I'm still trying to figure out why.
0
 
LVL 65

Assisted Solution

by:RobSampson
RobSampson earned 250 total points
ID: 34931104
Spaces do work.  I can read
sKeyPath = "HKLM\SYSTEM\CurrentControlSet\Services\.NET CLR Data\"

with no problem.

It must be a permissions thing.  Check permissions on that key to make sure the account you're running the script with has access to it.

Regards,

Rob.
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 34931108
If you're on Windows Vista or 7, try running the script as Administrator.  You can do this by making a batch file with
wscript "C:\Temp\RegReadTest.vbs"

and then right click the batch, and Run As Administrator.

Rob.
0
 
LVL 55

Expert Comment

by:Bill Prew
ID: 34931160
Agreed, spaces are not a problem.

~bp
0
 

Author Closing Comment

by:wally_davis
ID: 35096269
Problem was two-fold. I needed a trailing backslash added to my code and it was also a permissions issue on the specific Server I was testing against. Thanks Bill and Rob!
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this article we want to have a look at the directory attributes which are used by Microsoft to store the so called Security Identifiers (SID). These SIDs plays an important role in delegating and granting permissions and in authentication of trus…
Not long ago I saw a question in the VB Script forum that I thought would not take much time. You can read that question (Question ID  (http://www.experts-exchange.com/Programming/Languages/Visual_Basic/VB_Script/Q_28455246.html)28455246) Here (http…
This is a high-level webinar that covers the history of enterprise open source database use. It addresses both the advantages companies see in using open source database technologies, as well as the fears and reservations they might have. In this…
There's a multitude of different network monitoring solutions out there, and you're probably wondering what makes NetCrunch so special. It's completely agentless, but does let you create an agent, if you desire. It offers powerful scalability …

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question