Conmutador/switch que alterna valores de claves del registro

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Conmutador/switch que alterna valores de claves del registro

Mensaje por BasicOs »

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.
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)
Por ejemplo en la clave:
"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
Añadir si se desea compilar:

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 ****
;##############################################################################################
Salu22:)
Adjuntos
conmutaRegistro.zip
Versión actualizada 26/10 y fuentes
(299.36 KiB) Descargado 209 veces
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Conmutador/switch que alterna valores de claves del regi

Mensaje por Ximorro »

Huuuuum, ya no tengo claro los valores para la famosa clave de ejemplo.
Tomé de este comentario:
;valores son 0 desactivado y 5 activado de DWORD, 0x00000001 (1) Y 0x00000005 (5)
pero primero pone que se desactiva con 0 y después que es con 1, ¿cuál es el valor correcto?

Por cierto, ese comentario habría que quitarlo de esta función, que es genérica y no trabaja siempre con esos valores.

Una cosita, en la documentación se dice que se devuelve el valor anterior en el registro, pero al final devuelves 1 a piñón fijo, ¿cuál de las dos cosas quieres hacer?
Uf, y al final grabas la opción en ConsentPromptBehaviorAdmin en vez de en $regKey, el copy-paste y las prisas son mu malas...

Ya cambio esto último y quito lo del comentario, lo del retorno de la función lo pongo para que devuelva el valor anterior, tal como dice la documentación.
Ah, y falta un acento en un sitio... ;-)
Pa que veas no te cambio los IIf por cadenas If-ElseIf :smt005

No he cambiado el zip, si estás de acuerdo con los cambios ya lo recompilas y si no pues deshaz los cambios que quieras...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: Conmutador/switch que alterna valores de claves del regi

Mensaje por chekok »

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)

Si se trata de activar o no el UAC, es pasar a cero para desactivar y para activar, sería restablecer el valor que tuviera el usuaio antes de que cambiásemos el valor, 1,2 o 5.
La vida es larga y dura.
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Conmutador/switch que alterna valores de claves del regi

Mensaje por BasicOs »

@Ximorro Exacto, voy a modificar el código. Si es Vista que use valores 0 y 1, y si es 7, 0 y 5
Hay que cambiar para que informe del valor al que se cambia.
Los comentarios hay que eliminarlos o incluirlos en el main
Lo de devolver solo es para dar un valor de EXITO o FALLO en la función, 1 o 0. No obstante, esto último tambien es trasladable a devolver una cadena vacio o llena.
Voy a añadir alguna opción más para adaptarse a otros valores.

Grabar la opción en $regKey
@checkok gracias por comentar los valores posibles
Salu22:)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Conmutador/switch que alterna valores de claves del regi

Mensaje por Ximorro »

Vaya lío entonces. Así las cosas cambian bastante porque en Seven no es biestado...
¿Cómo detectas si es un W7? ¿AutoIt está preparado para decirlo con @OSType?

Mejor haz tú los cambios, yo estoy en un XP y ni siquiera puedo probarlo...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Conmutador/switch que alterna valores de claves del regi

Mensaje por Jonny »

Ah ¿Pero esto que es, para activar/desactivar el UAC en win vista/seven?.

¡Interesante!

Lo malo es, que al menos la primera vez saltará :).

Salu2!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Conmutador/switch que alterna valores de claves del regi

Mensaje por Chefito »

Ximorro escribió:¿Cómo detectas si es un W7? ¿AutoIt está preparado para decirlo con @OSType?
Con:

Código: Seleccionar todo

@OSVersion
 Returns one of the following: "WIN_2008R2", "WIN_7", "WIN_2008", "WIN_VISTA", "WIN_2003", "WIN_XP", "WIN_XPe", "WIN_2000". 
Puede que con tu versión de autoit no te salgan tantos resultados porque es más antigua. No lo se. Pero renuevate ya Ximorro, que ya es hora :smt005 .

Luego tienes la api getversion, que te dice la versión de windows con su número. Según el número es una u otra. Busca en google estas numeraciones.

También se peude hacer por WMI:

Código: Seleccionar todo

$strComputer = "."
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colOperatingSystems = $objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For $objOperatingSystem in $colOperatingSystems
	Msgbox(0,"Versión",$objOperatingSystem.Caption & " " & $objOperatingSystem.Version)
Next
También con el comando de consola "ver".

Y supongo que se podrá sacar del registro sabiendo las claves.

Y tengo la impresión que se me escapa alguna otra forma....mmmm.....estoy entre una api que te daba mucha información y entre ella estaba la versión del win, y en algún objeto creado con vbscript que hice hace tiempo. No se. Puede que me equivoque :smt017 . No me acuerdo.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Conmutador/switch que alterna valores de claves del regi

Mensaje por BasicOs »

Cambios hechos y actualizado FICHERO zip.

Ahora admite alternar desde 2 (on/off) hasta 4 claves (valores alternativos.
También informa al usuario de los cambios hechos con un mensaje explicativo al ejecutarlo. Este mensaje hay que introducirlo junto con cada valor del registro.
Modo Silencioso o verbose (con o sin mensaje de lo que se cambia)

Salu22:)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Conmutador/switch que alterna valores de claves del regi

Mensaje por Ximorro »

Pues sí que me tendré que pasar al nuevo ;-)
Antes de usar WMI prefiero poner el nuevo y mirar @OSType, ja, ja. Bueno, usar getversion es facilito, eso también sirve.

En realidad el nuevo lo tengo en portable, pero normalmente uso el viejo porque es en lo que tengo todo y además hace los exes más pequeños ;-)

¡Buen trabajo BasicOS!
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder