1

Тема: VBScript: удаление заданного раздела реестра вместе с подразделами

Используется WMI провайдер «StdRegProv» и рекурсивный перебор вложенных подразделов с последующим их удалением. Результат выполнения функции «DeleteRegistryKey()» определяется группой констант «con_*» («0» — успешное удаление).

' Объявляется глобально (рекомендуется), либо на уровне RecursiveRegKeyDelete
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

' Пример вызова
Result = DeleteRegistryKey("HKLM\SOFTWARE\SOMETHING")

WScript.Echo "Result:", Result

Set objReg = Nothing
'---------------------------------------------------------
Function DeleteRegistryKey(parKey)
    'On Error Resume Next
    
    Const HKEY_CLASSES_ROOT   = &H80000000
    Const HKEY_CURRENT_USER   = &H80000001
    Const HKEY_LOCAL_MACHINE  = &H80000002
    Const HKEY_CURRENT_CONFIG = &H80000005
    
    Select Case Left(parKey,4)
        Case "HKLM": lngRoot = HKEY_LOCAL_MACHINE
        Case "HKCU": lngRoot = HKEY_CURRENT_USER
        Case "HKCR": lngRoot = HKEY_CLASSES_ROOT
        Case "HKCC": lngRoot = HKEY_CURRENT_CONFIG
    End Select 
    
    intResult = RecursiveRegKeyDelete(lngRoot, Mid(parKey, 6))
    
    DeleteRegistryKey = intResult
End Function

'-------------------------------------------------    

Function RecursiveRegKeyDelete(parRoot, parKey)
    'On Error Resume Next
    
    Const con_READ_CONTROL           = 131072
    Const con_KeyDeletedSuccessfully = 0
    Const con_KeyDoesNotExist        = 1
    Const con_AccessDenied           = 2 ' либо нет доступа, либо не удалось удалить вложенные ключи
    Const con_SomeOtherError         = 3
    
    
    If objReg.CheckAccess(parRoot,parKey,con_READ_CONTROL) = 0 Then
        If objReg.EnumKey(parRoot, parKey, arrSubKeys) = 0 Then
            If Not IsNull(arrSubKeys) Then
                For i = 0 To UBound(arrSubKeys)
                    RecursiveRegKeyDelete parRoot, parKey & "\" & arrSubKeys(i)
                Next
            End If
        End If
        
        intResult = objReg.DeleteKey(parRoot, parKey)
        
        If intResult = 0 Then 
            RecursiveRegKeyDelete = con_KeyDeletedSuccessfully
        ElseIf intResult = 5 Then
            RecursiveRegKeyDelete = con_AccessDenied
        Else
            RecursiveRegKeyDelete = Con_SomeOtherError
        End If
    Else
        RecursiveRegKeyDelete = con_KeyDoesNotExist
    End If
End Function
'-------------------------------------------------

Автор идеи — dsb.