Einzelnen Beitrag anzeigen

ringli

Registriert seit: 7. Okt 2004
509 Beiträge
 
Delphi 11 Alexandria
 
#1

Zugriff auf Freigaben über "Verbindung mit ..."-Di

  Alt 10. Jan 2008, 12:03
Ihr kennt doch sicherlich den Dialog "Verbindung mit ... herstellen" der erscheint wenn man bspw. auf eine administrative Freigabe (z.B. \\server\c$) zugreifen möchte. In diesem kann dann die Anmeldedaten für die entsprechende Netzwerkressource eingeben. Aufrufen kann man diesen Dialog über die Funktion SHValidateUNC was grundsätzlich auch klappt.

Jetzt zum Problem:
Wenn man der Funktion bei fConnect 0 übergibt erscheint der Dialog zwar, aber nur wenn man sich in einem einfachen Netzwerk mit Arbeitsgruppe befindet. Befinden sich der PC und der Server aber in einer Domäne, erscheint der Dialog nicht. Erst wenn ich fConnect VALIDATEUNC_CONNECT übergebe erscheint der Dialog. Leider wird dann aber ein Laufwerksbuchstabe mit der Freigabe verbunden was natürlich nicht so sein soll.
Delphi-Quellcode:
const
  SHELL32_DLL : String = 'SHELL32.DLL';

const
  VALIDATEUNC_CONNECT = $0001; // Connect a drive letter.
  VALIDATEUNC_NOUI = $0002; // On either failure or success, display no UI.
  VALIDATEUNC_PRINT = $0004; // Validate as a print share rather than disk share.
  VALIDATEUNC_VALID = $0007; // Mask value used to verify that the flags passed to SHValidateUNC are valid.

type
  TSHValidateUNC = function(hwndOwner : HWnd;
                            szFile : LPWSTR;
                            fConnect : Cardinal) : Boolean; Stdcall;
                     
                     
procedure TForm2.Button1Click(Sender: TObject);
var
  DLL_Handle : THandle;
  DLL_SHValidateUNC : TSHValidateUNC;
  ShareWdStr : WideString;
  ShareWdChr : PWideChar;
begin
  // Handle für die SHELL32.DLL erhalten
  DLL_Handle := LoadLibrary(PChar(SHELL32_DLL));
  // Wenn Handle vorhanden, Adressen der Funktionen ermitteln
  if DLL_Handle <> 0 then
    begin
      // Adressen ermitteln
      @DLL_SHValidateUNC := GetProcAddress(DLL_Handle, PChar('SHValidateUNC'));
      // Wurde SHValidateUNC in der DLL gefunden?
      if @DLL_SHValidateUNC <> nil then
        begin
          //String in PWideChar konvertieren
          ShareWdStr := Edit1.Text; // z.B. \\server\c$
          ShareWdChr := PWideChar(ShareWdStr);
          // Jetzt Dialog aufrufen
          if DLL_SHValidateUNC(Application.Handle,
                               ShareWdChr,
                               {0} VALIDATEUNC_CONNECT) then
            begin
              showmessage('SHValidateUNC war erfolgreich');
            end
          else
            begin
              showmessage('Fehler beim Aufruf von SHValidateUNC' + #13#10 +
                    '#' + IntToStr(GetLastError));
            end;
        end;
      FreeLibrary(DLL_Handle);
    end
  else
    begin
      showmessage(SHELL32_DLL + ' konnte nicht geladen werden');
    end;
end;
Jetzt zur Frage:
Wenn ich unter Start --> Ausführen \\server\c$ eintippe erscheint der "Verbindung mit ... herstellen"-Dialog, egal ob ich mich in einer Arbeitsgruppe oder Domäne befinde. Mit meinem Code funktioniert es ja nur unter den bereits beschriebenen Umständen mit dem unerwünswchten Nebeneffekt (Netzlaufwerk wird verbunden). Was macht Windows hier anders bzw. was muss ich tun um den Dialog zu Gesicht zu bekommen unabhängig davon ob ich mich in einer Arbeitsgruppe oder Domäne befinde?

P.S. Ich hoffe das ich im richtigen Unterforum bin, da das Thema eigentlich sowohl hierher als auch nach Windows-API passen würde. Ansonsten bitte verschieben.
  Mit Zitat antworten Zitat