Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Administración de Credenciales de Windows mediante Código (https://www.clubdelphi.com/foros/showthread.php?t=87349)

Mendizabal 18-12-2014 18:53:04

Administración de Credenciales de Windows mediante Código
 
Buenas Club Delphi. Antes de nada disculpadme si el título no es lo suficientemente descriptivo. Pero bueno, vamos al lío. Estamos desarrollando una aplicación en Delphi XE2 cuyo cometido es acceder a un equipo en red local, buscar un archivo concreto y guardarlo en un directorio del equipo de destino (en la misma red local). Hasta aquí ningún problema. Resumo por si a caso:

La aplicación (instalada en el equipo 2) busca un archivo en el "servidor" (Equipo 1), y lo copia en una carpeta del Equipo 2.

¿Cual es el problema? Pues que uno de esos equipos de destino o "equipo 2" no tiene las credenciales de windows del Equipo 1 guardada en su almacén de credenciales. El usuario de ese equipo es incapaz de introducir las credenciales a mano, y yo tampoco tengo acceso. Así que me preguntaba si había alguna manera, e imagino que sí, de enviar las credenciales por código (Es decir, que mi aplicación introduzca las credenciales en el almacén de credenciales de windows sin intervención ninguna del usuario). Espero que se entienda lo que pregunto.

Y ya por curiosidad ¿Es posible, de un modo similar, imagino que mediante la API, modificar una credencial almacenada?

Muchas gracias por la atención y ya, de paso, por las millones de veces que sin saberlo vosotros me habéis sacado de un atolladero. Las respuestas de nlsgarcía, en concreto, son una pasada. Aunque uno no tenga la duda que ahí se expone, siempre son la mar de interesantes, y provechosas. Un auténtico crack ^\||/

Saludos.

nlsgarcia 19-12-2014 08:43:39

Mendizabal,

¡Bienvenido al Club Delphi! :D

Te sugiero revisar la Guía de estilo de los foros, recomendada a todos los nuevos ingresos al Club Delphi.

¡Gracias por tu cooperación! :) ^\||/

Saludos,

Nelson.

Mendizabal 07-01-2015 09:49:52

Buenas a todos.

Al final enviamos a un técnico para que añadiera las credenciales "a mano". De todas formas, si a alguien se le ocurre alguna solución, se agradece cualquier sugerencia. Hacer desplazar a un técnico únicamente para eso es demasiado costoso.

Por cierto, si el problema no está bien explicado puedo probar a hacerlo de nuevo.

Saludos y gracias.

Mendizabal 08-01-2015 12:24:47

Perdón por encadenar dos mensajes seguidos en el mismo hilo, pero creo que a lo mejor a alguien puede interesarle esta información.

La siguiente función me permite logarme a un equipo remoto:

Código Delphi [-]
function InsertarCredenciales (Usuario,PassWord,Dominio: string): Boolean;
var
  TokenHandle : THandle;
  boolLogado : Boolean;

begin
  Result := False;

  boolLogado := LogonUser(PChar(Usuario), PChar(PassWord), PChar(Dominio),
    LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, TokenHandle);

  if boolLogado then
    Result := ImpersonateLoggedOnUser(TokenHandle)
  else
    ShowMessage(IntToStr(GetLastError));
end;

No es lo que estaba buscando puesto que ImpersonateLoggedOnUser() únicamente introduce las credenciales de forma temporal. Es decir, en ningún caso te permite modificar el almacén de credenciales de windows. De todas formas, hasta encontrar una solución mejor, puede servir para que mi programa realice la tarea para la que ha sido programado.

Seguiremos investigando a ver si encontramos una forma de modificar el almacén de credenciales de windows. Creo que vamos por el buen camino, pero toda ayuda sigue siendo bienvenida.

Links de interés:

Si alguien necesita más información puede buscar:
Saludos y gracias a todos.

nlsgarcia 08-01-2015 15:28:17

Mendizabal,

Cita:

Empezado por Mendizabal
...vamos por el buen camino, pero toda ayuda sigue siendo bienvenida...

^\||/

Cita:

Empezado por Mendizabal
...si el problema no está bien explicado puedo probar a hacerlo de nuevo...

Toda la información adicional que puedas dar no esta de más :)

No he podido revisar tu caso, ciertamente me parece muy interesante :rolleyes: , en lo que pueda lo voy a revisar y si logro alguna solución la publico :D

Saludos,

Nelson.

Mendizabal 12-01-2015 17:44:42

Buenas Club Delphi,
Esta tarde he tenido un rato libre (bendito lujo), y he logrado solucionar el problema. En realidad, como veréis, la cosa es mucho más sencilla de lo que parecía. Únicamente hacía falta tener un poco de tiempo para investigar. Os dejo una función de ejemplo por si alguien le sirve en el futuro:

Código Delphi [-]
procedure TForm1.SaveCredentials(Target: WideString; User: WideString; Password: WideString);
begin
  CREDENTIALS.TargetName := PWideChar(Target);
  CREDENTIALS.Type_:= CRED_TYPE_GENERIC;
  CREDENTIALS.UserName := PWideChar(User);
  CREDENTIALS.Persist := CRED_PERSIST_ENTERPRISE;
  CREDENTIALS.CredentialBlob := PByte(Password);
  CREDENTIALS.CredentialBlobSize := 2*(Length(Password));

  if CredWrite(@CREDENTIALS,0) then
    ShowMessage('Sucess')
  else
    ShowMessage(IntToStr(GetLastError));
end;

Hay que tener en cuenta que he tenido que utilizar la librería "JEDI Windows API" que traduce las funciones avanzadas de la API de Windows a DELPHI. No es mayor problema, ya sabemos que la gente de PROJECT JEDI hace un fabuloso trabajo traduciendo cabeceras de C a DELPHI. En fin, en definitiva, hay que llamar a JwaWinCred.

Por cierto, la variable CREDENTIALS es del tipo CREDENTIALW (contenida en JwaWinCred).

Links de interés (Por favor, que algún moderador formatee bien los enlaces. Es en atención a posibles usuarios interesados en este tema. Muchas gracias):
Muchas gracias a todos por la atención. Espero que esta información le resulte útil a alguien.

nlsgarcia 12-01-2015 17:58:26

Mendizabal,

Cita:

...he logrado solucionar el problema...
^\||/

Nelson.


La franja horaria es GMT +2. Ahora son las 06:42:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi