Ximorro escribió:Hombre
BasicOs, que has puesto
Checkoq en los créditos y él lo escribe
chekok
Aunque se pronuncie igual supongo que no es lo mismo.
(Por cierto, para quien no lo sepa,
Ximorro se lee "Chimorro")
Corregido en el foro, menos mal que en el foro todos sabemos quien es checkok,
Mucha velocidad de escritura
Esa función está bien pero hay que recompilar para cambiar el estado o tener dos EXEs diferentes. Yo lo vería más práctico como una función conmutadora, que mire y si está activado lo desactiva, y si ya está desactivado lo vuelve a activar. Por supuesto que no cree la entrada si no existe (quizás estamos en un XP, etc.)
Está hecho a posta así.
Debía haberlo explicado en el primero post. Entendí que si alguien quiere exactamente y unilateralmente desactivar el UAC, si volver atrás, era suficiente un ejecutable. Luego puse también lo del parámetro 0 o 1 por si alguien deseaba usar la función dentro de un programa, para el usuario que lo pidió en el foro de Soporte y Ayuda, solo tiene que usar la función y meterla dentro del programa que está haciendo.
Me interesaba más sacrificar el tema de que cada vez que se arranque cambie el estado, pero entonces lo lógico es empezar a pedir interacción al usuario, que si esta OFF el UAC, desea encenderlo?? y al revés. Esa no era la intención, si no usarlo más como batch.
Ahora si se arranca solo pregunta si realmente quieres modificar el sistema, como para usuarios avanzados, que lo quieren siempre sin UAC (mi caso). Yo no creo que vuelva a activar el UAC ni loco, ya con el antivirus me basta de preguntitas.
La función que propones está perfecta para otros casos, para PCs en que lo usen por ejemplo un USUARIO AVANZADO y su padre (u otro que no sepa lo que hace), lo puede usar el
hijo para que el padre no deje que se le cuele algún virus, aunque aunque el padre siempre va a responder SI a todo lo que le pregunten como buen NOVATO. (Si me permiten el ejemplo que uso) ;)
Por cierto, no activo #RequireAdmin en la función, al fin y al cabo es un setting global, si el usuario quiere ejecución como administrador mejor que lo especifique en el programa explícitamente.
Si, #RequireAdmin es algo peligroso para PCS que tengan administrador, ya que abre el script a ser Admin.
Esa es la función para quien la quiera usar Y MODIFICAR (si no os gusta algo lo cambiáis que para eso estamos). Para completar el programa y hacer un ejecutable conmutador simplemente se añade esto al principio (con las directivas de compilación que queráis) y se compila:
Lo bueno del foro es que están todos los fuentes y cualquier programador puede adaptar a sus necesidades el código perfectamente.
Salu22:)
Una versión retocada (cambié valores enteros por string de variables, y separé el primer in que controla que "exista UAC", y puse una más general.
Código: Seleccionar todo
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_outfile=conmutaUAC.exe
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Description=Autoit.es
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
_ConmutaUAC()
; #FUNCTION#=======================================================================================
; Nombre ........: _ConmutaUAC
; Descripción ...: Conmuta el estado Activado/Desactivado del Control de Acceso de usuarios (UAC)
; Sintaxis.......: _ConmutaUAC()
; Parámetros ....: Ninguno
; Valor Retorno .: Éxito - Valor original del registro para la activación de UAC
; Fallo - Devuelve -1 y activa @error:
; 1: UAC no encontrado (sistema sin UAC o acceso no permitido)
; 2: UAC encontrado, pero no modificable
; 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
;;=================================================================================================
Func _ConmutaUAC()
;valores son 0 desactivado y 5 activado de DWORD, 0x00000001 (1) Y 0x00000005 (5)
Local $regpath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
Local $resultadoEscritura
Local $antiguoValor = RegRead($regpath, "ConsentPromptBehaviorAdmin")
If $antiguoValor="" Then
; ;No está la clave: no estamos en un Vista, Seven, etc. o bien no tenemos permisos de acceso
MsgBox(48, "Advertencia", "Sistema de control de acceso de usuarios (UAC) no encontrado.")
Return SetError(1,0,-1)
Endif
If $antiguoValor = "0" Then
$nuevoValor = "5"
ElseIf $antiguoValor = "5" Then
$nuevoValor = "0"
EndIf
$resultadoEscritura = RegWrite($regpath, "ConsentPromptBehaviorAdmin", "REG_DWORD", $nuevoValor)
If Not $resultadoEscritura Then
MsgBox(16, "Error al modificar Registro", "El sistema de control de acceso de usuarios (UAC) es de sólo lectura.")
Return SetError(2,0,-1)
EndIf
Return $antiguoValor ;Devolvemos valor original
EndFunc
Adjunto ejecutable y fuentes: