AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Lokal am Computer angemeldet, oder an Domäne?
Thema durchsuchen
Ansicht
Themen-Optionen

Lokal am Computer angemeldet, oder an Domäne?

Ein Thema von Guido Eisenbeis · begonnen am 26. Sep 2008 · letzter Beitrag vom 2. Okt 2008
 
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#12

Re: Lokal am Computer angemeldet, oder an Domäne?

  Alt 28. Sep 2008, 02:49
So, ich habe nun das MSDN-Beispiel NetServerGetInfo in Delhpi übersetzt. Es funktioniert soweit, bis auf den Fehler der scheinbar erzeugt wird, wenn keine Netzwerkverbindung besteht.

Bei mir zu Hause habe ich ich einen PC eingerichtet (per Image von der Arbeit), auf dem sich zwar Domänen-Benutzer befinden, aber ich habe nicht den zugehörigen Server zur Verfügung. Deshalb werden nur die gespeicherten Domänen-Profile benutzt, aber einen Server kann NetServerGetInfo natürlich nicht finden.

Hier mein Code:

Delphi-Quellcode:
uses
  Windows;

type
  PSERVER_INFO_101 = ^SERVER_INFO_101;
  SERVER_INFO_101 = record
    dwPlatformId : integer;
    lpszServerName: LPWSTR;
    dwVersionMajor: integer;
    dwVersionMinor: integer;
    dwType: integer;
    lpszComment: LPWSTR;
 end;

 NET_API_STATUS = DWORD;

 function NetServerGetInfo(ServerName: PWideChar; Level: Integer;
  var bufptr: PSERVER_INFO_101): NET_API_STATUS; stdcall;
  external 'NETAPI32.DLLName 'NetServerGetInfo';

function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall;
  external 'netapi32.dll';


// Routine zum Ermitteln, ob dieses Programm unter einem Domänen- oder
// einem lokalen Benutzer ausgeführt wird.
// ServerName muss mit \\ beginnen.
// Ist ServerName leer, wird der lokale Computer benutzt.
// Wird ein ungültiger ServerName angegeben, oder ist der in ServerName
// angegebene Computer nicht erreichbar, wird eine Fehlermeldung ausgegeben.
function RunningOnServerOrWorkstation(const sServerName: string): string;
const
  NERR_Success = 0;
  SV_TYPE_DOMAIN_CTRL = $00000008; // Primary domain controller
  SV_TYPE_DOMAIN_BAKCTRL = $00000010; // Backup domain controller
  SV_TYPE_SERVER_NT = $00008000; // Windows NT Non-DC server
var
  wServerName: WideString;
  pBuffer: PSERVER_INFO_101;
  dwStatus: NET_API_STATUS;
  asErrorMsg: AnsiString;
begin
  pBuffer := nil;
  wServerName := sServerName;
  dwStatus := NetServerGetInfo(PWideChar(wServerName), 101, pBuffer);

  if dwStatus = NERR_Success then
  begin
    // Check for the type of server.
    if (Bool(pBuffer.dwType and SV_TYPE_DOMAIN_CTRL)
      or Bool(pBuffer.dwType and SV_TYPE_DOMAIN_BAKCTRL)
      or Bool(pBuffer.dwType and SV_TYPE_SERVER_NT)) then
      Result := 'This is a server'
    else
      Result := 'This is a workstation';
  end
  else
  begin
    // Return a formatted error-message.
    SetLength(asErrorMsg, 1024);
    SetLength(asErrorMsg, FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
      or FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, dwStatus, 0,
      @asErrorMsg[1], Length(asErrorMsg) + 1, nil));
    Result := asErrorMsg;
  end;

  if (pBuffer <> nil) then
    NetAPIBufferFree(pBuffer)
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(RunningOnServerOrWorkstation(GetEnvironmentVariable('USERDOMAIN')));
end;
Ich würde mich freuen, falls jemand Verbesserungsvorschläge hat, oder testen kann, ob der Code in einer Domäne mit angeschlossenem Netzwerk/Server funktioniert.

Kann man denn mit dieser (oder einer anderen) Routine das Ergebnis auch so ermitteln, dass auch ohne Netzwerkverbindung bestätigt wird, ob es sich um einen Domänen-Benutzer handelt?

Und zu guter Letzt, war das so gedacht mit NetServerGetInfo und Luckies TLoggedOnUser, oder gibt es noch eine andere Möglichkeit?

Guido.


Edit:
Variable "sDomain" durch "sServerName" ersetzt.
Kommentar zur "RunningOnServerOrWorkstation"-Routine aktualisiert.

Die folgenden Postings beziehen sich alle auf den obigen Aufruf in Button1Click und nicht auf den folgenden Beispiel-Aufruf.

Hier nur ein Beispiel-Aufruf zu Test-Zwecken:


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sServerName: string;
begin
  sServerName := InputBox('Server-Name', 'Server-Name eingeben:' + #13#10
    + #13#10 + '(Muss mit \\ beginnen,'
    + #13#10 + ' oder leer lassen für aktuellen Computer.)',
    GetEnvironmentVariable('LOGONSERVER'));
  ShowMessage(RunningOnServerOrWorkstation(sServerName));
end;
  Mit Zitat antworten Zitat
 


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 06:06 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