Ir al contenido


Foto

Validar usuario


  • Por favor identifícate para responder
7 respuestas en este tema

#1 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 24 febrero 2012 - 04:11

Buenas,

En la empresa tenemos una VPN que nos permite conectarnos a todos los PCs de todas las sucursales. Quiero hacer un programilla que se conecte a los diferentes PCs a una carpeta compartida (que siempre es la misma) y mirar qué versión de nuestra aplicación hay instalada (para evitar tener que estar llamando a las sucursales a ver qué versión tienen).

El problema es que hasta que no me valido en el PC (incio - ejecutar - \\IP_PC y en el cuadro de diálogo de inicio de sesión poner usuario/contraseña) no puedo obtener el dato.

La pregunta es, ¿hay alguna forma de automatizar desde Delphi esa validación? No se si me he explicado jejeje

Gracias de antemano

Nos leemos
  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 24 febrero 2012 - 04:59

Hola Xavi.

Tuve un problema similar en un archivo .bat que creé para comprobar y actualizar los equipos en la red local. Los datos a copiar de la carpeta compartida no estaban disponibles hasta pasar por la validación en ese servidor.

Yo lo solucioné poniendo el archivo .bat de actualización en la misma carpeta compartida. De forma que cuando le daban doble-click al acceso directo de ese archivo, al estar en la carpeta compartida, Windows tenía que hacer la validación de usuario.

Seguro que hay formas más simples y elegantes de hacerlo (imagino que con los perfiles de Windows y cuentas de usuario), pero esta solución tan simple a mi me funcionó.

Salut xiquet.
  • 0

#3 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 24 febrero 2012 - 05:54

Bueno, he visto que puede hacerse con un comando de consola, con net, algo así

c:\net use \\IP_MAQUINA contraseña /user:usuario

Es cuestión de ponerlo en un .bat y ejecutarlo antes de acceder a la máquina, pero lo sigo encontrando una opción poco elegante jejejeje

Nos leemos

  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 24 febrero 2012 - 06:13

Desde delphi puedes conectar con un recurso compartido con este esquema:


delphi
  1. procedure Conect;
  2. var
  3.   NetResource: TNETRESOURCE;
  4. begin
  5.   ZeroMemory(@NetResource, sizeof(TNETRESOURCE));
  6.   NetResource.dwType:= RESOURCETYPE_ANY;
  7.   NetResource.lpLocalName:= 'M:';
  8.   NetResource.lpRemoteName:= '\\10.134.12.13\IPC$';  // Ruta del recurso compartido en PC remoto
  9.   NetResource.lpProvider:= '';
  10.  
  11.   if NO_ERROR <> WNetAddConnection2(NetResource, 'PassWord', 'UserName', CONNECT_UPDATE_PROFILE) then
  12.   begin
  13.     // Lo que quieras hacer en tu recurso
  14.   end;
  15.   WNetCancelConnection2('M:', CONNECT_UPDATE_PROFILE, true); // Cerramos y nos vamos
  16. end;




Saludos.
  • 0

#5 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 27 febrero 2012 - 05:13

Gracias escafandra

Entiendo que lo que haces es como si mapearas una unidad de red?

Probaré el código y os comento qué tal ;-)

Nos leemos

  • 0

#6 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 28 febrero 2012 - 11:16

Buenas,

Bueno, gracias al código del compañero escafandra, he podido realizar lo que quería sin necesidad del archivo bat para validarme con el ordenador. Por lo que he podido ver, el lpLocalName no hace falta informarlo si no queremos mapear la unidad de red. Si no lo ponemos, simplemente nos validamos a ese ordenador.

Os dejo el código que he usado ya que le he añadido otra función que me devuelve la descripción del error (la encontré en no se que página, lo siento por no poder decir la fuente)



delphi
  1. function GetErrorMessage(AErrorNum: DWORD): string;
  2. begin
  3.   case AErrorNum of
  4.     ERROR_ACCESS_DENIED:
  5.         Result := 'Access to network resource denied';
  6.     ERROR_ALREADY_ASSIGNED:
  7.         Result := 'Local device already assigned';
  8.     ERROR_BAD_DEV_TYPE:
  9.         Result := 'Local device type does not match network resource type';
  10.     ERROR_BAD_DEVICE:
  11.         Result := 'Local device is invalid';
  12.     ERROR_BAD_NET_NAME:
  13.         Result := 'Network resource name is invalid or unlocatable';
  14.     ERROR_BAD_NETPATH:
  15.         Result := 'Network path not found';
  16.     ERROR_BAD_PROFILE:
  17.         Result := 'User profile is in an incorrect format';
  18.     ERROR_BAD_PROVIDER:
  19.         Result := 'Provider property does not match any provider';
  20.     ERROR_BUSY:
  21.         Result := 'Provider is busy';
  22.     ERROR_CANCELLED:
  23.         Result := 'Connection attempt cancelled';
  24.     ERROR_CANNOT_OPEN_PROFILE:
  25.         Result := 'Cannot save reconnect at logon information';
  26.     ERROR_DEVICE_ALREADY_REMEMBERED:
  27.         Result := 'Connection already remembered';
  28.     ERROR_DEVICE_IN_USE:
  29.         Result := 'Device in use by active process, cannot disconnect';
  30.     ERROR_EXTENDED_ERROR:
  31.         Result := 'A network specific error occurred';
  32.     ERROR_INVALID_PASSWORD:
  33.         Result := 'Invalid password';
  34.     ERROR_NO_NET_OR_BAD_PATH:
  35.         Result := 'Network not started or name could not be handled';
  36.     ERROR_NO_NETWORK:
  37.         Result := 'No network present';
  38.     ERROR_NOT_CONNECTED:
  39.         Result := 'Not connected to specified resource or on specified device';
  40.     ERROR_OPEN_FILES:
  41.         Result := 'Files are open on resource and force disconnect not specified';
  42.     ERROR_LOGON_FAILURE:
  43.         Result := 'User name or password incorrect';
  44.     else
  45.         Result := IntToStr(AErrorNum) + ': Unhandled Error';
  46.   end;
  47. end;
  48.  
  49. function ConnectAndGetVersion(IP: string): string;
  50. var
  51.   NetResource: TNetResource;
  52.   ECode: DWORD;
  53. begin
  54.   Result := '';
  55.  
  56.   ZeroMemory(@NetResource, sizeof(TNETRESOURCE));
  57.   NetResource.dwType := RESOURCETYPE_ANY;
  58.   NetResource.lpLocalName := 'M:';
  59.   NetResource.lpRemoteName := PChar('\\' + IP + '\TPV');  // Ruta del recurso compartido en PC remoto
  60.   NetResource.lpProvider := '';
  61.  
  62.   ECode := WNetAddConnection2(NetResource, 'mi_pass', 'mi_user', CONNECT_UPDATE_PROFILE);
  63.   if (ECode = NO_ERROR) or (ECode = ERROR_DEVICE_ALREADY_REMEMBERED) then
  64.     Result := GetAppVersion('M:\tpv.exe', True)  // esta función simplemente me devuelve la versión de la aplicación
  65.   else
  66.     Result := GetErrorMessage(GetLastError());
  67.  
  68.   WNetCancelConnection2('M:', CONNECT_UPDATE_PROFILE, true); // Cerramos y nos vamos
  69. end;



Nuevamente gracias

Nos leemos

  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 28 febrero 2012 - 02:38

No te sirve sustituir la función GetErrorMessage por esto?:


delphi
  1. SysErrorMessage(GetLastError);




Saludos.
  • 0

#8 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 29 febrero 2012 - 02:16

Pues hombre, por servirme sí me sirve, lo que pasa es que lo desconocía jejejejeje

Muchas gracias de nuevo por el tip escafandra :-)

Nos leemos

  • 0




IP.Board spam blocked by CleanTalk.