Friday, October 06, 2006

Reading, Writing, Deleting and Renaming Registry Keys in VBScript

Manipulating the registry is one of the most common tasks a Windows system administrator runs into. It can often become a time consuming task. When you have to change a registry setting on hundreds or even thousands of computers, manipulating a particular key or setting can be next to impossible if you had to do it all manually.

So here are a series of subs and functions to help you manipulate the registry from VBScript. It uses "regedit.exe" and it's "/s" switch to read and write text files formatted as ".reg" files from and to the registry silently. So, obviously, you'll need to have the regedit.exe in the path system variable (or in the same directory as this script).

One drawback you may encounter about the "RegRead" function is that it pulls registry key recursively throughout the whole key. So if you specify a root key, or a key farther up in the folder structure you could pull back massive amounts of data that you hadn't intentionally meant to capture. So when you pass the registry key, be as specific as possible when you're deciding on which key to read with this function.

Another thing to note is that I haven't tested this on anything but Windows 2000, Windows 2003 and Windows XP. So your mileage on these subs and functions may vary. Feel free to post questions or comments:
Function RegRead(Key)
  'This script is provided under the Creative Commons license located
  'at http://creativecommons.org/licenses/by-nc/2.5/ . It may not
  'be used for commercial purposes with out the expressed written consent
  'of NateRice.com


  Const OpenAsDefault = -2
  Const ForReading = 1
  Const FailIfNotExist = 0
 
  Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")
  Set oShell = CreateObject("WScript.Shell")
  sTempFile = oFSO.GetTempName
  oShell.Run "regedit /s /e """ & sTempFile & """ """ & Key & """",0,True
 
  If oFSO.FileExists(sTempFile) And oFSO.GetFile(sTempFile).Size > 0 Then
    Set oReadFile = oFSO.OpenTextFile(sTempFile, ForReading, False, OpenAsDefault)
    RegRead = oReadFile.ReadAll
    oReadFile.Close
    oFSO.DeleteFile sTempFile
  End If

End Function

Sub RegWrite(RegFile)
  'This script is provided under the Creative Commons license located
  'at http://creativecommons.org/licenses/by-nc/2.5/ . It may not
  'be used for commercial purposes with out the expressed written consent
  'of NateRice.com


  Const ForWriting = 2
  Set oFSO = CreateObject("Scripting.FileSystemObject")
  Set oShell = CreateObject("WScript.Shell")
  sTempFile = oFSO.GetAbsolutePathName(oFSO.GetTempName)
  oFSO.CreateTextFile(sTempFile)
  Set fTempFile = oFSO.GetFile(sTempFile)
  Set oTempFile = fTempFile.OpenAsTextStream(ForWriting, True)
  oTempFile.Write(RegFile)
  oTempFile.Close
  oShell.Run "regedit /s """ & sTempFile & """", 0, True
  oFSO.DeleteFile sTempFile, True
End Sub

Sub DeleteKey(Key)
  'This script is provided under the Creative Commons license located
  'at http://creativecommons.org/licenses/by-nc/2.5/ . It may not
  'be used for commercial purposes with out the expressed written consent
  'of NateRice.com


  Const ForWriting = 2
  Set oFSO = CreateObject("Scripting.FileSystemObject")
  Set oShell = CreateObject("WScript.Shell")
 
  sHeader = "Windows Registry Editor Version 5.00" & vbCrLf & vbCrLf
  sData = sHeader & "[-" & Key & "]" & vbCrLf
 
  WScript.Echo sData
  sTempFile = oFSO.GetAbsolutePathName(oFSO.GetTempName)
  oFSO.CreateTextFile(sTempFile)
 
  Set fTempFile = oFSO.GetFile(sTempFile)
  Set oTempFile = fTempFile.OpenAsTextStream(ForWriting, True)
  oTempFile.Write(sData)
  oTempFile.Close
  WScript.Echo "regedit /s """ & sTempFile & """"
  oShell.Run "regedit /s """ & sTempFile & """", 0, True
  oFSO.DeleteFile sTempFile, True
End Sub

Sub RenameKey(OldKeyName, NewKeyName)
  'This script is provided under the Creative Commons license located
  'at http://creativecommons.org/licenses/by-nc/2.5/ . It may not
  'be used for commercial purposes with out the expressed written consent
  'of NateRice.com


  RegWrite Replace(RegRead(OldKeyName), OldKeyName, NewKeyName)
  DeleteKey OldKeyName
End Sub
Send this to:                          

Comments

Kai said...

question,
how do you read a string then insert to another string in registry?
thanks

4/13/2007 11:11:30 PM

said...

What about key permissions in case when inheritance disabled?

3/3/2000 10:40:15 PM

Name
URL
Email
Email address is not published
Remember Me
Comments

CAPTCHA
Write the characters in the image above