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.