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
Validar usuario
Comenzado por
cadetill
, feb 24 2012 04:11
7 respuestas en este tema
#1
Escrito 24 febrero 2012 - 04:11
#2
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.
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.
#3
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
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
#4
Escrito 24 febrero 2012 - 06:13
Desde delphi puedes conectar con un recurso compartido con este esquema:
Saludos.
delphi
procedure Conect; var NetResource: TNETRESOURCE; begin ZeroMemory(@NetResource, sizeof(TNETRESOURCE)); NetResource.dwType:= RESOURCETYPE_ANY; NetResource.lpLocalName:= 'M:'; NetResource.lpRemoteName:= '\\10.134.12.13\IPC$'; // Ruta del recurso compartido en PC remoto NetResource.lpProvider:= ''; if NO_ERROR <> WNetAddConnection2(NetResource, 'PassWord', 'UserName', CONNECT_UPDATE_PROFILE) then begin // Lo que quieras hacer en tu recurso end; WNetCancelConnection2('M:', CONNECT_UPDATE_PROFILE, true); // Cerramos y nos vamos end;
Saludos.
#5
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
Entiendo que lo que haces es como si mapearas una unidad de red?
Probaré el código y os comento qué tal ;-)
Nos leemos
#6
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)
Nuevamente gracias
Nos leemos
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
function GetErrorMessage(AErrorNum: DWORD): string; begin case AErrorNum of ERROR_ACCESS_DENIED: Result := 'Access to network resource denied'; ERROR_ALREADY_ASSIGNED: Result := 'Local device already assigned'; ERROR_BAD_DEV_TYPE: Result := 'Local device type does not match network resource type'; ERROR_BAD_DEVICE: Result := 'Local device is invalid'; ERROR_BAD_NET_NAME: Result := 'Network resource name is invalid or unlocatable'; ERROR_BAD_NETPATH: Result := 'Network path not found'; ERROR_BAD_PROFILE: Result := 'User profile is in an incorrect format'; ERROR_BAD_PROVIDER: Result := 'Provider property does not match any provider'; ERROR_BUSY: Result := 'Provider is busy'; ERROR_CANCELLED: Result := 'Connection attempt cancelled'; ERROR_CANNOT_OPEN_PROFILE: Result := 'Cannot save reconnect at logon information'; ERROR_DEVICE_ALREADY_REMEMBERED: Result := 'Connection already remembered'; ERROR_DEVICE_IN_USE: Result := 'Device in use by active process, cannot disconnect'; ERROR_EXTENDED_ERROR: Result := 'A network specific error occurred'; ERROR_INVALID_PASSWORD: Result := 'Invalid password'; ERROR_NO_NET_OR_BAD_PATH: Result := 'Network not started or name could not be handled'; ERROR_NO_NETWORK: Result := 'No network present'; ERROR_NOT_CONNECTED: Result := 'Not connected to specified resource or on specified device'; ERROR_OPEN_FILES: Result := 'Files are open on resource and force disconnect not specified'; ERROR_LOGON_FAILURE: Result := 'User name or password incorrect'; else Result := IntToStr(AErrorNum) + ': Unhandled Error'; end; end; function ConnectAndGetVersion(IP: string): string; var NetResource: TNetResource; ECode: DWORD; begin Result := ''; ZeroMemory(@NetResource, sizeof(TNETRESOURCE)); NetResource.dwType := RESOURCETYPE_ANY; NetResource.lpLocalName := 'M:'; NetResource.lpRemoteName := PChar('\\' + IP + '\TPV'); // Ruta del recurso compartido en PC remoto NetResource.lpProvider := ''; ECode := WNetAddConnection2(NetResource, 'mi_pass', 'mi_user', CONNECT_UPDATE_PROFILE); if (ECode = NO_ERROR) or (ECode = ERROR_DEVICE_ALREADY_REMEMBERED) then Result := GetAppVersion('M:\tpv.exe', True) // esta función simplemente me devuelve la versión de la aplicación else Result := GetErrorMessage(GetLastError()); WNetCancelConnection2('M:', CONNECT_UPDATE_PROFILE, true); // Cerramos y nos vamos end;
Nuevamente gracias
Nos leemos
#7
Escrito 28 febrero 2012 - 02:38
No te sirve sustituir la función GetErrorMessage por esto?:
Saludos.
delphi
SysErrorMessage(GetLastError);
Saludos.
#8
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
Muchas gracias de nuevo por el tip escafandra :-)
Nos leemos










