What happened to the Messenger Plus! forums on msghelp.net?
Shoutbox » MsgHelp Archive » Messenger Plus! for Live Messenger » Scripting » Parse Registry SubKeys in JScript?

Pages: (2): « First [ 1 ] 2 » Last »
Parse Registry SubKeys in JScript?
Author: Message:
Jedimark
Full Member
***


Posts: 140
Reputation: 6
Joined: Apr 2002
O.P. Parse Registry SubKeys in JScript?
Does anyone know how to do the equivalent of this C# code in JScript?

Cheers,
- Mark

code:
try
{
        RegistryKey rootPath = Registry.CurrentUser.OpenSubKey("Software\\Item1\\Item2", true);
        foreach(string newKey in rootPath.GetSubKeyNames())
        {
                // other stuff here
        }
}
08-24-2006 05:23 PM
Profile PM Find Quote Report
J-Thread
Full Member
***

Avatar

Posts: 467
Reputation: 8
– / Male / –
Joined: Jul 2004
RE: Parse Registry SubKeys in JScript?
I think we had a thread about this a few weeks ago, but I can't find it anymore...

I think the solution was to use a win32 function for listing registry subkeys, because it seems like it cannot be done easily with the scripting engine.

Can somebody else find the thread / remember the solution?
08-24-2006 07:52 PM
Profile E-Mail PM Find Quote Report
Ezra
Veteran Member
*****

Avatar
Forgiveness is between them and God

Posts: 1960
Reputation: 31
37 / Male / Flag
Joined: Mar 2003
RE: Parse Registry SubKeys in JScript?
quote:
Originally posted by Jedimark
Does anyone know how to do the equivalent of this C# code in JScript?

Cheers,
- Mark

code:
try
{
        RegistryKey rootPath = Registry.CurrentUser.OpenSubKey("Software\\Item1\\Item2", true);
        foreach(string newKey in rootPath.GetSubKeyNames())
        {
                // other stuff here
        }
}



Why not make a nice dll that returns an array with keys?
[Image: 1-0.png]
             
08-24-2006 10:35 PM
Profile PM Web Find Quote Report
Shondoit
Full Member
***

Avatar
Hmm, Just Me...

Posts: 227
Reputation: 15
35 / Male / Flag
Joined: Jul 2006
RE: Parse Registry SubKeys in JScript?
No need for a DLL, it can be done without it

I have the code, but I'll have to look for it though
post them asap

-edit1- I found the code, but it is script specific, I will make it variable now
-edit2- Changed the code, gonna test it now...

-edit3- Here is the final code. The first function enumerates all available subkey names, the second function enumerates all key value names, could be used to look wich programs run on windows startup ("HKLM\Software\Microsoft\Windows\CurrentVersion\Run", if you'd want to know, user specific startup is located in HKCU instead of HKLM)

code:
function EnumSubKeys (RegKey) {
  var RootKey = new Object()
  RootKey["HKCR"] = RootKey["HKEY_CLASSES_ROOT"]   = 0x80000000;
  RootKey["HKCU"] = RootKey["HKEY_CURRENT_USER"]   = 0x80000001;
  RootKey["HKLM"] = RootKey["HKEY_LOCAL_MACHINE"]  = 0x80000002;
  RootKey["HKUS"] = RootKey["HKEY_USERS"]          = 0x80000003;
  RootKey["HKCC"] = RootKey["HKEY_CURRENT_CONFIG"] = 0x80000005;
  var RootVal = RootKey[RegKey.substr(0, RegKey.indexOf("\\"))]
  if (RootVal != undefined) {
    Locator = new ActiveXObject("WbemScripting.SWbemLocator");
    ServerConn = Locator.ConnectServer(null, "root\\default");
    Registry = ServerConn.Get("StdRegProv");
    Method = Registry.Methods_.Item("EnumKey");
    p_In = Method.InParameters.SpawnInstance_();
    p_In.hDefKey = RootVal;
    p_In.sSubKeyName = RegKey.substr(RegKey.indexOf("\\") + 1)
    p_Out = Registry.ExecMethod_(Method.Name, p_In);
    return p_Out.sNames.toArray();
  }
}

function EnumValues (RegKey) {
  var RootKey = new Object()
  RootKey["HKCR"] = RootKey["HKEY_CLASSES_ROOT"]   = 0x80000000;
  RootKey["HKCU"] = RootKey["HKEY_CURRENT_USER"]   = 0x80000001;
  RootKey["HKLM"] = RootKey["HKEY_LOCAL_MACHINE"]  = 0x80000002;
  RootKey["HKUS"] = RootKey["HKEY_USERS"]          = 0x80000003;
  RootKey["HKCC"] = RootKey["HKEY_CURRENT_CONFIG"] = 0x80000005;
  var RootVal = RootKey[RegKey.substr(0, RegKey.indexOf("\\"))]
  if (RootVal != undefined) {
    Locator = new ActiveXObject("WbemScripting.SWbemLocator");
    ServerConn = Locator.ConnectServer(null, "root\\default");
    Registry = ServerConn.Get("StdRegProv");
    Method = Registry.Methods_.Item("EnumValues");
    p_In = Method.InParameters.SpawnInstance_();
    p_In.hDefKey = RootVal;
    p_In.sSubKeyName = RegKey.substr(RegKey.indexOf("\\") + 1)
    p_Out = Registry.ExecMethod_(Method.Name, p_In);
    return p_Out.sNames.toArray();
  }
}

Then you can use it like this...
code:
var SubKeyArray = EnumSubKeys("HKEY_CURRENT_USER\\Software\\Item1\\Item2");
for (Index in SubKeyArray) {
   Debug.Trace(SubKeyArray[Index])
}

Or enumerate all programs running on startup...
code:
var Shell = new ActiveXObject("WScript.Shell")
var Key = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"
var ValuesArray = EnumValues(Key);
Debug.Trace("=== Global startup ===")
for (Index in ValuesArray) {
   var ValueName = ValuesArray[Index]
   ValueValue = Shell.RegRead(Key + "\\" + ValueName)
   Debug.Trace(ValueName + " = " + ValueValue)
}
var Key = "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"
var ValuesArray = EnumValues(Key);
Debug.Trace("=== User startup ===")
for (Index in ValuesArray) {
   var ValueName = ValuesArray[Index]
   ValueValue = Shell.RegRead(Key + "\\" + ValueName)
   Debug.Trace(ValueName + " = " + ValueValue)
}


This post was edited on 08-24-2006 at 11:43 PM by Shondoit.
My scripts:                            [Image: shondoit.gif]
+ Timezone
+ Camelo
+ Multisearch
08-24-2006 10:54 PM
Profile PM Find Quote Report
CookieRevised
Elite Member
*****

Avatar

Posts: 15519
Reputation: 173
– / Male / Flag
Joined: Jul 2003
Status: Away
RE: Parse Registry SubKeys in JScript?
new ActiveXObject("WbemScripting.SWbemLocator") ????
Locator.ConnectServer(null, "root\\default") ????
Registry.Methods_.Item("EnumValues") ????
etc...

I'm sorry but all this stuff is really not needed at all.

J-Thread is absolutely correct, 'simply' use the available Windows registry API's to do the job. They are all you need (although the method you showed has some "je-ne-sais-qua" too; still I really don't like the detour which activex takes (afterall, it uses those very same apis)).

Speaking of which, I have seen many registry accessing codes, and they are almost always exactly the same (with the same 'mistakes' or limitations), although they 'work', I haven't seen many totally fool proof and correct 100% codes (eg: first checking the length a registry key is, instead of assuming the key wnt be longer than x bytes, before retrieving it)

IIRC, Matty already posted an almost complete (but with some limitations) registry accessing script on the forums...
EDIT: I was wrong(partially) what Matty used was an external DLL => ActiveX Registry Access for Scripts

This post was edited on 08-25-2006 at 12:09 AM by CookieRevised.
.-= A 'frrrrrrrituurrr' for Wacky =-.
08-25-2006 12:00 AM
Profile PM Find Quote Report
Shondoit
Full Member
***

Avatar
Hmm, Just Me...

Posts: 227
Reputation: 15
35 / Male / Flag
Joined: Jul 2006
RE: Parse Registry SubKeys in JScript?
What do you mean "not needed at all", it does the job doesn't it?
He got his answer. It doesn't have to be from the API...

Personally, I always forget to 'Free' the Dll's I used, and a lot of scripts I looked at forget it too...
This way is a much cleaner way, because you don't have to use anything external, so it saves from using DataBloc structures (Interop.Allocate)

And by the way, these methods use an official Registry control object (StdRegProv)
My scripts:                            [Image: shondoit.gif]
+ Timezone
+ Camelo
+ Multisearch
08-25-2006 12:09 AM
Profile PM Find Quote Report
CookieRevised
Elite Member
*****

Avatar

Posts: 15519
Reputation: 173
– / Male / Flag
Joined: Jul 2003
Status: Away
RE: RE: Parse Registry SubKeys in JScript?
quote:
Originally posted by Shondoit
What do you mean "not needed at all", it does the job doesn't it?
With a detour, yes...
quote:
Originally posted by Shondoit
He got his answer. It doesn't have to be from the API...
You'll learn more from using APIs (if APIs can be used) than anything else. APIs are the stuff under the hood and do not have the limitations which activex objects like that have.
quote:
Originally posted by Shondoit
Personally, I always forget to 'Free' the Dll's I used, and a lot of scripts I looked at forget it too...
You don't need to free system DLLs (as a matter of fact, freeing them will actually not free them at all) (and as another matter of fact, you probably use more memory when you use that activex than when you use the APIs; moreover in Plus! scripting, once you loaded an activex object it stays loaded; eg: try to delete an activex dll after you've loaded it in your script, you wont be able to do it)
quote:
Originally posted by Shondoit
This way is a much cleaner way, because you don't have to use anything external, so it saves from using DataBloc structures (Interop.Allocate)
I don't find that cleaner at all, matter of opinion probably...
quote:
Originally posted by Shondoit
And by the way, these methods use an official Registry control object (StdRegProv)
Which has probably some restrictions too (like every activex) and which on its term uses the APIs anyways. So why use a detour when you can use the stuff you need directly, without any restrictions...

-------------

EDIT
quote:
Originally posted by Shondoit
(btw: I don't have access to the thread you showed... or something like that)
thread reported to be moved from private beta forum to public scripting forum... my bad, sorry

This post was edited on 08-25-2006 at 12:20 AM by CookieRevised.
.-= A 'frrrrrrrituurrr' for Wacky =-.
08-25-2006 12:14 AM
Profile PM Find Quote Report
Shondoit
Full Member
***

Avatar
Hmm, Just Me...

Posts: 227
Reputation: 15
35 / Male / Flag
Joined: Jul 2006
RE: Parse Registry SubKeys in JScript?
Matter of opinion indeed...

I still think, using a class specificaly designed for Reg access is much easier, Most people don't create Windows with API calls either

(btw: I don't have access to the thread you showed... or something like that)
My scripts:                            [Image: shondoit.gif]
+ Timezone
+ Camelo
+ Multisearch
08-25-2006 12:17 AM
Profile PM Find Quote Report
matty
Scripting Guru
*****


Posts: 8336
Reputation: 109
39 / Male / Flag
Joined: Dec 2002
Status: Away
RE: Parse Registry SubKeys in JScript?
quote:
Originally posted by CookieRevised
IIRC, Matty already posted an almost complete (but with some limitations) registry accessing script on the forums...
EDIT: I was wrong(partially) what Matty used was an external DLL => ActiveX Registry Access for Scripts

I should slap you soooooooooo hard did you forget this module?

Next thing to add is the SetBinaryValue
GetBinaryValue doesn't work unless the value going to be returned is a string (need to figure this out).
Combine all GetValues and SetValues into one.

Then anything else that could be thought of really.

.zip File Attachment: registry.zip (2.03 KB)
This file has been downloaded 424 time(s).
08-25-2006 01:52 AM
Profile E-Mail PM Find Quote Report
-dt-
Scripting Contest Winner
*****

Avatar
;o

Posts: 1819
Reputation: 74
35 / Male / Flag
Joined: Mar 2004
RE: Parse Registry SubKeys in JScript?
I havent yet looked at yours matty (I am now) but i made a registry class not that long ago to do this for someone on irc

http://svn.thedt.net/cgi/viewcvs.cgi/scripts/code...ass.js?view=markup
[Image: dt2.0v2.png]      Happy Birthday, WDZ
08-25-2006 04:15 AM
Profile PM Web Find Quote Report
Pages: (2): « First [ 1 ] 2 » Last »
« Next Oldest Return to Top Next Newest »


Threaded Mode | Linear Mode
View a Printable Version
Send this Thread to a Friend
Subscribe | Add to Favorites
Rate This Thread:

Forum Jump:

Forum Rules:
You cannot post new threads
You cannot post replies
You cannot post attachments
You can edit your posts
HTML is Off
myCode is On
Smilies are On
[img] Code is On