Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-12-2014
Mendizabal Mendizabal is offline
Miembro
NULL
 
Registrado: sep 2014
Posts: 31
Poder: 0
Mendizabal Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 19-12-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Mendizabal,

¡Bienvenido al Club Delphi!

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.
Responder Con Cita
  #3  
Antiguo 07-01-2015
Mendizabal Mendizabal is offline
Miembro
NULL
 
Registrado: sep 2014
Posts: 31
Poder: 0
Mendizabal Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 08-01-2015
Mendizabal Mendizabal is offline
Miembro
NULL
 
Registrado: sep 2014
Posts: 31
Poder: 0
Mendizabal Va por buen camino
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.

Última edición por nlsgarcia fecha: 08-01-2015 a las 13:33:50. Razón: Inclusión de Links por Limitación del Usuario (Menos de 10 mensajes publicados)
Responder Con Cita
  #5  
Antiguo 08-01-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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 , en lo que pueda lo voy a revisar y si logro alguna solución la publico

Saludos,

Nelson.
Responder Con Cita
  #6  
Antiguo 12-01-2015
Mendizabal Mendizabal is offline
Miembro
NULL
 
Registrado: sep 2014
Posts: 31
Poder: 0
Mendizabal Va por buen camino
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.

Última edición por nlsgarcia fecha: 12-01-2015 a las 17:57:05. Razón: Inclusión de Links por Limitación del Usuario (Menos de 10 mensajes publicados)
Responder Con Cita
  #7  
Antiguo 12-01-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Mendizabal,

Cita:
...he logrado solucionar el problema...


Nelson.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear una consola de administración (msc) para Windows fide_uci API de Windows 5 13-04-2011 19:00:32
Enviar fax mediante código vivamotos C++ Builder 0 08-07-2010 12:31:54
Cambiar permisos de carpeta en windows mediante código vivamotos C++ Builder 0 12-08-2008 09:20:07
nesecito un Realizar EXE mediante codigo limbertx Varios 8 21-10-2007 23:40:32
ODBC mediante codigo sakuragi Conexión con bases de datos 2 04-12-2004 09:34:15


La franja horaria es GMT +2. Ahora son las 23:33:57.


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
Copyright 1996-2007 Club Delphi