Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Adresse des Domänencontrollers ermitteln (https://www.delphipraxis.net/88292-adresse-des-domaenencontrollers-ermitteln.html)

RolfPolf 13. Mär 2007 11:01


Adresse des Domänencontrollers ermitteln
 
Hallo zusammen!

Eine Statistikanwendung an der ich gerade arbeite soll an beliebigen Arbeitsplätzen im Unternehmens-LAN laufen und ihre Rohdaten aus einer Dateifreigabe auf dem primären Domänencontroller beziehen. Dafür müsste ich jetzt irgendwie die IP oder den Hostnamen des Domänencontrollers(=DHCP, =DNS) an dem die Workstation angemeldet ist herausfinden. Aus der Registry kriege ich es nicht raus, weil da der PDC und DHCP nur Adapterspezifisch vermerkt sind, dann müsste ich immer wissen hinter welchem RegKey sich welcher Adapter verbirgt. Mit "ipconfig" bekäme man das zwar hin, ist aber ziemlich unelegant finde ich. Gibts rgendwie einen einfachen Weg dafür oder muss ich mich mal tiefer mit der Winsock-API beschäftigen?
Danke für Tips,
der Rolf

matashen 13. Mär 2007 11:32

Re: Adresse des Domänencontrollers ermitteln
 
Die Adresse des Rechners kannst du mit dieser Funktionermitteln.

RolfPolf 13. Mär 2007 12:39

Re: Adresse des Domänencontrollers ermitteln
 
Danke, aber das Problem ist nicht die Auflösung des Rechnernamens in eine IP-Adresse sondern die Ermittlung des Rechnernamens des Domaincontrollers an dem der Client angemeldet ist.

GimbaR 13. Mär 2007 16:48

Re: Adresse des Domänencontrollers ermitteln
 
Glücklicherweise stand ich vor einiger Zeit vor dem selben Problem :lol:

Wenn du den PDC (ich glaub bei Windows Server 2003 wird der erste DC genommen, da es imho in dem Sinne keinen primären DC gibt) vom PC, auf dem das Programm läuft, und von der Domäne, in der sich dieser PC befindet, ermitteln willst, reicht ein einfacher aufruf von GetPDC ohne Parameter. Alles weitere sollte man aber im MSDN unter MSDN-Library durchsuchenNetGetDCName finden :)

Delphi-Quellcode:
function GetPDC(Host: WideString = ''; Domain: WideString = ''): String;
var
  pPDC : Pointer;
  Err : Integer;
begin
  // Standard zuweisen
  pPDC:= nil;

  try
    // PDC durch API-Aufruf zuweisen
    Err:= NetGetDCName(PWideChar(Host), PWideChar(Domain), pPDC);

    // PDC auslesen und als Result festlegen
    if (Err = 0) and (pPDC <> nil) then
      Result := PWideChar(pPDC);
  finally
    // Speicher des Pointer freigeben
    NetApiBufferFree(pPDC);
  end;

end;
PS: Ich bin mir nich mehr ganz sicher, aber es kann sein dass diese Funktion ursprünglich aus der DP stammt. Ich hoffe der (eventuell^^) Autor kann mir verzeihen, aber leider weiß ich es nicht mehr genau :duck:

PS2: Hätt ich fast vergessen: Es ist wichtig dass der Computername im Parameter Host mit '\\' beginnt!

RavenIV 14. Mär 2007 09:26

Re: Adresse des Domänencontrollers ermitteln
 
Und was macht diese Funktion, wenn ein Fehler auftritt oder wenn sie keinen PDC gefunden hat?
dann ist nämlich Result undefiniert.
Bekommst Du beim kompilieren keine Warning "Result könnte undefiniert sein" oder so?

Entweder weisst Du Result am Anfang einen Leerstring zu oder machst das bei finally.

GimbaR 14. Mär 2007 15:42

Re: Adresse des Domänencontrollers ermitteln
 
Ehrlich gesagt sieht die Funktion bei mir auch etwas anders aus^^
Delphi-Quellcode:
function GetPDC(Host: WideString = ''; Domain: WideString = ''): TAPIResult;
var
  pPDC: Pointer;
begin
  // Standard zuweisen
  pPDC:= nil;

  try
    // PDC durch API-Aufruf zuweisen
    result.Err:= NetGetDCName(PWideChar(Host), PWideChar(Domain), pPDC);

    // PDC auslesen und als Result festlegen
    if (result.Err = 0) and (pPDC <> nil) then
      result.Text:= PWideChar(pPDC);
  finally
    // Speicher des Pointer freigeben
    NetApiBufferFree(pPDC);
  end;
end;
TAPIResult ist wie folgt deklariert:
Delphi-Quellcode:
type
  TAPIResult = record
    Text: String;
    TextArray: TStringArray;
    Err: HResult;
  end;
Als Programmierer muss ich dann die Eigenschaft Err auswerten und Text oder ggf TextArray auswerten. Da ich hier aber die Funktion vereinfachen wollte (TAPIResult benutzte ich für mich um auf die selbe Weise verwenden zu können; mittlerweile benutze ich diese Vorgehensweise nicht mehr und es ist schon ne weile her seit dem ich den DC ermitteln musste) und ich der Meinung bin, dass ein String von sich aus leer ist, habe ich das ganze nen bissl umgeschrieben.

PS: "leer" im Sinne von
Delphi-Quellcode:
:= '';

RolfPolf 16. Mär 2007 12:02

Re: Adresse des Domänencontrollers ermitteln
 
Danke an euch alle,
das hat mir sehr weiter geholfen. Habe das ganze mit dem emptystr gemacht und im nächsten Schritt die Gültigkeit des Rückgabewertes geprüft.
RolfPolf


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz