AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) WNetAddConnection2 under Win Server 2016

WNetAddConnection2 under Win Server 2016

Ein Thema von dataspider · begonnen am 7. Jan 2020 · letzter Beitrag vom 9. Jan 2020
Antwort Antwort
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.176 Beiträge
 
Delphi 10.3 Rio
 
#1

WNetAddConnection2 under Win Server 2016

  Alt 7. Jan 2020, 16:31
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...

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
Frank Reim
  Mit Zitat antworten Zitat
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
162 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: WNetAddConnection2 under Win Server 2016

  Alt 7. Jan 2020, 17:36
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?
Chris
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.388 Beiträge
 
Delphi 5 Professional
 
#3

AW: WNetAddConnection2 under Win Server 2016

  Alt 7. Jan 2020, 21:20
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
  Mit Zitat antworten Zitat
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.176 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: WNetAddConnection2 under Win Server 2016

  Alt 7. Jan 2020, 22:39
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
Frank Reim
  Mit Zitat antworten Zitat
Frühlingsrolle

Registriert seit: 31. Aug 2019
141 Beiträge
 
#5

AW: WNetAddConnection2 under Win Server 2016

  Alt 8. Jan 2020, 00:41
Ich würde die Funktion ein wenig verbessern, damit auch die Fehlermeldung verständlicher erscheint:
Delphi-Quellcode:
class function TWNet.AddConnection(ADrive, AFolder, AUsername, APassword:
    string; AUpdateProfile: Boolean = False): Boolean;
const
  ERROR_MSG = 'Verbindungsfehler beim Netzlaufwerk: %s\%s%s%s';
var
  NetResource: TNetResource;
  dwFlags: DWORD;
  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};

  AResult := WNetAddConnection2(NetResource, PChar(APassword),
                                PChar(AUsername), dwFlags);
  Result := (AResult = NO_ERROR);
  if not Result then
    raise Exception.CreateFmt(ERROR_MSG, [ADrive, AFolder, sLineBreak,
                              SysErrorMessage(AResult)]);
end;
Mit der Funktion WNetCancelConnection2 solltest du in der Lage sein, die bestehende Verbindung zu trennen.
Politicians are put there to give you the idea you have freedom of choice. You don't. You have no choice. You have owners. They own you. They own everything. They don't want well informed, well educated people capable of critical thinking. (George Denis Patrick Carlin)

Geändert von Frühlingsrolle ( 8. Jan 2020 um 00:48 Uhr)
  Mit Zitat antworten Zitat
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.176 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: WNetAddConnection2 under Win Server 2016

  Alt 8. Jan 2020, 17:10
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
Frank Reim

Geändert von dataspider ( 8. Jan 2020 um 17:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.388 Beiträge
 
Delphi 5 Professional
 
#7

AW: WNetAddConnection2 under Win Server 2016

  Alt 8. Jan 2020, 17:16
Ä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
  Mit Zitat antworten Zitat
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.176 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: WNetAddConnection2 under Win Server 2016

  Alt 9. Jan 2020, 11:17
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.
Miniaturansicht angehängter Grafiken
citrix_meldung.jpg  
Frank Reim
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf