Conmutador/switch que alterna valores de claves del registro
Publicado: 24 Oct 2011, 14:36
Conmuta valores del Registro alternativamente cada vez que se ejecuta el programa, si hay uno escribe el contrario, típico para claves APAGA/ENCIENDE o PERMITE/PROHIBE.
AHORA, admite hasta cambios alternativos entre 4 claves diferentes.
El ejemplo en que se ejecuta el cambio de registro es el User Access Control o UAC, el preguntón del Windows.
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System","ConsentPromptBehaviorAdmin",
Los valores 5 y 0
"5","0",
El tipo de valor:
"REG_DWORD"
Añadir si se desea compilar:
Salu22:)
AHORA, admite hasta cambios alternativos entre 4 claves diferentes.
El ejemplo en que se ejecuta el cambio de registro es el User Access Control o UAC, el preguntón del Windows.
Por ejemplo en la clave:En XP no existe tal entrada, no hay UAC.
En Windows Vista:
Valor 0 = desactivado
Valor 1 = activado
En Windows 7:
Valor 0 = desactivado
Valor 1 = activado (nivel mínimo)
Valor 2 = activado (nivel medio)
Valor 5 = activado (nivel máximo, activado y muestra todas las notificaciones)
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System","ConsentPromptBehaviorAdmin",
Los valores 5 y 0
"5","0",
El tipo de valor:
"REG_DWORD"
Código: Seleccionar todo
#RequireAdmin
; Aqui comienza el programa - Primer msgBox, si deseas saber que sistema tienes
MsgBox(0, "Modificación del nivel de control de usuarios - UAC", "Sistema Operativo actual " & @OSVersion & " " & @OSServicePack & @CRLF & @CRLF & " Va a modificar su sistema")
If StringInStr("WIN_2003 WIN_XP WIN_XPe WIN_2000", @OSVersion) Then
MsgBox(0, "Sistema sin control de usuarios - UAC", "Sistema Operativo actual " & @OSVersion)
ElseIf StringInStr("WIN_VISTA", @OSVersion) Then
_ConmutaRegistro("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin", "REG_DWORD", "1|Protegido", "0|Sin Protección")
Else ; "WIN_2008R2 WIN_7 WIN_2008"
_ConmutaRegistro("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin", "REG_DWORD", "5||Protección Máxima", "2|Protección Media", "1|Protección Baja", "0|Sin Protección")
EndIf
; #FUNCTION#=======================================================================================
; Nombre ........: _ConmutaRegistro
; Descripción ...: Conmuta el estado Activado/Desactivado o alterna diferentes valores del Registro
; Sintaxis.......: _ConmutaRegistro()
; Parámetros ....: $regpath,$regKey,$pType,$pValue1[1],$pValue2[1],$pValue3[1],$pValue4[1],$pSilent
; Ruta del registro y llave, el tipo de valor (e.g. REG_DWORD), los dos (o tres, o cuantro)valores a intercambiarse, silencioso 0/1
;
; Valor Retorno .: Éxito - Devuelve 1 si se pudo ejecutar correctamente.
; Fallo - Devuelve 0 y activa @error:
; 1: Registro no encontrado (sistema sin Registro o acceso no permitido)
; 2: Registro encontrado, pero no modificable
; 3: Valor actual no especificado en los parametros
; Autor .........: Ximorro, BasicOS, chekok en http://www.autoit.es
; Comentarios ...: Los programas que utilicen esta función pueden requerir la directiva
; #RequireAdmin para poder modificar esta entrada del registro como Admin
;;=================================================================================================
#include <Misc.au3>
Func _ConmutaRegistro($regpath, $regKey, $pType, $pValue1, $pValue2, $pValue3 = "|", $pValue4 = "|", $pSilent = 0)
;valores son 0 desactivado y 5 activado de DWORD, 0x00000001 (1) Y 0x00000005 (5)
Local $nuevoValor, $resultadoEscritura, $ActualValor
;Leemos clave actual
$ActualValor = RegRead($regpath, $regKey)
If @error <> 0 Then
; ;No está la clave: no estamos en un Vista, Seven, etc. o bien no tenemos permisos de acceso
MsgBox(48, "Advertencia", "No existe clave del Registro. Valor encontrado: " & $ActualValor)
Return SetError(1, 0, 0)
EndIf
; Elegimos la clave contraria
$aValue1 = StringSplit($pValue1, "|")
$aValue2 = StringSplit($pValue2, "|")
$aValue3 = StringSplit($pValue3, "|")
$aValue4 = StringSplit($pValue4, "|")
If $aValue3[1] = "" And $aValue4[1] = "" Then
$nuevoValor = _Iif($aValue1[1] = $ActualValor, $aValue2[1], _Iif($aValue2[1] = $ActualValor, $aValue1[1], "Error"))
ElseIf $aValue4[1] = "" Then
$nuevoValor = _Iif($aValue1[1] = $ActualValor, $aValue2[1], _Iif($aValue2[1] = $ActualValor, $aValue3[1], _Iif($aValue3[1] = $ActualValor, $aValue1[1], "Error")))
Else
$nuevoValor = _Iif($aValue1[1] = $ActualValor, $aValue2[1], _Iif($aValue2[1] = $ActualValor, $aValue3[1], _Iif($aValue3[1] = $ActualValor, $aValue4[1], _Iif($aValue4[1] = $ActualValor, $aValue1[1], "Error"))))
EndIf
$ActualTexto = _Iif($aValue1[1] = $ActualValor, $aValue1[2], _Iif($aValue2[1] = $ActualValor, $aValue2[2], _Iif($aValue3[1] = $ActualValor, $aValue3[2], _Iif($aValue4[1] = $ActualValor, $aValue4[2], "Error"))))
$nuevoTexto = _Iif($aValue1[1] = $nuevoValor, $aValue1[2], _Iif($aValue2[1] = $nuevoValor, $aValue2[2], _Iif($aValue3[1] = $nuevoValor, $aValue3[2], _Iif($aValue4[1] = $nuevoValor, $aValue4[2], "Error"))))
If $nuevoValor = "Error" Then
MsgBox(16, "Error ", "El parametro actual del registro es un valor no soportado: " & $ActualValor)
Return SetError(3, 0, 0)
EndIf
; Grabamos la clave
$resultadoEscritura = RegWrite($regpath, $regKey, $pType, $nuevoValor)
If Not $resultadoEscritura Then
MsgBox(16, "Error al modificar Registro", "El Registro es de sólo lectura o algún error en escritura.")
Return SetError(2, 0, 0)
EndIf
If Not $pSilent Then MsgBox(0, "Modificación del registro", "La Clave " & $regKey & " ha cambiado:" & @CRLF & @CRLF & " Valor ahora: " & $nuevoTexto & " (" & $nuevoValor&")" & @CRLF & @CRLF & "Valor previo: " & $ActualTexto& " (" & $ActualValor &")")
Return $ActualValor ;Devolvemos el valor anterior si se pudo escribir en el registro
EndFunc ;==>_ConmutaRegistro
Código: Seleccionar todo
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_outfile=conmutaRegistro.exe
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Description=Autoit.es
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Region ;**** Directives para compilar ****
;##############################################################################################