PDA

Ver la Versión Completa : Grabar en registro y directorio Windows como usuario limitado


alquimista
21-01-2008, 16:04:54
Muy buenas.

Soy nuevo en el foro...

Mi pregunta es la siguiente.

¿Es posible grabar en el registro de Windows y en el directorio de Windows siendo usuario limitado en delphi?
- Tengo desarrollado un mata procesos (preferentemente juegos) para instalar en una red de ordenadores sin mantenimiento. En cada puesto de trabajo pueden haber unos 10 usuarios algunos con privilegios de Admin (para instalar programas) y la mayoría como usuarios limitados.

- El programa se está preparando para actualizar desde web.
Y el programa está instalado en c:\Windows\prog\. Se instala desde una cuenta de Admin.
La idea es descargar la app desde web (primero comprobando versión), cerrar el programa ejecutandose y grabar la actualización en la carpeta anterior. En usuario limitado no graba ya que no tiene permiso para escribir en c:\Windows\xxx ni tampoco en el registro en la clave HKLM( LOCAL MACHINE) subclave la de mi programa.:(
- He buscado por ahí y he visto funciones como AdjustTokenPrivileges o algo parecido pero no entiendo muy bien el funcionamiento. Ademas el ejemplo que hay por los foros es para permitir apagar Windows y esto no me sirve.

A ver si alguien me puede ayudar...
Que quede claro que el programa no es un troyano o similar.

Gracias de antemano.:D

Chris
21-01-2008, 16:48:34
Hola alquimista (http://www.clubdelphi.com/foros/member.php?u=25490).
Normalmente, la mayoría de los miembros no contestamos a preguntas que no le sabemos la respuesta. Cuando mucho solemos dar sugerencias y/o alternativas a lo que buscas. Dudo mucho que recibas gran ayuda acá o en cualquier lugar al respecto. Como te dije, mi respuesta es más bien una segurencia en vez de una respuesta directa a tu problema.

Seguramente lo que buscas, si no es imposible, es muy, muy díficil de hacerlo. A menos que tengas conocimientos de hacker sobre windows.
Lo más adecuado, sería que, antes de iniciar tu aplicación, comprobaras si el usuario tiene privilegios administrativos, sino los tiene, entonces mostrar una ventana donde un usuario con suficientes privilegios pueda darle permiso a tu aplicación para hacer las modificaciones necesarias.


A ver si alguien me puede ayudar...
Que quede claro que el programa no es un troyano o similar.

Descuida, no somo mal pensados. :)
Cada quien es responsable de sus actos.

Saludos.

alquimista
21-01-2008, 17:30:30
La aplicación ya está en marcha y funcionando.
Ya tengo una rutina para saber si uno es administrador o no.
Si es imposible desactivaré la entrada a la aplicación o por lo menos el cambio de password y la actualización.

Mas que nada me interesaba para la actualización de la aplicación.

El ponerlo en Windows\nombreapp\ era para que no la borraran los user limitados y para que no fuese tan evidente como en c:\nombreapp o c:\Archivos de programa\...

La aplicación esta ejecutándose bajo XP y tenia oido de que era posible por lo menos no llegar a usuario administrador pero sí por lo menos activar privilegios para algunas cosas.

En un principio la aplicación se arranca al iniciar WINDOWS y está lo más oculta posible. Se utiliza para no permitir arrancar juegos u otras aplicaciones. No tiene una seguridad brutal pero funciona.

Bueno gracias por la pronta respuesta.
Estaré a la escucha por si alguien da alguna solución.

Chris
21-01-2008, 21:24:55
ojo, la otra alternativa seía darle privilegios a usuarios limitados a que puedan hacer modificaciones en C:\miapp. de esa forma si te serviría la herramienta.

alquimista
21-01-2008, 23:11:11
60 ordenadores por unos 10 usuarios o mas. :eek:
Son muchos creo...

La idea es tal y como están los pcs que funcione con lo que quería hacer.

Gracias de nuevo..

Un saludo.

cHackAll
21-01-2008, 23:33:20
Bueno; si tienes acceso a dichos ordenadores, y por consiguiente a sus cuentas puedes usar la API: CreateProcessAsUser para "correrte a ti mismo" (que tu proceso se corra a si mismo), con los privilegios de un administrador.

Tambien hay otras alternativas; pero entre todas la anterior es la más aconsejable.

Saludos

alquimista
22-01-2008, 00:12:00
El problema es que las contraseñas de Administrador no son siempre las mismas, yo se algunas pero no la de todos los pcs, y creo que la función CreateProcessAsUser tiene de parámetros usuario, password, dominio , etc...
Vamos que es un lio. Se trata de aulas con poco mantenimiento.
Viendo que parece mu complicado optaré por deshabilitar las opciones del programa en modo user limitado.
Gracias... Anima que la gente responda en muy poco tiempo.:):):)

cHackAll
22-01-2008, 00:27:24
Entiendo; pero no veo mayor problema... en todo caso podrías darle los privilegios de escritura a los usuarios restringidos para que tu aplicacion guardara tus LOGs o INIs en alguna carpeta como comentabas anteriormente.

Click derecho en la carpeta->Propiedades->Seguridad->Avanzadas->Seleccionar "Usuarios"->Modificar->Seleccionas los privilegios->Aplicar->Aceptar

Incisto pues es una buena opción dejar a los usuarios como restringidos.

Suerte

alquimista
22-01-2008, 00:53:27
La idea es no tocar la configuración de los Pcs (son muchos) , sino que el programa sea capaz de tomar el control y realizar las acciones necesarias.

He visto por ahí otra funcion llamada CreateProcessWithLogon pero creo que tambien hay que ponerle user y pass, aparte no consigo entenderla muy bien (debe ser por que he leido en inglés).

Neftali [Germán.Estévez]
22-01-2008, 11:30:31
Si tu programa no tiene permisos de administrador es lógico que no pueda hacer cosas de nivel Administrador.
Puedes probar a grabar en la clave de registro CURRENTUSER en lugar de LOCALMACHINE; Eso afectará sólo a tu usuario, no al resto (cosa normal que no te deje hacer cosas que afecten al resto si no tienes permisos de Admin).

Puedes ejecutar procesos con nivel administrador, pero para eso deberás conocer usuario y contraseña del administrador. Es lógico, sino sería un caos.

alquimista
22-01-2008, 12:08:55
Bueno....
Visto que no es posible deshabilitaré la entrada a configurar la app al usuario limitado y que el programa grabe la actualización cuando inicie sesión un administrador.

Para la actualización (todavía no está implementada) había pensado
colocar en web la aplicación y un fichero de texto con la versión nueva.
Descargar el txt y comparar versión de APP con la descargada. si es asi descargar la app de web.
Luego ejecutar desde mi app un exe que copie la nueva y machaque la vieja. Para ello antes cierro la app.
Esto es un poco lioso.
¿Sabe alguien si hay un tema sobre esto o abro otro tema:)?

Ya tengo implementada la descarga de los archivos web y funciona bien.

Un saludo a todos

Neftali [Germán.Estévez]
22-01-2008, 13:31:01
Esto es un poco lioso.
¿Sabe alguien si hay un tema sobre esto o abro otro tema?

Es lioso, pero básicamente es lo que hay que hacer; No te queda otra.

Si quieres hablar más del tema, yo te recomiendo que abras otro tema sobre las actualizaciones. de todas formas, busca antes, porque ya hemos hablado sobre ellovarias veces, incluso si no recuerdo mal, hay quien subió código/ejemplos sobre ello.

alquimista
23-01-2008, 01:23:24
Ya he localizado el hilo de actualización de app por web.

He visto que lo que comentabas en esos hilos se parece a lo que decia, pero no se me habia ocurrido los de obtener la versión del exe en ejecución. Como la app mia es la que mira si se actualiza y lleva una const con la versión pos no me hace falta.
He visto tu web y trae código muy interesante sobre la descarga web. Lo he probado sobre delphi 2006 y he tenido que cambiar un par de cosas y ha funcionado correctamente.

Gracias por la ayuda.

:p:p:p:p

alquimista
24-01-2008, 20:19:21
He estado haciendo pruebas con mi app.
Y por supuesto falla en cosas triviales.
¿Si creo un usuario fijo para todos los pcs desde mi programa y utilizo
CreateProcessWithLogonW, desde un usuario limitado podría funcionar?

¿Como puedo desde delphi crear un usuario fijo con privilegios de Admin desde cuenta Admin?

Al deshabilitar Ctrl+Alt+Supr desde la app (HKLM\....) me falla también en user limitado.
- mi appp cuando arranca lo cambia en registro y cuando finaliza vuelve a habilitar Ctrl+alt+supr. ¿Sirve también usar (HKCU\....)?

Me tiene frito es usuario limitado:mad::mad:

Ya se que son muchas preguntas, pero en el fondo es por culpa de no poder escribir en el registro.


Gracias

cHackAll
24-01-2008, 20:48:32
Desde una cuenta con privilegios de administrador SI puedes crear otra cuenta con privilegios de administrador; la cual la podrás utilizar desde una cuenta limitada con cualquier método "run as" como el que comentas.

Para crearla (puesto que lo harás casi manualmente; puedes utilizar un VBScript, acá te lo dejo; crea un usuario de nombre "admin" y password "HAclave". debes crear un archivo ".VBS" y copiar lo siguiente:

set o=createobject("shell.users").create("admin")
o.setting("AccountType")=3
o.changepassword "HAclave", ""

Ahora podrás realizar lo que necesitas... lo del Ctrl+Alt+Del (supongo que te refieres al "DisableTaskMgr"), es efectivo en todas las cuentas que tengan reg (HKCU)

Saludos

alquimista
25-01-2008, 02:06:01
Bueno me rindo. Se ve que me viene grande esto del delphi.

Tampoco me funciona DisableTaskManager en usuario limitado.
Voy a añadir taskmng.exe a la lista negra de mi app y que chequee la lista cada 10 segundos.
Y pasaré a un fichero codificado las password de la app y ciertas configuraciones del programa.

Creo que esto ya se puede cerrar.

Si alguien quiere ayudarme a pulir mi app.
¿En que hilo se puede poner?
-Es un matajuegos que utiliza un escaner de ficheros (usando un componente findfile), un ShellNotify para detectar creación de archivos y el mataprocesos con una lista negra de programas.

Gracias por las respuestas:)

cHackAll
26-01-2008, 02:35:11
No pudiste con esta clave?:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Policies\System]

Supongo que el código para crear un usuario en VBS te resultó algo "extraño", en tal caso te lo pongo en Delphi:

uses ComObj;

procedure TForm1.Button1Click(Sender: TObject);
var user: OleVariant;
begin
user := CreateOleObject('shell.users');
user := user.create('admin');
user.changepassword('HAclave', '');
user.setting('AccountType') := 3;
end;

PD: no entiendo cual es el problema; en fin

Suerte

Lepe
26-01-2008, 03:13:33
Busca "EnditAll" por google, es un programa que hace exactamente eso y ofrece el código fuente.

Eso sí, el código es más raro que el escrito por cHackAll ;).

Saludos

alquimista
26-01-2008, 15:45:07
Me he rendido temporalmente, ya que dispongo de muy poco time para la app.

El problema solo lo tengo en usuarios limitados.
Voy a explicarlo con más detalles para que comprendáis mi problema.
Perdonad si me repito en alguna cosa.
Ya que en mi programa deshabilito ctr+alt+supr con lo del registro y cuando salgo de programa (al apagar Windows) vuelvo a habilitar ...
Esto va que ni pintado en Administrador. Pero como el user limitado no permite escribir en esa clave resulta que si que pueden ejecutar el admin de tareas y aparte no puedo grabar tampoco los fichero de log que tiene mi app, ni tampoco me permitiría actualizar la app desde user limitado.
El programa hace lo que tiene que hacer (matar procesos de aplicaciones en lista negra), pero claro si resulta que el user limitado puede matar el proceso la hemos fastidiado.

Como dije hay muchos Pcs con Winxp y una media de 10 user (variados admin y limitados).
La idea era crear en todos los usuarios una cuenta fija de admin para utilizar procedimientos de "run as" pero no estoy muy puesto y al intentallo con el Ceate..LogonW me ha pegado una peazo excepción, aparte de no saber que poner en el parámetro domain (puse el nombre de la máquina) ya que no estan en dominio los pcs.
He probado lo de los permisos del registro. pero no me funciona bien. Toqué el usuario restringido por si era general para todos los usuarios limitados.

El programa lo instalo con el NSIS (Instalador Nullsoft) y graba la app en C:\Windows\app\ desde una cuenta de Admin.

Espero haber aclarado un poco el problema.

Gracias

alquimista
26-01-2008, 16:04:01
Lo de Enditall lo he visto y ya no está disponible de forma gratuita.
Pero yo el problema de matar procesos no lo tengo. El programa mata procesos de forma automática y detecta grabaciones de archivos desde un disco al disco duro. Si dichos programas o archivos están en la lista los mata o los borra grabando en un log todo lo que ocurra. Esto está operativo y funciona. Se arranca al inicio de Windows y permite apagar la máquina.

Lo que me importa es la seguridad para evitar que borren la app o el proceso de la app. Desde Admin funcionan las medidad del Ctrl+Alt.. y la app esta protegida por una pass cifrada (guardada en el registro de Win) tanto para entrar como para salir (se accede solo en la tray windos), Se oculta de la barra de tareas y en taskmgr en la pestaña aplicaciones.
El primer problema que me encontre es que al desactivar Ctrl+... no podia ni siguiera reiniciar la maquina. Esto lo solucioné. Pero me sigue quedando el problema de los user limitados que no dejan escribir en HKCU\,,,\policies\system y no puedo deshabilitar ctrl+...

Perdón si me enrollo pero es para intentar dejar las cosas más claras.

salu2