Hi, danke für deine Anteilnahme und deine Ideen,
hab folgendes Probiert:
(mein "alter" Quellcode):
Delphi-Quellcode:
function ConnectNetworkDrive(const ADrive: String; const ADirectory, AUsername, APassword: String; const ARestoreAtLogon: Boolean): DWORD;
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);
end;
Dein Quellcode:
Delphi-Quellcode:
function ConnectNetworkResource(const networkResource: string; const mappedLetter:
string = ''; const username: string = ''; const password: string = ''): boolean;
var
bufferSize : DWORD;
driveName : string;
netResource: TNetResource;
remoteName : pointer;
wnetResult : integer;
begin
Result := false;
if mappedLetter <> '' then begin
GetMem(remoteName, MAX_PATH+1);
try
driveName := mappedLetter[1] + ':';
wnetResult := GetDriveType(PChar(driveName + '\'));
WriteLog('1driveName: ' + driveName);
if wnetResult = DRIVE_REMOTE then begin
bufferSize := MAX_PATH;
wnetResult := WNetGetConnection(PChar(driveName), remoteName, bufferSize);
if wnetResult = ERROR_MORE_DATA then begin
FreeMem(remoteName);
GetMem(remoteName, bufferSize);
wnetResult := WNetGetConnection(PChar(driveName), remoteName, bufferSize);
end;
Result := (wnetResult = NO_ERROR) and (AnsiSameText(networkResource, Trim(PChar(remoteName))));
WriteLog('1networkResource: ' + networkResource);
if (not Result) and (wnetResult = NO_ERROR) then begin
WNetCancelConnection2(PChar(driveName), 0, true);
WriteLog('1WNetCancelConnection2' + IntToStr(wnetResult));
end;
end;
finally FreeMem(remoteName); end;
end;
if not Result then begin
FillChar(netResource, SizeOf (netResource), 0);
netResource.dwScope := RESOURCE_GLOBALNET;
netResource.dwType := RESOURCETYPE_DISK;
netResource.dwDisplayType := RESOURCEDISPLAYTYPE_SHARE;
netResource.dwUsage := RESOURCEUSAGE_CONNECTABLE;
if mappedLetter <> '' then
netResource.lpLocalName := PChar(driveName);
netResource.lpRemoteName := PChar(networkResource);
WriteLog('2driveName: ' + driveName);
WriteLog('2networkResource: ' + networkResource);
Result := (WNetAddConnection2(netResource, PChar(password), PChar(username), 0) = NO_ERROR);
WriteLog('2username: ' + username);
WriteLog('2password: ' + password);
WriteLog('2WNetCancelConnection2: ' + BoolToStr(Result, True));
end;
end;
schreibe alles in ein Log-File, da ich nicht weiß wie ich einen Dienst Debuggen kann. Nun ja, ich muss sagen laut Log funktioniert alles, alle Werte werden wahrheitsgemäß übergeben und zum Schluss bekommen ich als Ergebnis
"2WNetCancelConnection2: True". Das Problem ist allerdings das ich das Laufwerk nicht habe und mit "net use" keine aktiven Verbindungen verfügbar sind. Da sehr wahrscheinlich die Frage kommt unter welchem Konto der Dienst läuft: Unter dem aktuell angemeldeten Benutzer.
Ich könnte mir alle Haare raufen...