Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   ShellExecute mit Netzlaufwerk (https://www.delphipraxis.net/179877-shellexecute-mit-netzlaufwerk.html)

sintronic86 8. Apr 2014 14:38

ShellExecute mit Netzlaufwerk
 
Hallo Community,

ich mal wieder. Ich stehe gerade vor einem Problem.

Situation:
In der Firma liegt auf dem Server ein Ordner, in welchem Daten zu Projekten abgelegt sind.
Ein solcher Ordner existiert auch auf einem über WebDAV erreichbaren Server, auf welchen ich ein
Netzlauwerk gemappt habe (Z:\);

Das auslesen des Ordners auf dem firmeninternen Server funktioniert super.
Aber der Zugriff auf den Ordner im gemappten Laufwerk funktioniert nicht. Da liefert mir ShellExecute immer den
Code 3 ("The specified path was not found.") zurück. Ironischerweise nur dann, wenn hinter dem "Z:" noch mehr Pfad folgt (Bsp: "Z:\Projects\123).
Den Pfad "Z:" öffnet er ohne Probleme.

Ich habe zwar schon viel gegoogelt und einige Lösungsvorschläge versucht, aber es war noch nicht das richtige dabei.

Hat einer von euch eine Ahnung wie ich den Zugriff bewerkstelligen kann?

Besten Dank im Voras

Dalai 8. Apr 2014 15:35

AW: ShellExecute mit Netzlaufwerk
 
Wurde das Netzlaufwerk mit einem anderen Nutzer(konto) verbunden als deine Software läuft? Netzlaufwerke unter Windows sind (seit Win2k) nutzerspezifisch (seit Vista spielt da noch die UAC mit rein).

MfG Dalai

Guido R. 8. Apr 2014 17:05

AW: ShellExecute mit Netzlaufwerk
 
Hi !

Startest Du Dein Programm mit erhöhten Rechten (als Administrator ausführen) ? - Es könnte sein, dass für den Admin andere Laufwerksmappings vorhanden sind, als für den "normalen" User.
Wenn Z:\ für User und Admin mit jeweils unterschiedlichen Freigaben verknüpft ist, dann können beide auf Z:\ zugreifen, aber auf Grund unterschiedlicher Verzeichnisstruktur nicht auf ein best. Unterverzeichnis.
Ggf. kann Dir auch Tante Google mit dem Stichwort "EnableLinkedConnections" weiterhelfen.

Gruß
Guido R.

sintronic86 10. Apr 2014 10:24

AW: ShellExecute mit Netzlaufwerk
 
@Dalai:
Oh man, wie erkläre ich das? Um die Ordnerstruktur auslesen zu können, verbinde ich während der Programminstanz dieses Laufwerk erneut unter einem anderen Laufwerksbuchstaben (bsw. K:\), wodurch ein Dialog aufploppt, der die LoginDaten wissen will. Dann lese ich die Ordnerstruktur aus und trenne das Laufwerk wieder (alles silent, also für den Nutzer nicht sichtbar).
So funktioniert der Zugriff auch. Ich liste dann die Ordnerstrukur in einem TTreeView auf (nur bestimmte Ordner, nicht alle) indem ich den Pfad "K:\..." nehme und das "K" gegen das "Z" austausche und möchte dann diese Ordner per Doppelklich auf den Eintrag öffnen (ShellExecute).

Das Netzlaufwerk ("Z") wurde mit bestimmten Zugangsdaten verbunden. Mir ist aber nicht bewusst, dass mein Programm welche hinterlegt haben sollte. Für gewöhnlich muss ich, wenn ich das Laufwerk manuell im Explorer öffnen möchte, meine Daten eingeben.


@Guido R.:
Ich habe sowohl das normale Starten als auch das Starten als Admin versucht, aber es ändert leider nichts. Kann ich denn dem ShellExecute auch LoginDaten mitgeben?

himitsu 10. Apr 2014 10:47

AW: ShellExecute mit Netzlaufwerk
 
Es kann ntürlich sein, dass ShellExecute/ShellExecuteEx (absichtlich) nicht auf Logindaten prüft, bzw. keine Rückmeldung zum Benutzer integriert hat.

Aber wenn du eh bereits einen Code zum Verbinden des Laufwerks hast, dann könntest du den doch benutzen? (mit eigenem Passwortabfragedialog)
Was sagt denn der Fehlercode vom ShellExecute? :stupid:


Du willst doch nur den Ordner öffnen?
Dann wende dich doch direkt an den Explorer und sag dem per Parameter, welchen Pafd er öffnen/anzeigen soll. (ist nur etwas blöd, wenn der Explorer nicht der Standard-Dateibrowser ist)

sintronic86 10. Apr 2014 11:04

AW: ShellExecute mit Netzlaufwerk
 
Zitat:

Es kann ntürlich sein, dass ShellExecute/ShellExecuteEx (absichtlich) nicht auf Logindaten prüft, bzw. keine Rückmeldung zum Benutzer integriert hat.
Und ich kann der procedure keine Daten hinterlegen?


Zitat:

Was sagt denn der Fehlercode vom ShellExecute?
Der Rückgabewert ist "3", was (laut meiner eigenen Suche?!?) "Verzeichnis wurde nicht gefunden" bedeutet.
Auch der Aufruf (SysUtils) FindFirst auf das Laufwerk liefert "3", also Pfad nicht gefunden zurück.


Zitat:

Du willst doch nur den Ordner öffnen?
Dann wende dich doch direkt an den Explorer und sag dem per Parameter, welchen Pafd er öffnen/anzeigen soll.
Das ist korrekt. Und wie mache ich das dann, wenn nicht mit shellexecute?

himitsu 10. Apr 2014 11:15

AW: ShellExecute mit Netzlaufwerk
 
Zitat:

Zitat von sintronic86 (Beitrag 1255158)
Und ich kann der procedure keine Daten hinterlegen?

Das geht nur, aufgerufene Programm Dieses als Parameter entgegen nimmt, oder wenn z.B. ein Server solche Daten in der Adresse/URL annimmmt (welches aber auch wieder aus eine art parameter hinaus geht).


Zitat:

Zitat von sintronic86 (Beitrag 1255158)
"Verzeichnis wurde nicht gefunden" bedeutet.

OK, dann schaut daas Ding garnicht erst auf "eventuell" nachladbare Mappings/Laufverke.
Hatte gehofft der meint dann was von "Zugriff verweigert", so als wenn er versuchen würde sich ohne Logindaten zu verbinden.


Zitat:

Zitat von sintronic86 (Beitrag 1255158)
Das ist korrekt. Und wie mache ich das dann, wenn nicht mit shellexecute?

Es bleibt bei Shellexecute, nur daß du eben nicht direkt die Datei aufrufst und somit sagst "Ey Windows, gibt das mal an das Standardprogramm weiter",
sondern direkt das Programm ansprichst, wo man dann auch zusätzliche Parameter mitgeben kann
Delphi-Quellcode:
%windir%\explorer.exe
mit z.B.
Delphi-Quellcode:
"D:\Eigene Dateien"
als Parameter (der Explorer kennt notfalls noch eine ganze Reihe an Steuerparametern)

sintronic86 10. Apr 2014 11:45

AW: ShellExecute mit Netzlaufwerk
 
Ich habe jetzt folgendes probiert:
Delphi-Quellcode:
ShellExecute(Application.Handle, nil, 'explorer.exe', PChar('Z:\'), nil, SW_NORMAL);
-> funktioniert

Delphi-Quellcode:
ShellExecute(Application.Handle, nil, 'explorer.exe', PChar('Z:\Projects'), nil, SW_NORMAL);
-> funktioniert nicht, er öffnet dann die "eigenen Dokumente" (Der Pfad "Z:\Projects" ist aber auf dem manuellen Weg im Explorer erreichbar)

himitsu 10. Apr 2014 12:29

AW: ShellExecute mit Netzlaufwerk
 
Z:\Projects\ geht vermutlich auch nicht?
Das ist ein richtiges Verzeichnis? (keine Junction, Softlink, lokalisierte Pfadname oder Dergleichen)

Wenn der Explorer den Pfad nicht findet, dann springt/bleibt er in seinem normalen Startverzeichnis.

Und bei z.B. Leerzeichen/Sonderzeichen im Pfad nicht die " vergessen.

Dalai 10. Apr 2014 13:53

AW: ShellExecute mit Netzlaufwerk
 
Zitat:

Zitat von sintronic86 (Beitrag 1255144)
@Dalai:
Oh man, wie erkläre ich das?

Am besten so, dass man es versteht ;).

Zitat:

Um die Ordnerstruktur auslesen zu können, verbinde ich während der Programminstanz dieses Laufwerk erneut unter einem anderen Laufwerksbuchstaben (bsw. K:\), wodurch ein Dialog aufploppt, der die LoginDaten wissen will. Dann lese ich die Ordnerstruktur aus und trenne das Laufwerk wieder (alles silent, also für den Nutzer nicht sichtbar).
Öhm, ploppt ein Dialog auf oder ist alles silent? :gruebel:

Zitat:

Das Netzlaufwerk ("Z") wurde mit bestimmten Zugangsdaten verbunden. Mir ist aber nicht bewusst, dass mein Programm welche hinterlegt haben sollte. Für gewöhnlich muss ich, wenn ich das Laufwerk manuell im Explorer öffnen möchte, meine Daten eingeben.
Wenn dein Programm keine Zugangsdaten hinterlegt hat, wie ist dann o.g. Vorgehensweise möglich, alles silent zu machen?

Weiterhin ist mir noch nicht klar, ob nun dein Programm mit einem anderen Nutzerkonto läuft als das Netzlaufwerk verbunden wurde. Nochmal: Netzlaufwerke sind nutzerspezifisch. Ein Netzlaufwerk, das als Hans verbunden wurde, ist von einem Programm, das als Willi läuft, nicht zugänglich. Ebenso ist (bei eingeschalteter UAC) ein Netzlaufwerk, das in einem elevated Prozess verbunden wurde, nicht für Programme zugänglich, die non-elevated laufen (und IIRC auch umgekehrt).

MfG Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 Uhr.
Seite 1 von 2  1 2   

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