![]() |
Netzlaufwerk verbunden, aber nicht bereit
Hi!
Ein nervige Phänomen unter Windows XP (evtl. auch andere Versionen): Ich habe ein Netzlaufwerk auf einen anderen PC verbunden, sagen wir U: = \\pc1\frei . Wenn nun pc1 neugestartet wird, kann ich später mit allen möglichen Windows-APIs nicht mehr auf diesen Ordner zugreifen, auch nachdem der pc1 schon lange wieder gestartet ist. Beispiel (\\pc1\frei\1.txt existiert!): if FileExists('u:\1.txt') then begin wird niemals "true" sein. Lasse ich diesen Befehl in einer Schleife oder mit einem Timer laufen, kommt erst dann "true" dabei raus, wenn ich im Windows-Explorer / Arbeitsplatz das Laufwerk doppelklicken, bzw. mir dessen Inhalt anzeigen lasse. *zensiertes Fluchen* Wie kann ich mit meinem Programm diese Funktion simulieren, bzw. welche APIs was auch immer muss ich aufrufen, damit die Dateien wieder verfügbar sind? Weitere Info: -DirectoryExists('U:\') = true, erst wenn das Netzlaufwerk getrennt wird ist es false. -Ich kann das Netzlaufwerk nicht einfach "neu" verbinden, da das Programm nicht den Benutzernamen und das Passwort zum verbinden des Netzlaufwerks kennt -den Effekt kann man nicht so einfach nachstellen, er passiert öfters mal "einfach so" -der Effekt ist unabhängig von meinen Programmen, afaik können dann auch Befehle wie "dir" nicht in der Kommandozeile verwendet werden (bzw. liefern nix zurück) bis das Laufwerk angeklickt wurde -Domäne oder nicht ist egal Danke im Vorraus für Ideen. |
Re: Netzlaufwerk verbunden, aber nicht bereit
Das könnte daran liegen, das Windows aktive SMB Sessions Standardmäßig nach 15 Minuten trennt und diese dann erst wieder aktiviert wird wenn Du zB im Explorer auf das "verbundene" Laufwerk klickst. Bis Windows XP kann ich dir dafür ne Funktion anbieten, die API wurde allerdings bei Vista entfernt und ich habe bis jetzt auch noch keinen anständigen Ersatz finden können.
Delphi-Quellcode:
Rückgabewerte und mehr Infos
type
TWNetRestoreConnectionW = function (hwndParent:HWND; lpDevice:PWideChar):DWORD; stdcall; function ReconnectDrive(const path:string):DWORD; var libhandle : HMODULE; func : TWNetRestoreConnectionW; driveW : WideString; begin Result:= ERROR_EXTENDED_ERROR; driveW := ExtractFileDrive(path); if driveW='' then Exit; libhandle := LoadLibrary('mpr.dll'); Result := 0; if libhandle=0 then Exit; try func := TWNetRestoreConnectionW(GetProcAddress(libhandle, 'WNetRestoreConnectionW')); if Assigned(func) then Result := func(0, @driveW[1]); finally FreeLibrary(libhandle); end; end; ![]() |
Re: Netzlaufwerk verbunden, aber nicht bereit
Der Windows-Explorer hat vermutlich UserNamen/Passwort noch gespeichert und führt ein automatisches Reconnect durch. Das macht natürlich ein einfacher FilExists nicht. Du müsstest versuchen den Explorer (oder teile davon) fernsteuern. Evtl. ein "verstecktes" Starten einer Windows Explorer instanz mit öffnen des entsprechenden laufwerkts oder die TShell**-Controls entsprechend versteckt einsetzen.
|
Re: Netzlaufwerk verbunden, aber nicht bereit
Danke soweit für die Antworten.
Ja, mit ShellExecute könne ich einfach den Ordner meiner Daten (in diesem Fall: "U:\") als unsichtbares Fenster aufrufen und dann nach 10 Sekunden oder so dieses Fenster wieder schließen lassen. Hoffentlich mache ich dann auch das richtige Fenste zu, sonst geht dem Benutzer einfach der komplette Explorer zu :D Mal schauen... |
Re: Netzlaufwerk verbunden, aber nicht bereit
Hm, da könntest Du Probleme mit einigen Virenscannern bekommen wenn Du mal eben so den Explorer killst.
Versuche doch mal ob es funktioniert wenn du Findfirst() mit dem Netzwerklaufwerk aufrufst.
Delphi-Quellcode:
var
sr: TSearchRec; begin FindFirst('z:\*.*', faAnyFile, sr); FindClose(sr); if FileExists('z:\datei.txt') then Showmessage('jap') else ShowMessage('nö'); end; |
Re: Netzlaufwerk verbunden, aber nicht bereit
Ich versuche gerade nochmal, das Problem praktisch nachzustellen, dabei kommt folgendes heraus:
FileExists('U:\1.txt') liefert nicht false, sondern erstmal garnix zurück. D.h. das komplette Programm steht. Der TimeOut für die Funktion FileExists scheint bei über 5 Minuten zu liegen. (Einfach den anderen PC ausschalten, und das Programm hängt an der stelle. Es gibt also kein "False" zurück.) Deshalb gehe ich davon aus, dass auch FindFirst/FindNext erstmal das Programm hängen lässt. Ich werde das gleich testen, sobald hier mal wieder was funktioniert. Ich bin ggf. durchaus auf ein Problem gestoßen, wenn die PCs verschiedene Benutzernamen / Passwörter haben, der Ordner aber für "Jeder" freigegeben ist (auch bei Sicherheitseinstellungen). Mal schauen. Edit 1: -gestrichen- Edit 2: Also die Sitzungswiederherstellung auch unter anderen Anmeldedaten klappt, auch wenn die Sitzung einen Time-Out hatte. ![]() |
Re: Netzlaufwerk verbunden, aber nicht bereit
Zitat:
|
Re: Netzlaufwerk verbunden, aber nicht bereit
^-- Zitat von meinem gestrichenen Edit 1 vom Beitrag vorher.
Ich habe die PCs mit Windows XP Pro irgendwie nicht über Datei- und Druckerfreigabe verbunden bekommen, wenn das Konto des einen PCs (benutzername: benutzer1 / passwort: 12345) nicht auf dem anderen PC vorhanden war (benutzername: benutzer2 / passwort: 23456). Über Gastkonto hat das auch nicht geklappt. Das ist aber ein Windows-Problem, was jetzt nichts konkret mit dem aktuellen Problem zu tun hat. Ich verbinde mich nun auf pc1 mit "net use \\pc1\frei /user:benutzer1 12345". Das klappt nun soweit, dass es generell geht, aber das von mit beschreibene Problem (dass der Inhalt des Laufwerks in Delphi nicht ermittelt werden kann), lässt sich immernoch nicht nachvollziehen oder lösen. Ergo sollte das Problem nicht speziell mit den Anmeldedaten zu tun haben. |
Re: Netzlaufwerk verbunden, aber nicht bereit
Du solltest das Problem folgendermaßen nachvollziehen können.
Auf dem Server klickst Du bei verbundenem Netzwerklaufwerk unter Computerverwaltung -> Freigegebene Ordner -> Sitzungen rechts auf den Benutzernamen und dann Sitzung schliessen. Somit sollte das Netzwerklaufwerk Serverseitig getrennt sein so wie es nach 15min inaktivität auch von Windows selbst gemacht wird. Ich hatte das mal so gelöst, das ich den Server erst angepingt habe, bei erreichbarkeit gecheckt habe ob das Programm auf XP läuft und dann og Funktion verwendet habe um alles wiederherzustellen. Für Vista funktioniert bei mir FindFirst()... meistens :| |
Re: Netzlaufwerk verbunden, aber nicht bereit
Damit kann man wohl einen Fehler simulieren, wenn das Programm bereits läuft (so dass z.B. kurzzeitig Dateien nicht verfügbar sind oder neu geöffnet werden müssen), aber ich habe mit dem speziellen Fehler das Problem, wenn ich das Programm starte (und das Problem in Windows schon besteht, dass das Laufwerk "nicht reagiert", aber verbunden ist und beim anklicken auch den Inhalt zeigt und mein Programm dann weiterläuft).
Mit deinem provozierten "Fehler" hat mein Programm kein Problem (bzw. Windows selbst scheinbar auch nicht). *confused* Edit 1: Ja in der Tat! Ich versuche hier im Forum eine Lösung für ein Problem zu finden, dass ich garnicht habe ^^. Naja, aber als Programmierer kenn man glaube ich dieses Problem :D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz