Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Probleme Netzwerk-Login (https://www.delphipraxis.net/189311-probleme-netzwerk-login.html)

H.Bothur 30. Mai 2016 10:50

Probleme Netzwerk-Login
 
Moin,

im Moment habe ich auf meinem Laptop eine Batch-Datei mit der ich mich ins Heim- oder Firmennetz einlogge:

Delphi-Quellcode:
    echo 1) Einloggen in Firmenrechner per LAN
    echo 2) Einloggen in Homeserver
    set /p Auswahl=...Auswahl eingeben :
    :start2
    rem
    rem Löschen aller alten Freigaben
    net use * /delete /yes
    if %Auswahl%==2 goto LogHome
    rem Einloggen in Firma
    net use i: \\192.168.20.10\fileserving Password /USER:Arbeitsgruppe\User
    net use o: \\192.168.20.11\oralog Password /USER:Arbeitsgruppe\User
    goto Ende
    rem Einloggen Zuhause
    :LogHome
    net use i: \\Homeserving\Fileserving Password /USER:Arbeitsgruppe\User
    net use j: \\Homeserving\Mediaserving Password /USER:Arbeitsgruppe\User
    goto Ende
Das ganze klappt natürlich auch :) Jetzt wollte ich das in Delphi nachbauen:

Das Trennen funktioniert so (und das ohne Probleme):

Delphi-Quellcode:
    procedure NetzwerkLaufwerkeTrennen;
    var
         Ergebnis: Cardinal;
    begin
         Ergebnis := ShellExecute(0, nil, PChar('net'), PChar('use * /delete /yes'), nil, SW_SHOW);
         if Ergebnis <> 42 then ShowMessage(FloatToStr(Ergebnis));
    end;
Das Verbinden geschieht über:

Delphi-Quellcode:
    function ConnectNetworkDrive(const ADrive: String; const ADirectory, AUsername, APassword: String; const ARestoreAtLogon: Boolean ): Boolean;
    var
        NetResource: TNetResource;
        dwFlags:    DWORD;
        lPwd, lUser: PChar;
    begin
        NetResource.dwType := RESOURCETYPE_DISK;
        NetResource.lpLocalName := PChar(ADrive);
        NetResource.lpRemoteName := PChar(ADirectory);
        NetResource.lpProvider := nil;
        if ARestoreAtLogon then dwFlags := CONNECT_UPDATE_PROFILE else dwFlags := 0;
        if AUsername<>'' then lUser := PChar(AUsername) else lUser := nil;
        if APassword<>'' then lPwd:=PChar(APassword) else lPwd := nil;
        Result := WNetAddConnection2(NetResource, lPwd, lUser, dwFlags) = NO_ERROR;
    end;
    procedure LaufwerkeVerbinden;
    var
        Ergebnis: Cardinal;
    begin
         (* Firmenrechner *)
          NetzwerkLaufwerkeTrennen;
         if not ConnectNetworkDrive(LW1Letter_Fa, LW1Path_Fa, UserName, UserPathWord, true) then RaiseLastOSError;
         if not ConnectNetworkDrive(LW2Letter_Fa, LW2Path_Fa, UserName, UserPathWord, true) then RaiseLastOSError;
    end;

Und da habe ich ein Problem: Wenn ich versuche mich zu verbinden bekomme ich einen Fehler 1202: Der lokale Gerätename hat eine gespeicherte Verbindung zu anderen Netzwerkressourcen.

Was mache ich da falsch ? Irgendwas funktioniert dann ja bei dem Login in Delphi anders als bei Batch-Variante - nur was ??

Gruß
Hans

bra 30. Mai 2016 10:59

AW: Probleme Netzwerk-Login
 
Ich würde sagen, das ShellExecute beim Trennen funktioniert nicht. Du solltest stattdessen die cmd.exe aufrufen und dort als Parameter /k bzw. /c und den "net use..." Befehl übergeben. Da gibts auch einige Beiträge dazu im Forum.

jobo 30. Mai 2016 12:33

AW: Probleme Netzwerk-Login
 
Ja, entweder er trennt nicht richtig (!=42 ?) oder die beiden Connect Befehle nutzen evtl das gleiche Laufwerk (das dann beim 2. Aufruf schon belegt ist)
Kann man aber ohne Kenntnis der Aufrufparameter nicht viel mehr zu sagen.

DeddyH 30. Mai 2016 12:39

AW: Probleme Netzwerk-Login
 
Was soll die 42 eigentlich bedeuten (außer der Antwort auf die Frage nach dem Leben, dem Universum und einfach allem)?ShellExecute gibt doch im Erfolgsfall eine Pseudo-hInstance zurück, die kann man wohl eher schlecht mit einem festen Wert vergleichen.
Zitat:

The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. It can be cast only to an int and compared to either 32 or the following error codes below.

Luckie 30. Mai 2016 18:45

AW: Probleme Netzwerk-Login
 
Code:
net use /delete
akzeptiert Wildcards? Das ist mir neu.

hoika 30. Mai 2016 18:54

AW: Probleme Netzwerk-Login
 
Hallo,
ich habe mir angewöhnt, eine Batch-Datei zu erzeugen
und diese per (wie oben gezeigt) ShellExecute cmd /C auszuführen.


Heiko

H.Bothur 30. Mai 2016 20:06

AW: Probleme Netzwerk-Login
 
Das mit dem Batch-Job ist eine Idee .... Ich selber habe ja manchmal das Gefühl als ob in den Delphi-Programm das Trennen noch nicht beendet ist wenn das Verbinden beginnt. IRgendwie waren die alten Zeiten ja doch besser als alles linear abgearbeitet worden ist :-D

Vielen Dank für die Ideen

HAns

HolgerX 31. Mai 2016 04:13

AW: Probleme Netzwerk-Login
 
Hmm..

Oder Du machst es ganz ohne ShellExecute und Batch mit


WNetEnumResource
WNetAddConnection2
WNetCancelConnection2

Damit geht es über eine Windows-API.

jobo 31. Mai 2016 07:46

AW: Probleme Netzwerk-Login
 
Zitat:

Zitat von H.Bothur (Beitrag 1339159)
Delphi-Quellcode:
    procedure NetzwerkLaufwerkeTrennen;
         Ergebnis := ShellExecute(0, nil, PChar('net'), PChar('use * /delete /yes'), nil, SW_SHOW);

Vieleicht besser 'net use * /delete /yes'.
Und ist ShellExecute nebenläufig oder nicht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz