UAC deactivate desactivar preguntas molestas del sistema

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

UAC deactivate desactivar preguntas molestas del sistema

Mensaje por BasicOs »

Solo con ejecutar esto silenciamos al sistema para funcione como windows XP antiguo, sin preguntar nada,
Funciona de maravilla.

Función: Desactivamos UAC por programa:
ActivarUac(0) Elimina preguntas del sistema, y
ActivarUac(1) Activa el pregunton del sistema.

Código: Seleccionar todo

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_outfile=deactivateUac.exe
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Comment=www.autoit.es
#AutoIt3Wrapper_Res_Description=Desactiva Uac - en caso que no pueda hacerlo lo informa. En caso contrario no da info.
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
; Basicos Elimina UAC  - www.autoit.es
ActivarUac(0) ; valor 0 quitamos UAC

Func ActivarUac($valor) ; valor = 0 desactiva UAC . Valor diferente a 0, ej 1 activa UAC
; Creditos a Basicos y Checkok -  Eliminamos prompts y preguntas del  UAC al modificar el sistema   - Atención usar para usuarios avanzados -www.autoit.es
   #RequireAdmin
  ;valores son 0 desactivado y 5 activado de DWORD,  0x00000001 (1) Y  0x00000005 (5)
  $resultadodeescritura=1
  if $valor=0 then
   If  RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin") Then
    $resultadodeescritura= RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin","REG_DWORD","0")
   Endif
  Else
   If  not RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin") Then
    $resultadodeescritura= RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin","REG_DWORD","5")
   Endif
  EndIf
  if not $resultadodeescritura then
	  msgbox(0,"Error Eliminando Uac - Autoit.es","Valor de registro"& RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin") & "Error en la desactivación")
  EndIf
  Return $resultadodeescritura
EndFunc

Salu22:)

Aquí bajar programa ejecutable y fuentes:
Adjuntos
deactivateUac.zip
Deactivate UAC - Para usuarios avanzados que sepan que es desactivar las preguntas de cambios del sistema
(280.88 KiB) Descargado 254 veces
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: UAC deactivate desactivar preguntas molestas del sistema

Mensaje por chekok »

Que rapidez BasicOS, ya lo he probado y OK.

Que sensación ver mi nick en tu code, muchas gracias!!!
La vida es larga y dura.
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: UAC deactivate desactivar preguntas molestas del sistema

Mensaje por BasicOs »

chekok escribió:Que rapidez BasicOS, ya lo he probado y OK.

Que sensación ver mi nick en tu code, muchas gracias!!!
Gracias a tí por participar y por proponer ideas nuevas!!!! , lo créditos para los autores. Es más facil ejecutar este escript, en vez de ir navegando por menus para algo tan simple como "cerrar la boca" al Windows :)
Salu22:)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: UAC deactivate desactivar preguntas molestas del sistema

Mensaje por Ximorro »

Hombre BasicOs, que has puesto Checkoq en los créditos y él lo escribe chekok :smt005
Aunque se pronuncie igual supongo que no es lo mismo.
(Por cierto, para quien no lo sepa, Ximorro se lee "Chimorro")

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.)

A ver si os gusta esta:

Código: Seleccionar todo

; #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,  0x00000000 (0) Y  0x00000005 (5)
	Local $regpath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
	Local $nuevoValor = 0, $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)
	ElseIf $antiguoValor = 1 Then
		$nuevoValor = 5
	EndIf

	$resultadoEscritura = RegWrite($regpath, "ConsentPromptBehaviorAdmin", "REG_DWORD", $nuevoValor)
	If Not $resultadoEscritura Then
		MsgBox(16, "Error", "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
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.

Como explico en los metadatos la función conmuta el estado de la UAC, devolviendo el valor que había en el registro antes de cambiarlo.
En caso de error devuelve -1 y pone en @error:
1: UAC no encontrado (sistema sin UAC o acceso no permitido)
2: UAC encontrado, pero no modificable

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:

Código: Seleccionar todo

#RequireAdmin
_ConmutaUAC()
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: UAC deactivate desactivar preguntas molestas del sistema

Mensaje por BasicOs »

Ximorro escribió:Hombre BasicOs, que has puesto Checkoq en los créditos y él lo escribe chekok :smt005
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, :smt020 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:
Adjuntos
conmutaUAC.zip
(281.21 KiB) Descargado 159 veces
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: UAC deactivate desactivar preguntas molestas del sistema

Mensaje por Ximorro »

Totalmente de acuerdo, depende de la funcionalidad exacta que se necesite así que cada usuario que tome según le haga falta el conmutador o el activador o desactivador.

Hombre, por el código con un tag "code" para que mantenga el formato... ;-)

No veo mucho el porqué de los cambios, RegRead devuelve un número si es tipo numérico (y en este caso es un dword, un entero de 32bits). Si da error sí devuelve la cadena vacía, pero si no devolverá el número ¿o no es así?
A la hora de asignarlo lo mismo, mira que en la ayuda pone:
RegWrite ( "keyname" [,"valuename", "type", value] )
Es decir, "keyname","valuename" y "type" los pone claramente como strings, pero no value.

Y el If... ¿qué tiene de malo un elseif? al fin y al cabo se sigue comparando la misma variable, por eso he seguido la cascada de comprobaciones pues son excluyentes. Vaya, si he estado a punto de hacer un Switch :smt003
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: UAC deactivate desactivar preguntas molestas del sistema

Mensaje por BasicOs »

Ximorro escribió:Totalmente de acuerdo, depende de la funcionalidad exacta que se necesite así que cada usuario que tome según le haga falta el conmutador o el activador o desactivador.

Hombre, por el código con un tag "code" para que mantenga el formato... ;-)

No veo mucho el porqué de los cambios, RegRead devuelve un número si es tipo numérico (y en este caso es un dword, un entero de 32bits). Si da error sí devuelve la cadena vacía, pero si no devolverá el número ¿o no es así?
A la hora de asignarlo lo mismo, mira que en la ayuda pone:
RegWrite ( "keyname" [,"valuename", "type", value] )
Es decir, "keyname","valuename" y "type" los pone claramente como strings, pero no value.

Y el If... ¿qué tiene de malo un elseif? al fin y al cabo se sigue comparando la misma variable, por eso he seguido la cascada de comprobaciones pues son excluyentes. Vaya, si he estado a punto de hacer un Switch :smt003
Si una versión es unilateral y exacta la otra conmutando.

Basandome en lo que hemos llegado he hecho un conmutador genérico para dos valores del registro, se puede modificar para ir alternando más valores, pero la mayor parte de las veces es ON/OFF para muchos casos: http://www.emesn.com/autoitforum/viewto ... f=4&t=2947

Que uno va a toda velocidad, por eso lo del tag :smt044 :smt044 :smt044 :smt046

Exacto, lo que pasa es que me funcionó bien como string, y no he podido probarlo como valor, pero bueno me imagino que dentro de value puedes poner lo que desees sea string, integro, etc.., ya que lo actualiza y recompone el "type" ;)
No es que me gusta más así lo de separar esto, es algo personal que me parece más "modular". :smt048 :smt048
Salu22:)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: UAC deactivate desactivar preguntas molestas del sistema

Mensaje por Ximorro »

Hombre, si son números es mejor no pasar cadenas, para que no tenga que hacer la conversión de tipos.
Lo mismo al leer el valor y compararlo, si te devuelve un numérico no conviene compararlo con una cadena, eso le fuerza a hacer la conversión, si los dos son números eso se lo ahorra.
Con
If $antiguoValor = "1" Then
estás haciendo
If 1 = "1" Then ;(o con un 5)
con lo que tiene que convertir, pero si usas numéricos, que es el tipo de la variable, pues no convierte...

Y lo de modular... en este caso da lo mismo porque el primer If tiene un return y si entra no va a seguir evaluando, pero un if con elseif es más eficiente que varios if desconectados porque el primero sólo evalúa hasta que valida una condición, de la segunda manera las evalúa todas...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder