PDA

Ver la Versión Completa : Insertar credencial de unidad de red


noobdelphi5
19-01-2016, 01:42:39
Buenas Tardes,

Uso Delphi 7 y mi servicio se usará en win XP, vista, 7 y 8.
Tengo un problema con este procedure sirve perfectamente si lo corro con un botón, pero al momento de correrlo como un servicio de windows me abre el cmd pero no borra la unidad, ni inserta la credencial de la unidad de red.
A continuación pegó mi código:

procedure loginRed(cmdUnidad, cmdusuario, cmdPass, cmdRuta, cmdVentana: String; cmdTiempo: Integer; cmdError: Boolean);
var
conectar: String;
opcion: Cardinal;
begin
opcion:=SW_HIDE;
case AnsiIndexStr(cmdVentana,['oculta', 'visible']) of
0 : opcion:=SW_HIDE;
1 : opcion:=SW_SHOW;
end;
conectar:='net use '+cmdUnidad+' '+cmdRuta+' /user:'+cmdUsuario+' '+cmdpass;
WinExec(PChar('net use '+cmdUnidad+' /del /yes'), opcion);
sleep(cmdTiempo);
if cmdError=True Then
begin
ShowMessage(SysErrorMessage(GetLastError));
end;
WinExec(PChar(conectar), opcion);
sleep(cmdTiempo);
if cmdError=True Then
begin
ShowMessage(SysErrorMessage(GetLastError));
end;
end;

¿Es posible hacer esto cómo servicio?, Necesito su ayuda, ya lo intente sigo sin resultados.
Otra pregunta, ¿Para atrapar la pantalla de cmd como le puedo hacer?, porque SysErrorMessage(GetLastError) no arroja el error al no poder conectar a la unidad de red, solo aparece "La operación se ha completado correctamente".

noobdelphi5
19-01-2016, 20:26:19
Encontré esta función para conectar unidades de red la utilizo después de borrar la unidad anterior con

WNetCancelConnection(PChar(unidad),True);

Pero igualmente me corre si la ejecuto con botón pero no corre en un servicio, la función:

function ConnectShare(Drive, RemotePath, UserName, Password : String):Integer;
var
NRW : TNetResource;
begin
with NRW do
begin
dwType := RESOURCETYPE_ANY;
if Drive <> '' then
lpLocalName := PChar(Drive)
else
lpLocalName := nil;
lpRemoteName := PChar(RemotePath);
lpProvider := '';
end;
Result := WNetAddConnection2(NRW, PChar(Password), PChar(UserName), 0);
end;

function DisconnectShare(Drive : String):Integer;
begin
Result := WNetCancelConnection2(PChar(Drive), 0, false);
end;

El resultado que me devuelve cuando se ejecuta es 1312:

ERROR_NO_SUCH_LOGON_SESSION
1312 (0x520)
A specified logon session does not exist. It may already have been terminated.

noobdelphi5
20-01-2016, 01:32:45
Después de varios intentos lo conseguí con este código, lo publico por si alguien tiene el mismo problema.

procedure Conect;
var
NetResource: TNETRESOURCE;
begin
ZeroMemory(@NetResource, sizeof(TNETRESOURCE));
NetResource.dwType:= RESOURCETYPE_ANY;
NetResource.lpLocalName:= 'Z:';
NetResource.lpRemoteName:= '\\ruta'; // 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('Z:', CONNECT_UPDATE_PROFILE, true); // Cerramos y nos vamos
end;