vbscript to recursive delete hkey users reg key and subkeys
Hi All I'm trying to delete a reg key for all user profiles in HKEY_USERS reg hive the script works unless the key has subkeys can anyone please advise a script which will recursively delete the reg keys and subkeys thanks
Below is the script I use at the moment
Option Explicit Const HKU = &H80000003 Dim wmi, reg Dim prof, profs Dim key Set wmi = GetObject("winmgmts:\\.\root\cimv2") Set reg = GetObject("winmgmts:\\.\root\default:StdRegProv") Set profs = wmi.ExecQuery("Select SID from Win32_UserProfile where SID like 'S-1-5-21%'") For Each prof In profs key = prof.SID & "\Software\test" WScript.Echo key Call reg.DeleteKey(HKU, key) 'commented out for safety Next
0 Comments
[ + ] Show comments
Answers (2)
Please log in to answer
Posted by:
anonymous_9363
9 years ago
Here's a registry class for VBS. It has a DeleteKey function which will do that job for you.
'// A registry class to abstract the WMI registry provider
'// Option Explicit
'//
'// Dim strMsg
'// Dim blnResult
'// Dim blnFailed
'// Dim objRegistry
'// Dim objRecord
'// Dim objDictionary
'//
'// Set objRegistry = New clsRegistry
'//
'// blnResult = objRegistry.Connect(".")
'// If blnResult Then
'// With objRegistry
'//
'// '// Create key
'// blnResult = .CreateKey("HKCU", "Control Panel\Accessibility\Dummy Key")
'// If blnResult Then
'// WScript.Echo "Created key."
'// Else
'// WScript.Echo "Failed to create key."
'// End If
'//
'// '// Delete key
'// '// True Delete sub-keys
'// '// False Do not delete sub-keys
'// blnResult = .DeleteKey("HKCU", "Control Panel\Accessibility\Dummy Key", True)
'// If blnResult Then
'// WScript.Echo "Deleted key."
'// Else
'// WScript.Echo "Failed to delete key."
'// End If
'//
'// '// Write value
'// blnResult = .WriteValue("HKCU", "Control Panel\Accessibility", "Dummy Value", "REG_SZ", "Dummy data")
'// If blnResult Then
'// WScript.Echo "Created value."
'// Else
'// WScript.Echo "Failed to create value."
'// End If
'//
'// '// Check value exists
'// blnResult = .ExistValue("HKCU", "Control Panel\Accessibility", "Dummy Value")
'// If blnResult Then
'// WScript.Echo "Value exists."
'// Else
'// WScript.Echo "Value does not exist."
'// End If
'//
'// '// Read value
'// '// Typically, you would use ExistValue before calling ReadValue
'// blnResult = .ReadValue("HKCU", "Control Panel\Accessibility", "Dummy Value")
'// If blnResult Then
'// WScript.Echo "Value is " & .get_RegResult & ", and is of type " & .get_RegValueType
'// Else
'// WScript.Echo "Failed to read value."
'// End If
'//
'// '// Delete value
'// blnResult = .DeleteValue("HKCU", "Control Panel\Accessibility", "Dummy Value")
'// If blnResult Then
'// WScript.Echo "Deleted value."
'// Else
'// WScript.Echo "Failed to delete value."
'// End If
'//
'// '// Check key exists
'// blnResult = .ExistKey("HKCU", "Control Panel\Accessibility", "Keyboard Response")
'// If blnResult Then
'// WScript.Echo "Key exists."
'// Else
'// WScript.Echo "Key does not exist."
'// End If
'//
'// '// Enumerate key
'// blnResult = .EnumKey("HKCU", "Control Panel\Accessibility")
'// If blnResult Then
'// Set objDictionary = .get_EnumDict
'// strMsg = Empty
'// For Each objRecord In objDictionary
'// '// objDictionary(objRecord) is always null string for this method
'// WScript.Echo "Key name is " & objRecord
'// Next
'// Else
'// WScript.Echo "No sub-keys exist under that key."
'// End If
'//
'// '// Enumerate values
'// blnResult = .EnumValues("HKCU", "Control Panel\Accessibility\Keyboard Response")
'// If blnResult Then
'// Set objDictionary = .get_EnumDict
'// strMsg = Empty
'// For Each objRecord In objDictionary
'// WScript.Echo "Value is " & objRecord & ", and is of type " & objDictionary(objRecord)
'// Next
'// Else
'// WScript.Echo "No values exist under that key."
'// End If
'//
'// '// Enumerate values and data
'// blnResult = .EnumValuesAndData("HKCU", "Control Panel\Accessibility\Keyboard Response")
'// If blnResult Then
'// Set objDictionary = .get_EnumDict
'// strMsg = Empty
'// For Each objRecord In objDictionary
'// '// Ignore '_Stage Number' and '_Stage Description'
'// If Left(CStr(objRecord), 1) <> "_" Then
'// If objDictionary(objRecord) = 1024 Then
'// blnFailed = True
'// strMsg = strMsg & vbCRLF
'// strMsg = strMsg & String(2, vbTAB)
'// strMsg = strMsg & CStr(objRecord)
'// End If
'// End If
'// WScript.Echo "Value is " & objRecord & ", data is " & objDictionary(objRecord)
'// Next
'// Else
'// WScript.Echo "No value/data pairs exist under that key."
'// End If
'// End With
'// End If
Option Explicit
Class clsRegistry
'// This class makes it simple to manipulate the registry on the local or a remote computer.
'// Internally it uses the WMI StdRegProv class methods.
'//
'// It provides a simpler set of methods than the StdRegProv methods:
'//
'// * Rather than numeric values, this object's methods use string input: For example, "HKLM" instead of 0x80000002.
'//
'// * Rather than separate Get...Value() methods for each data type, it provides a single ReadValue() method.
'// The get_RegResult property will contain the registry value's data, and the get_RegValueType property
'// will contain the registry value's data type as a string (e.g. "REG_SZ").
'//
'// * Rather than separate Set...Value() methods for each data type, it provides a single WriteValue() method
'// that lets you specify the data type as a string parameter.
'//
'// * The DeleteKey() method provides a DeleteSubKeys parameter. If True, then it will attempt to delete all subkeys
'// of the specified subkey.
'//
'// * The ExistKey() and ExistValue() methods return True if the specified key or value exists in a specified subkey,
'// or False otherwise.
'//
'// This class also implements the EnumValues(), EnumValuesAndData(), and EnumKey() methods:
'//
'// * The array outputs of these methods are accessible from the EnumResult property, which returns a reference to a
'// Scripting.Dictionary object.
'//
'// * After calling the EnumValues() method, the EnumResult dictionary will contain the value names and types.
'// The types will be stored as strings (e.g. "REG_SZ").
'//
'// * After calling the EnumValuesAndData() method, the EnumDict dictionary will contain the value names and contents
'// of each value. If a value contains a REG_BINARY, the contents will be a string containing a series of the hex bytes
'// in the data (like the registry editor). If a value contains a REG_MULTI_SZ, the multiple strings will be separated
'// by a "|" character. This method exists mainly as a quick way for a program to output all of the values in a registry subkey.
'//
'// * After calling the EnumKey() method, the EnumResult dictionary will contain the names of the subkeys.
'// The "value" parts of the dictionary will be empty strings.
'//
'// * For JScript, the dictToJSArray() method converts a dictionary to a JScript array.
Dim REG_SZ
Dim REG_EXPAND_SZ
Dim REG_BINARY
Dim REG_DWORD
Dim REG_QWORD
Dim REG_MULTI_SZ
Dim REG_RESOURCE_LIST
Dim REG_FULL_RESOURCE_DESCRIPTOR
Dim REG_RESOURCE_REQUIREMENTS_LIST
Dim ERR_INVALID_DATA
Dim SEPARATOR
Dim g_RegTypes
Dim g_EnumDict
Dim g_RegProv
Dim g_RegResult
Dim g_RegValueType
Private Sub Class_Initialize()
REG_SZ = 1
REG_EXPAND_SZ = 2
REG_BINARY = 3
REG_DWORD = 4
REG_MULTI_SZ = 7
REG_RESOURCE_LIST = 8
REG_FULL_RESOURCE_DESCRIPTOR = 9
REG_RESOURCE_REQUIREMENTS_LIST = 10
REG_QWORD = 11
ERR_INVALID_DATA = 13
SEPARATOR = "|"
' Contains constants and some numbers for quick lookup.
Set g_RegTypes = CreateObject("Scripting.Dictionary")
' Dictionary object for EnumKey() and EnumValues().
Set g_EnumDict = CreateObject("Scripting.Dictionary")
' Case-insensitive key comparisons.
g_RegTypes.CompareMode = vbTextCompare
g_EnumDict.CompareMode = vbTextCompare
' Populate the dictionary with needed data.
With g_RegTypes
.Add "HKCR", &H80000000
.Add "HKEY_CLASSES_ROOT", &H80000000
.Add "HKCU", &H80000001
.Add "HKEY_CURRENT_USER", &H80000001
.Add "HKLM", &H80000002
.Add "HKEY_LOCAL_MACHINE", &H80000002
.Add "HKEY_USERS", &H80000003
.Add "HKEY_CURRENT_CONFIG", &H80000005
.Add "REG_SZ", REG_SZ
.Add REG_SZ, "REG_SZ"
.Add "REG_EXPAND_SZ", REG_EXPAND_SZ
.Add REG_EXPAND_SZ, "REG_EXPAND_SZ"
.Add "REG_BINARY", REG_BINARY
.Add REG_BINARY, "REG_BINARY"
.Add "REG_DWORD", REG_DWORD
.Add REG_DWORD, "REG_DWORD"
.Add "REG_MULTI_SZ", REG_MULTI_SZ
.Add REG_MULTI_SZ, "REG_MULTI_SZ"
.Add "REG_QWORD", REG_QWORD
.Add REG_QWORD, "REG_QWORD"
.Add "REG_RESOURCE_LIST", REG_RESOURCE_LIST
.Add REG_RESOURCE_LIST, "REG_RESOURCE_LIST"
.Add "REG_FULL_RESOURCE_DESCRIPTOR", REG_FULL_RESOURCE_DESCRIPTOR
.Add REG_FULL_RESOURCE_DESCRIPTOR, "REG_FULL_RESOURCE_DESCRIPTOR"
.Add "REG_RESOURCE_REQUIREMENTS_LIST", REG_RESOURCE_REQUIREMENTS_LIST
.Add REG_RESOURCE_REQUIREMENTS_LIST, "REG_RESOURCE_REQUIREMENTS_LIST"
End With
' No valid data yet
g_RegResult = Null
g_RegValueType = Null
End Sub
Private Sub Class_Terminate()
Set g_EnumDict = Nothing
Set g_RegTypes = Nothing
End Sub
' PROPERTY get_RegResult()
' Returns the result data from a registry operation.
Function get_RegResult()
get_RegResult = g_RegResult
End Function
' PROPERTY get_RegValueType()
' Returns the result data's data type.
Function get_RegValueType()
get_RegValueType = g_RegValueType
End Function
' PROPERTY get_EnumDict()
' Returns a reference to the dictionary populated by the Enum...() methods.
Function get_EnumDict()
Set get_EnumDict = g_EnumDict
End Function
' METHOD Connect()
' Connects to the specified computer using WMI; returns True for success,
' or the WMI error code if it fails. If the computer is already connected,
' it will not attempt to connect again and will return True.
Function Connect(ByVal ComputerName)
Dim Result
Connect = False
ComputerName = UCase(Trim(ComputerName))
If Left(ComputerName, 2) = "\\" Then
ComputerName = Mid(ComputerName, 3)
End If
On Error Resume Next
Set g_RegProv = GetObject("winmgmts:{impersonationlevel=impersonate}!//" & ComputerName & "/root/default:StdRegProv")
Result = Err.Number
On Error GoTo 0
If Err.Number <> 0 Then
Exit Function
End If
Connect = True
End Function
' If Condition is True, return TrueValue; otherwise, return FalseValue.
Function IIf(ByVal Condition, ByVal TrueValue, ByVal FalseValue)
If Condition Then
IIf = TrueValue
Else
IIf = FalseValue
End If
End Function
' METHOD CheckAccess()
' Returns True for success, False for failure.
' HiveName is a string representing the registry hive (e.g. "HKLM").
' Required is a numeric value representing the desired access level.
' KEY_QUERY_VALUE 1 0x1 Required to query the values of a registry key.
' KEY_SET_VALUE 2 0x2 Required to create, delete, or set a registry value.
' KEY_CREATE_SUB_KEY 4 0x4 Required to create a subkey of a registry key.
' KEY_ENUMERATE_SUB_KEYS 8 0x8 Required to enumerate the subkeys of a registry key.
' KEY_NOTIFY 16 0x10 Required to request change notifications for a registry key or for subkeys of a registry key.
' KEY_CREATE 32 0x20 Required to create a registry key.
' DELETE 65536 0x10000 Required to delete a registry key.
' READ_CONTROL 131072 0x20000 Combines the STANDARD_RIGHTS_READ, KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, and KEY_NOTIFY values.
' WRITE_DAC 262144 0x40000 Required to modify the DACL in the object's security descriptor.
' WRITE_OWNER 524288 0x80000 Required to change the owner in the object's security descriptor.
'
' If the WMI CheckAccess method succeeded, update g_RegResult.
Function CheckAccess(ByVal HiveName, ByVal SubKeyName, ByVal Required)
Dim Result
Dim blnGranted
CheckAccess = False
Result = g_RegProv.CheckAccess(g_RegTypes(HiveName), SubKeyName, Required, blnGranted)
g_RegResult = IIf(Result = 0, blnGranted, Null)
g_RegValueType = Null
If Result <> 0 Then
Exit Function
End If
CheckAccess = True
End Function
' METHOD CreateKey()
' Returns True for success, False for failure.
' HiveName is a string representing the registry hive (e.g. "HKLM").
Function CreateKey(ByVal HiveName, ByVal SubKeyName)
Dim Result
CreateKey = False
Result = g_RegProv.CreateKey(g_RegTypes(HiveName), SubKeyName)
If Result <> 0 Then
Exit Function
End If
CreateKey = True
End Function
' METHOD DeleteKey()
' Returns True for success, False for failure.
' HiveName is a string representing the registry hive (e.g. "HKLM").
' If DeleteSubKeys is True, then the method will attempt to delete all
' subkeys of the specified subkey before deleting the specified subkey.
' If DeleteSubKeys is True and the method encounters an error deleting
' a subkey under the specified subkey, it will abort.
Function DeleteKey(ByVal HiveName, ByVal SubKeyName, ByVal DeleteSubKeys)
Dim Result
Dim strRegSubKey
Dim strRegKey
Dim Names
Dim I
DeleteKey = False
'// If the key isn't present, then DeleteKey will be True!
'// In order to use ExistKey, we have to split SubKeyName
'// at the final '\'. This is imposed on us by the way
'// that the WMI registry object works.
'// If there's no backslash in SubKeyName, we have to fail
I = InStrRev(SubKeyName, "\")
If I = 0 Then
Exit Function
End If
strRegSubKey = Left(SubKeyName, I - 1)
strRegKey = Right(SubKeyName, Len(SubKeyName) - I)
If Not ExistKey(HiveName, strRegSubKey, strRegKey) Then
DeleteKey = True
Exit Function
End If
If DeleteSubKeys Then
Result = g_RegProv.EnumKey(g_RegTypes(HiveName), SubKeyName, Names)
If (Result = 0) And (Not IsNull(Names)) Then
For I = 0 To UBound(Names)
DeleteKey = DeleteKey(HiveName, _
SubKeyName & "\" & Names(I), DeleteSubKeys)
If DeleteKey <> 0 Then
Exit Function
End if
Next
End If
End If
Result = g_RegProv.DeleteKey(g_RegTypes(HiveName), SubKeyName)
If Result <> 0 Then
Exit Function
End If
DeleteKey = True
End Function
' METHOD WriteValue()
' Returns True for success, False for failure.
' HiveName is a string representing the registry hive (e.g. "HKLM").
' ValueType is a string representing the value's type (e.g. "REG_SZ").
' If you specify "REG_BINARY" or "REG_MULTI_SZ" for the value type,
' RegData must contain a safearray (VB array) of data. If you are using
' JScript, you can use the toVBarray() method to convert the JScript
' array to a safearray, but keep in mind that it must be a zero-based
' array with contiguous elements.
Function WriteValue(ByVal HiveName, ByVal SubKeyName, ByVal ValueName, ByVal ValueType, ByRef RegData)
Dim Result
WriteValue = False
If ValueName = "" Then
Result = g_RegProv.SetStringValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
Else
Select Case UCase(ValueType)
Case "REG_SZ"
Result = g_RegProv.SetStringValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
Case "REG_EXPAND_SZ"
Result = g_RegProv.SetExpandedStringValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
Case "REG_BINARY"
Result = g_RegProv.SetBinaryValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
Case "REG_DWORD"
Result = g_RegProv.SetDWORDValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
Case "REG_MULTI_SZ"
Result = g_RegProv.SetMultiStringValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
Case "REG_QWORD"
Result = g_RegProv.SetqWORDValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
Case Else
Result = ERR_INVALID_DATA
End Select
End If
If Result <> 0 Then
Exit Function
End If
WriteValue = True
End Function
' METHOD ExistValue()
' Returns True if the specified value exists, or False if not.
Function ExistValue(ByVal HiveName, ByVal SubKeyName, ByVal ValueName)
Dim Exists
Dim Result
Dim Names
Dim Types
Dim I
Exists = False
Result = g_RegProv.EnumValues(g_RegTypes(HiveName), SubKeyName, Names, Types)
If (Result = 0) And (Not IsNull(Names)) Then
For I = 0 To UBound(Names)
Exists = UCase(Names(I)) = UCase(ValueName)
If Exists Then
Exit For
End If
Next
End If
ExistValue = Exists
End Function
' METHOD ReadValue()
' Returns True for success, False for failure.
' HiveName is a string representing the registry hive (e.g. "HKLM").
' If the WMI method succeeds, the Result property will contain the
' registry data and the ValueType property will contain a string
' representing the data type (e.g. "REG_SZ").
Function ReadValue(ByVal HiveName, ByVal SubKeyName, ByVal ValueName)
Dim Result
Dim Names
Dim Types
Dim I
Dim RegData
ReadValue = False
' If ValueName is blank, retrieve the key's (Default) value (REG_SZ)
If ValueName = "" Then
Result = g_RegProv.GetStringValue(g_RegTypes(HiveName), SubKeyName, ValueName, RegData)
If Result = 0 Then
g_RegResult = RegData: g_RegValueType = "REG_SZ"
Else
g_RegResult = Null: g_RegValueType = Null
End If
Else
Result = g_RegProv.EnumValues(g_RegTypes(HiveName), SubKeyName, Names, Types)
If (Result = 0) And (Not IsNull(Names)) Then
For I = 0 To UBound(Names)
If UCase(Names(I)) = UCase(ValueName) Then
Select Case Types(I)
Case REG_SZ
Result = g_RegProv.GetStringValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
g_RegValueType = IIf(Result = 0, g_RegTypes(REG_SZ), Null)
Exit For
Case REG_EXPAND_SZ
Result = g_RegProv.GetExpandedStringValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
g_RegValueType = IIf(Result = 0, g_RegTypes(REG_EXPAND_SZ), Null)
Exit For
Case REG_BINARY
Result = g_RegProv.GetBinaryValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
g_RegValueType = IIf(Result = 0, g_RegTypes(REG_BINARY), Null)
Exit For
Case REG_DWORD
Result = g_RegProv.GetDWORDValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
g_RegValueType = IIf(Result = 0, g_RegTypes(REG_DWORD), Null)
Exit For
Case REG_QWORD
Result = g_RegProv.GetQWORDValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
g_RegValueType = IIf(Result = 0, g_RegTypes(REG_QWORD), Null)
Exit For
Case REG_MULTI_SZ
Result = g_RegProv.GetMultiStringValue(g_RegTypes(HiveName), _
SubKeyName, _
ValueName, _
RegData)
g_RegValueType = IIf(Result = 0, g_RegTypes(REG_MULTI_SZ), Null)
Exit For
Case Else
Result = ERR_INVALID_DATA
g_RegResult = Null
g_RegValueType = Null
Exit For
End Select
End If
Next
g_RegResult = IIf(Result = 0, RegData, Null)
End If
End If
If Result <> 0 Then
Exit Function
End If
ReadValue = True
End Function
' METHOD DeleteValue()
' Returns True for success, False for failure.
' HiveName is a string representing the registry hive (e.g. "HKLM").
Function DeleteValue(ByVal HiveName, ByVal SubKeyName, ByVal ValueName)
Dim Result
DeleteValue = False
'// If the value isn't present, then DeleteValue will be True!
If Not ExistValue(HiveName, SubKeyName, ValueName) Then
DeleteValue = True
Exit Function
End If
Result = g_RegProv.DeleteValue(g_RegTypes(HiveName), SubKeyName, ValueName)
If Result <> 0 Then
Exit Function
End If
DeleteValue = True
End Function
' METHOD ExistKey()
' Returns True if the specified subkey exists, or False if not.
Function ExistKey(ByVal HiveName, ByVal SubKeyName, ByVal KeyName)
Dim Exists
Dim Result
Dim Names
Dim I
Exists = False
Result = g_RegProv.EnumKey(g_RegTypes(HiveName), SubKeyName, Names)
If (Result = 0) And (Not IsNull(Names)) Then
For I = 0 To UBound(Names)
Exists = UCase(KeyName) = UCase(Names(I))
If Exists Then
Exit For
End If
Next
End If
ExistKey = Exists
End Function
' METHOD EnumKey()
' Returns True for success, False for failure.
' Populates the EnumDict dictionary's key names with the subkeys in the
' specified subkey. The dictionary's value names will be blank strings.
Function EnumKey(ByVal HiveName, ByVal SubKeyName)
Dim Result
Dim Names
Dim I
EnumKey = False
Result = g_RegProv.EnumKey(g_RegTypes(HiveName), SubKeyName, Names)
g_EnumDict.RemoveAll
If (Result = 0) And (Not IsNull(Names)) Then
For I = 0 To UBound(Names)
g_EnumDict.Add Names(I), ""
Next
End If
'If Result = 0 Then
If (Result = 0) And (Not IsNull(Names)) Then
EnumKey = True
End If
End Function
' METHOD EnumValues()
' Returns True for success, False for failure.
' Populates the EnumDict property's key/value pairs with
' the value entries and their corresponding data types.
Function EnumValues(ByVal HiveName, ByVal SubKeyName)
Dim Result
Dim Names
Dim Types
Dim I
EnumValues = False
Result = g_RegProv.EnumValues(g_RegTypes(HiveName), SubKeyName, Names, Types)
g_EnumDict.RemoveAll
If (Result = 0) And (Not IsNull(Names)) Then
For I = 0 To UBound(Names)
g_EnumDict.Add Names(I), g_RegTypes(Types(I))
Next
End If
'If Result = 0 Then
If (Result = 0) And (Not IsNull(Names)) Then
EnumValues = True
End If
End Function
' METHOD EnumValuesAndData()
' Returns True for success, False for failure.
' Populates the EnumDict property's key/value pairs with
' the value entries and their contents. For REG_BINARY and REG_MULTI_SZ
' values, they will be represented as strings with | separators.
Function EnumValuesAndData(ByVal HiveName, ByVal SubKeyName)
Dim Result
Dim Names
Dim Types
Dim I
Dim RegData
Dim J
Dim S
EnumValuesAndData = False
Result = g_RegProv.EnumValues(g_RegTypes(HiveName), SubKeyName, Names, Types)
g_EnumDict.RemoveAll
If (Result = 0) And (Not IsNull(Names)) Then
For I = 0 To UBound(Names)
Select Case Types(I)
Case REG_SZ
Result = g_RegProv.GetStringValue(g_RegTypes(HiveName), _
SubKeyName, _
Names(I), _
RegData)
If Result = 0 Then
g_EnumDict.Add Names(I), RegData
End If
Case REG_EXPAND_SZ
Result = g_RegProv.GetExpandedStringValue(g_RegTypes(HiveName), _
SubKeyName, _
Names(I), _
RegData)
If Result = 0 Then
g_EnumDict.Add Names(I), RegData
End If
Case REG_BINARY
Result = g_RegProv.GetBinaryValue(g_RegTypes(HiveName), _
SubKeyName, _
Names(I), _
RegData)
If Result = 0 Then
S = ""
For J = 0 To UBound(RegData)
S = IIf(S <> "", S & " " & ToHex(RegData(J)), ToHex(RegData(J)))
Next
g_EnumDict.Add Names(I), S
End If
Case REG_DWORD
Result = g_RegProv.GetDWORDValue(g_RegTypes(HiveName), _
SubKeyName, _
Names(I), _
RegData)
If Result = 0 Then
g_EnumDict.Add Names(I), RegData
End If
Case REG_DQWORD
Result = g_RegProv.GetQWORDValue(g_RegTypes(HiveName), _
SubKeyName, _
Names(I), _
RegData)
If Result = 0 Then
g_EnumDict.Add Names(I), RegData
End If
Case REG_MULTI_SZ
Result = g_RegProv.GetMultiStringValue(g_RegTypes(HiveName), _
SubKeyName, _
Names(I), _
RegData)
If Result = 0 Then
S = ""
For J = 0 To UBound(RegData)
S = IIf(S <> "", S & SEPARATOR & RegData(J), RegData(J))
Next
g_EnumDict.Add Names(I), S
End If
Case Else
Result = ERR_INVALID_DATA
End Select
Next
End If
'If Result = 0 Then
If (Result = 0) And (Not IsNull(Names)) Then
EnumValuesAndData = True
End If
End Function
' Returns the byte N in hexadecimal notation with a leading zero.
Function ToHex(ByVal N)
ToHex = IIf(N < &H10, "0" & Hex(N), Hex(N))
End Function
End Class
Posted by:
EdT
9 years ago
Can't you achieve the same result using a minus ?
REGEDIT4
[-HKEY_LOCAL_MACHINE\SOFTWARE\testkey]
This basically nukes testkey.
Comments:
-
Where's the fun in that?!?! :-) - anonymous_9363 9 years ago
-
Sending out a deployment with
[-HKEY_LOCAL_MACHINE\SOFTWARE] included.
Something the BOFH would be amused by.... - EdT 9 years ago-
Crikey! BOFH...that takes me back!!! :-) - anonymous_9363 9 years ago