Einzelnen Beitrag anzeigen

Benutzerbild von Bambuti2000
Bambuti2000

Registriert seit: 11. Okt 2007
Ort: Troisdorf
44 Beiträge
 
Delphi XE2 Architect
 
#5

Re: Dienst kann kein Netzlaufwerk verbinden...

  Alt 1. Mär 2010, 12:55
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...
Stefan
  Mit Zitat antworten Zitat