PDA

Ver la Versión Completa : sacar el username de windows...


marceloalegre
07-07-2005, 20:41:34
alguien sabe como hacerlo? pero no usando el getusername... de trucomania. la api de windows...
eso por ahora no me sirve porque lo quiero usar en un caso especial con un servicio.... alguien conoce alguna manera distinta de sacar el username de windows... o algun componente que lo haga sin trabajar con la api?
Gracias!

dec
07-07-2005, 21:14:00
Hola,


(...) eso por ahora no me sirve porque lo quiero usar en un caso especial con un servicio

¿Y qué tiene de especial el caso? ¿No puedes usar la función que refieres desde el servicio? ¿Se trata de un servicio de/para Windows? ¿Cuál es el problema, pues?

delphi.com.ar
07-07-2005, 21:19:00
Seguramente el problema es que el servicio se ejecuta con LocalSystem, lo cual no esta mal pero puede escapar un poco de la lógica del programa. ¿Que pasaría si hay dos sesiones de usuarios logueados al mismo tiempo? ¿Cuál es la que quieres que tome?

dec
07-07-2005, 21:30:36
Hola,


¿Que pasaría si hay dos sesiones de usuarios logueados al mismo tiempo?
¿Es posible? ¿Pueden iniciarse en Windows dos sesiones diferentes? Si la respuesta es afirmativa, vas a llevar razón, puesto que:


The GetUserName function retrieves the user name of the current thread. This is the name of the user currently logged onto the system.


Pero, ¿entonces estoy equivocado si pienso que no es posible iniciar dos sesiones en Windows por dos usuarios diferentes a la misma vez?

delphi.com.ar
07-07-2005, 21:44:18
¿Es posible? ¿Pueden iniciarse en Windows dos sesiones diferentes?Si es posible, Terminal Server es un ejemplo de ello. Además es posible que algunos procesos sean creados con otros usuarios (RunAs y/o CreateProcessAsUser). Por eso GetUserName responde al CurrentThread.

Por otro lado puede encontrar esto:
The WNetGetUser function retrieves the current default user name or the user name used to establish a network connection.

Sería bueno saber para que quiere el servicio el usuario..

dec
07-07-2005, 21:46:22
Hola,

Gracias por las aclaraciones al respecto Federico.

marceloalegre
08-07-2005, 14:03:39
Ante todo gracias por contestar; voy a ser mas claro en el inconveniente que estoy teniendo:

sucede que desde un servicio al utilizar el getusername, no se comporta de la misma manera que ejecutandolo desde un form, ya que en vez de salir el usuario que inicio la sesion en cuestion, sale el usuario SYSTEM.
Por ahora he tratado de las siguientes maneras desde el servicio sin exito:

1- API de windows
2- Variables de entorno
3- Sacar info del bde (sirve, pero tengo que tener instalado bde :) o sea no sirve..)

Honestamente por ahora no encuentro nada prolijo.... para hacer esto...
es raro que no exista nada implementado..Además no tendría por que ser algo complicado... pero me esta generando problema la resolucion de este inconveniente.. si alguien sabe algo se los agradecere....

Muchas Gracias!

marceloalegre
08-07-2005, 14:25:43
Habia tratado solo con el GetUserName... ahora use el wnetgetuser ... y tampoco funciona ... sale usuario System al ejecutarlo desde el servicio...

delphi.com.ar
08-07-2005, 14:36:30
Es que tu servicio se ejecuta con el usuario System, precisamente una de las ventajas de los servicios, es que se pueden ejecutar sin que ningún usuario este logueado en el sistema. Si quieres puedes hacer que tu servicio se ejecute con otro usuario que no sea LocalSystem, pero viendo las necesidades que tienes... ¿Tiene que ser un servicio?.

marceloalegre
08-07-2005, 15:14:20
Es cierto lo que comentas, aqui hay un articulo que lo confirma:

Windows NT services run as LocalSystem by default. LocalSystem is a
predefined local account and any service running under LocalSystem:
The service can NOT open HKEY_CURRENT_USER .
The service can open HKEY_LOCAL_MACHINE\SECURITY.
The service has no network credentials and can only access network
resources using a null session. If a share or pipe is accessible by Guest via a
null session, it has access. There is a common misconception that a service
running as LocalSystem has no network access.


Gracias a esta posibilidad al margen lei que hay grandes problemas de seguridad...(que casualidad microsoft dando "la nota" jajaj)... tema interesante para tratar en algun momento...

Te cuento que lametablemente estoy trabajando en una licitacion ya aprobada, que tiene normas muy claras en cuestiones de arquitectura y estoy obligado a utilizar un servicio... :( ... estoy investigando ahora como hacer para ejecutar el servicio, pero como usuario... todavia no he encontrado en la red nada concreto de como hacer esto.. ya que todo el mundo se "arregla" por asi decirlo con un programa normal puesto en el run del registry....

Bueno si hay algo en lo que puedas aconsejarme, estaré mas que atento, y Muchas Gracias!!

delphi.com.ar
08-07-2005, 15:25:07
... estoy investigando ahora como hacer para ejecutar el servicio, pero como usuario...
Es mas que sencillo: Inicio \ Ejecutar \ services.msc. Buscas tu servicio, haces doble click sobre el mismo y te va a mostrar una ventana con la configuración del servicio, vas a la solapa: "Iniciar Sesión", y en lugar de tildar la opción "Cuenta del sistema local" (LocalSystem) elijes: "Esata cuenta" y pones el usuario, la contraseña y su confirmación.

Saludos!

marceloalegre
08-07-2005, 15:39:40
ese es el problema :) lamentablemente... no se que sesion puede usar quien use la aplicacion....
o sea mi idea o plan, minimizando lo mas posible seria llegar a poder hacer algo de esto:

If SeLogueoUnUserNoSystem Then
hacer lo que yo quiera...


poner esto con un timer o ciclo dentro del servicio ...

el tema es que estando el servicio ejecutandose en el contexto de LocalSystem no tengo manera de preguntar si se logueo alguien porque estoy dentro de system....

es todo un tema, no le veo una solución muy practica; ... y muchas gracias por responder y tan rapido!!

delphi.com.ar
08-07-2005, 16:00:38
Fíjate si esto puede servirte de algo:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/winlogon_notification_packages.asp
http://www.elists.org/pipermail/delphi-talk/2003-April/017444.html

Con este código podrías notificar a tu proceso cuando un usuario se loguea y cuando se desloguea, y tendrías que mantener una lista de los mismos.

marceloalegre
08-07-2005, 16:06:42
Estaba pensado... voy a tener que agarrar para otro lado.... ejemplo que se me ocurre, puede ser ver las aplicaciones que se cargan despues de loguear un usuario... y preguntar por si existe alguna de esas (de las que carga windows por obligatoriamente) como el explorer.exe o alguna de esas... tendria que ver si eso da resultado... alguna forma tiene que existir :) tiene que existir algun comportamiento por el cual pueda preguntar aunque este en el entorno de localsystem...

Saludos!..

marceloalegre
08-07-2005, 16:08:14
Epa! cuando estaba escribiendo lo anteriormente dicho vi tu respuesta, voy a ver que puedo hacer con eso, y gracias!

delphi.com.ar
08-07-2005, 16:08:27
Fíjate mi comentario anterior... ;)

delphi.com.ar
08-07-2005, 16:09:08
Epa! cuando estaba escribiendo lo anteriormente dicho vi tu respuesta, voy a ver que puedo hacer con eso, y gracias!
Estamos verdaderamente cruzados!.. :D

marceloalegre
08-07-2005, 16:15:08
JajJAja! si muy cruzados! y MUCHISIMAS GRACIAS!!, en cuanto tenga la respuesta funcional al caso, la posteo para todos; nunca se sabe a quien le puede suceder lo mismo en algun momento...

Saludos!

marceloalegre
11-07-2005, 14:00:33
Para que quede registrado, despues de muchas opciones complejas para solucionar este asunto me decidi por lo que dice en este post:
http://www.clubdelphi.com/foros/showthread.php?t=22018

al controlar la ejecucion del explorer.exe como shell puedo decir que a partir de ahi, se logueo un usuario. :)

Saludos a todos!