Finding entries in Windows Registry matching a RE

R

Richard

Hi,

I'd like to be able to search a named hive for keys whose names match
a given regular expression.

I found, for example:

require 'win32/registry'
Win32::Registry::HKEY_CURRENT_USER.open('SOFTWARE\\AdwareAlert\
\AdwareAlert\\RegInfo') do |reg|
puts reg['OrderNo']
end

which let me specify a specific key in the HKCU hive and print the
value of one of its entries.

I don't actually know why the foregoing is even syntactically correct
because http://www.ruby-doc.org/stdlib/libdoc/Win32API/rdoc/classes/Win32/Registry/Constants.html
says HKEY_CURRENT_USER is a constant in Win32::Registry. Therefore,
it seems to me that HKEY_CURRENT_USER can't have a method "open".

Any ideas?
TIA,
Richard
 
R

Robert Klemme

Hi,

I'd like to be able to search a named hive for keys whose names match
a given regular expression.

I found, for example:

require 'win32/registry'
Win32::Registry::HKEY_CURRENT_USER.open('SOFTWARE\\AdwareAlert\
\AdwareAlert\\RegInfo') do |reg|
puts reg['OrderNo']
end

which let me specify a specific key in the HKCU hive and print the
value of one of its entries.

I don't actually know why the foregoing is even syntactically correct
because http://www.ruby-doc.org/stdlib/libdoc/Win32API/rdoc/classes/Win32/Registry/Constants.html
says HKEY_CURRENT_USER is a constant in Win32::Registry.

Why do you think this should disallow the syntax above? It's perfectly
valid Ruby code. And that does not have to do anything with the fact
that HKEY_CURRENT_USER is a constant.
Therefore,
it seems to me that HKEY_CURRENT_USER can't have a method "open".

The documentation is probably a bit misleading:

11:06:11 [~]: ruby -r win32/registry -e
'k=Win32::Registry::HKEY_CURRENT_USER; p k, k.class,
k.instance_variables.map {|v| "#{v}=#{k.instan
ce_variable_get v}"}'
#<Win32::Registry key="HKEY_CURRENT_USER">
Win32::Registry
["@keyname=HKEY_CURRENT_USER", "@parent=", "@hkey=2147483649",
"@disposition=2"]

Does that fix your irritation? :)

Btw, if you do this you'll see some methods that might actually do what
you need (find for example).

ruby -r win32/registry -e 'puts Win32::Registry.instance_methods.sort'

Kind regards

robert
 
R

Richard

Hi Robert,

Thanks for your response. I'm studying the issue and will respond
with either "Eureka" or a (hopefully) more sophisticated or nuanced
question.

Best wishes,
Richard

I'd like to be able to search a named hive for keys whose names match
a given regular expression.
I found, for example:
require 'win32/registry'
Win32::Registry::HKEY_CURRENT_USER.open('SOFTWARE\\AdwareAlert\
\AdwareAlert\\RegInfo') do |reg|
puts reg['OrderNo']
end
which let me specify a specific key in the HKCU hive and print the
value of one of its entries.
I don't actually know why the foregoing is even syntactically correct
becausehttp://www.ruby-doc.org/stdlib/libdoc/Win32API/rdoc/classes/Win32/Reg...
says HKEY_CURRENT_USER is a constant in Win32::Registry.

Why do you think this should disallow the syntax above? It's perfectly
valid Ruby code. And that does not have to do anything with the fact
that HKEY_CURRENT_USER is a constant.
Therefore,
it seems to me that HKEY_CURRENT_USER can't have a method "open".

The documentation is probably a bit misleading:

11:06:11 [~]: ruby -r win32/registry -e
'k=Win32::Registry::HKEY_CURRENT_USER; p k, k.class,
k.instance_variables.map {|v| "#{v}=#{k.instan
ce_variable_get v}"}'
#<Win32::Registry key="HKEY_CURRENT_USER">
Win32::Registry
["@keyname=HKEY_CURRENT_USER", "@parent=", "@hkey=2147483649",
"@disposition=2"]

Does that fix your irritation? :)

Btw, if you do this you'll see some methods that might actually do what
you need (find for example).

ruby -r win32/registry -e 'puts Win32::Registry.instance_methods.sort'

Kind regards

robert
 
M

Michal Suchanek

Hi Robert,

Thanks for your response. I'm studying the issue and will respond
with either "Eureka" or a (hopefully) more sophisticated or nuanced
question.
Hello,

I believe that 'key' in registry is that thing that would correspond
to directory, and things that actually contain something (like file)
are called 'value'. There should be functions to list subkeys and
values of a given key (at least once you open it). Unfortunately,
ruby-doc.org fails to index the win32 stuff properly so your best
source of information is the ri/extension sources shipped with your
Windows build of ruby.
Trying something like (Win32::Registry::HKEY_CURRENT_USER.methods -
methods).sort or (Win32::Registry::HKEY_CURRENT_USER.methods.open("")
- methods).sort in irb may give you some idea.

Thanks

Michal
 
R

Richard

Hi Robert and Michal,

Thanks for your responses.

1. I was hung up the the fact that HKEY_CURRENT_USER appears to be a
constant to me. Heretofore, I never heard of a constant having
methods.

# CODE START
require 'win32/registry'
require 'show'
show %@Win32::Registry::HKEY_CURRENT_USER.class@
# CODE END

# OUTPUT START
Win32::Registry::HKEY_CURRENT_USER.class
=> Win32::Registry
# OUTPUT END

So I now see that this HKEY_CURRENT_USER is an instance of the
Win32::Registry class. OK, this is step 1 of my education.

I've visited the http://www.ruby-doc.org/ for the Win32:Registry
module
as well as the Microsoft site for the Registry API. These two things,
plus the fact that I handled the Registry programatically with VC++/
MFC a decade earlier, means I should be fine now.

I am curious about one thing: I haven't been able to see how the above
construct really works, i.e. where's the code for it? Maybe I didn't
read the RDoc carefully enough. From Robert's inspection statement,
it looks like the expression returns an instance of of Win32::Registry
with an instance variable @key set to HKEY_CURRENT_USER.

Again, thanks for your responses. I did look at the totality of
instance methods, though the Ruby-doc stuff is really what I needed to
look at.

Best wishes,
Richard

P.S. The Microsoft site is http://msdn2.microsoft.com/en-us/library/ms724875.aspx.

I'd like to be able to search a named hive for keys whose names match
a given regular expression.
I found, for example:
require 'win32/registry'
Win32::Registry::HKEY_CURRENT_USER.open('SOFTWARE\\AdwareAlert\
\AdwareAlert\\RegInfo') do |reg|
puts reg['OrderNo']
end
which let me specify a specific key in the HKCU hive and print the
value of one of its entries.
I don't actually know why the foregoing is even syntactically correct
becausehttp://www.ruby-doc.org/stdlib/libdoc/Win32API/rdoc/classes/Win32/Reg...
says HKEY_CURRENT_USER is a constant in Win32::Registry.

Why do you think this should disallow the syntax above? It's perfectly
valid Ruby code. And that does not have to do anything with the fact
that HKEY_CURRENT_USER is a constant.
Therefore,
it seems to me that HKEY_CURRENT_USER can't have a method "open".

The documentation is probably a bit misleading:

11:06:11 [~]: ruby -r win32/registry -e
'k=Win32::Registry::HKEY_CURRENT_USER; p k, k.class,
k.instance_variables.map {|v| "#{v}=#{k.instan
ce_variable_get v}"}'
#<Win32::Registry key="HKEY_CURRENT_USER">
Win32::Registry
["@keyname=HKEY_CURRENT_USER", "@parent=", "@hkey=2147483649",
"@disposition=2"]

Does that fix your irritation? :)

Btw, if you do this you'll see some methods that might actually do what
you need (find for example).

ruby -r win32/registry -e 'puts Win32::Registry.instance_methods.sort'

Kind regards

robert
 
S

SonOfLilit

In Ruby, "constant" means that it's value should not change (that's
actually just a syntactical convention - you'll only get a value if
you try A=8; A=9). It also means that it will be stored in a different
table (or at least treated like it was, with different methods to
access it etc' - I'm not familiar enough with the MRI to comment).

Constants are still Ruby variables, which means that they can store a
reference to any Ruby object.

E.g.:

ERROR_STREAM = File.open("log.txt")

If you're interested in great uses of constants (and class methods
that behave like it was just a constant) try learning how to use
_why's ingenious Camping. It is full of amazing uses for those. It's
an afternoon to learn, especially if you're familiar with Rails.


Aur
 
R

Richard

Constants are still Ruby variables, which means that they can store a
reference to any Ruby object.

Of course! You've eased my brain-cramp :) Thanks.
try learning how to use
_why's ingenious Camping

I peeked at "Camping, a Microframework". Lot's of interesting stuff.
I put it on my TODO list. Thanks.

Best wishes
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,968
Messages
2,570,154
Members
46,702
Latest member
LukasConde

Latest Threads

Top