Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   WNetAddConnection2 under Win Server 2016 (https://www.delphipraxis.net/203042-wnetaddconnection2-under-win-server-2016-a.html)

dataspider 7. Jan 2020 15:31

WNetAddConnection2 under Win Server 2016
 
Hi

Wir haben eine neue Citrix Farm eingerichtet.
Die Alte Farm hatte WinSrv 2008, die Neue ist 2016.

In Delphi mappe ich ein Laufwerk mit WNetAddConnection2...

Delphi-Quellcode:
TWNet.AddConnection(AppConfig.MapDrive, AppConfig.MapPath);


hier die Klassenmethode:

Delphi-Quellcode:
class function TWNet.AddConnection(ADrive, AFolder, AUsername, APassword:
    string; AUpdateProfile: Boolean = False): Boolean;
var
  NetResource: TNetResource;
  dwFlags: DWORD;
  UserName: PChar;
  Password: PChar;
  AResult: Cardinal;
begin
  //Sleep(500);
  with NetResource do
  begin
    dwType := RESOURCETYPE_DISK;
    lpLocalName := PChar(ADrive);
    lpRemoteName := PChar(AFolder);
    lpProvider := nil;
  end;
  if (AUpdateProfile) then
    dwFlags := CONNECT_UPDATE_PROFILE
  else
    dwFlags := 0 {CONNECT_TEMPORARY};

  UserName := Nil;
  Password := Nil;
  if AUsername <> '' then
    UserName := PChar(AUsername);
  if APassword <> '' then
    Password := PChar(APassword);

  AResult := WNetAddConnection2(NetResource, Password, UserName, dwFlags);
  Result := (AResult = NO_ERROR);
  if not Result then
    raise Exception.Create('Fehler beim Verbinden Netzlaufwerk: ' + sLineBreak + ADrive +
          ' -> ' + AFolder + sLineBreak + ' Code: ' + IntToStr(AResult));
end;
In der neuen Farm unter Server 2016 erhalte ich folgende Fehlermeldung:

Fehler beim Verbinden Netzlaufwerk:
...
Code 1202

Was könnte das Problem auslösen?

Danke

Frank

hhcm 7. Jan 2020 16:36

AW: WNetAddConnection2 under Win Server 2016
 
Wie wird die Methode denn genutzt?

1202 bekomme ich nur wenn ich in den Flags CONNECT_UPDATE_PROFILE nutze und das Laufwerk bereits "bekannt" ist.
Das passiert z.B wenn das Netzlaufwerk manuell gemappt wurde (mit der Checkbox "Verbindung bei Anmeldung wiederherstellen")

Vielleicht vorher WNetCancelConnection2 nutzen?

Dalai 7. Jan 2020 20:20

AW: WNetAddConnection2 under Win Server 2016
 
Es lohnt sich, die System Error Codes durchzuschauen, wenn man mit der Win32 API zu tun hat.

Die sagen in diesem Fall:
Zitat:

ERROR_DEVICE_ALREADY_REMEMBERED
1202 (0x4B2)
The local device name has a remembered connection to another network resource.
Grüße
Dalai

dataspider 7. Jan 2020 21:39

AW: WNetAddConnection2 under Win Server 2016
 
Vielen Dank Chris und Dalai

Mir ist auch aufgefallen, dass ein auskommentiertes sleep(500) in meinen Sourcen ist.
Ich prüfe natürlich vorher, ob das Laufwerk bereits verbunden ist und trenne dann auch.

Ich werde das Sleep mal wieder aktivieren und morgen testen.
Ich weiß nicht sicher, wie das bei der Windows API abläuft.
Aber er scheint beim Verbinden mit dem Trennen doch noch nicht ganz fertig zu sein.

Frank

dataspider 8. Jan 2020 16:10

AW: WNetAddConnection2 under Win Server 2016
 
Also, meine Tests waren nicht erfolgreich :(

Wie schon erwähnt, prüfe trenne ich die Verbindung mit den folgenden Methoden:

Delphi-Quellcode:
class function TWNet.CancelConnection(ADrive: string; AUpdateProfile: Boolean =
    False): Boolean;
Var
  AResult: Cardinal;
  dwFlags: DWORD;
begin
  if AUpdateProfile then
    dwFlags := CONNECT_UPDATE_PROFILE
  else
    dwFlags := 0;
  AResult := WNetCancelConnection2(PChar(ADrive), dwFlags, True);
  Result := (AResult = NO_ERROR);
  if not Result then
    raise Exception.Create('Fehler beim Trennen Netzlaufwerk ' + ADrive +
        sLineBreak + 'Code: ' + IntToStr(AResult));
end;

class function TWNet.GetConnection(const ADrive: string): string;
var
  Buff: array [0..255] of Char;
  Size  : Cardinal;
begin
  Size := SizeOf(Buff);
  if(NO_ERROR = WNetGetConnection(PChar(ADrive), Buff, Size))then
    Result := Buff;
 end;

Trenne ich mit TWNet.CancelConnection...
...liefert mir TWNet.GetConnection einen Leeren String.

Dennoch erhalte ich bei TWNet.AddConnection weiterhin den Code 1202, als wäre die Verbindung noch aktiv.
Bei mir funktioniert es, allerdings bin ich als Admin angemeldet.
Beim normalen Anwender kommt halt besagte Fehlermeldung.

Ich werde wohl mal an den Rechten drehen müssen...

Frank

Dalai 8. Jan 2020 16:16

AW: WNetAddConnection2 under Win Server 2016
 
Äh, Netzlaufwerke sind schon immer nutzerspezifisch, d.h. jeder Benutzer hat seine eigenen Netzlaufwerke. Von daher ist es logisch, dass die Fehlermeldung nur beim Benutzer erscheint. An den Nutzer-/Zugriffsrechten rumzudrehen, sollte nur der allerletzte Ausweg sein!

Grüße
Dalai

dataspider 9. Jan 2020 10:17

AW: WNetAddConnection2 under Win Server 2016
 
Liste der Anhänge anzeigen (Anzahl: 1)
Falls doch mal jemand unter Citrix das gleiche Problem hat...

Es liegt scheinbar an Citrix.

Ich habe den Anwender in einer Citrix-Sesssion mal den Path im Explorer eintagen lassen und er bekam die Meldung siehe Anhang.
Diese Meldung wird beim Mappen im Code unterdrückt.

Jetzt sind unsere Citrix - Profis dran.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 Uhr.

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