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
Antwort Antwort
Seite 2 von 3     12 3      
Guido Eisenbeis

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

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

  Alt 28. Sep 2008, 00:39
Zitat von RWarnecke:
Der Befehl NetServerGetInfo sollte Dir weiterhelfen. Damit kannst Du die Arbeitsgruppe oder die Domain ermitteln.

Edit: Die Klasse TLoggedOnUser ist für Dein vorhaben genau die richtige von Michaels Programm LoggedOn Programm.
Also ich stehe scheinbar auf dem Schlauch. Nochmal in Kurzform:

Ich habe: Den Namen entweder von Domäne oder von Arbeitsgruppe/Computer.
Ich brauche: Ist dieser Name nun von einer Domäne oder einer Arbeitsgruppe/Computer.

Wie kann ich das mit NetServerGetInfo oder Luckies TLoggedOnUser ermitteln?
  Mit Zitat antworten Zitat
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, 03: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
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#13

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

  Alt 30. Sep 2008, 14:37
Hallo Guido,

so richtig funktionieren kann Dein Code nicht, da Du den Domainennamen übergibst und nicht den Namen eines Servers.
Ich hab Deinen Code ausprobiert und bin auf "Netzwerk nicht gefunden" gekommen. Und mein Rechner arbeitet garantiert im Netz.
Ich hab versucht über NetServerEnum die bekannten Server zu finden, tue mich aber mit der Parameterübergabe etwas schwer.

Gruß
K-H
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#14

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

  Alt 30. Sep 2008, 14:55
Hallo,

bin als Domänenbenutzer an meinem Rechner angemeldet und habe ausprobiert:

Delphi-Quellcode:
ShowMessage(RunningOnServerOrWorkstation(GetEnvironmentVariable('USERDOMAIN')));
ShowMessage(RunningOnServerOrWorkstation(GetEnvironmentVariable('USERDNSDOMAIN')));
Das erste ShowMessage liefert mir "Der Netzwerkpfad wurde nicht gefunden."
Das zweite ShowMessage liefert mir "This is a Server."

Das kannst Du auch auf der Dosebene per Ping prüfen:

Delphi-Quellcode:
ping %USERDNSDOMAIN%
ping %USERDOMAIN%
Erste Variante liefert Dir die IP des Domänservers, zweite variante kann Host nicht finden.

Stephan
  Mit Zitat antworten Zitat
Guido Eisenbeis

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

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

  Alt 30. Sep 2008, 23:01
Zitat von p80286:
so richtig funktionieren kann Dein Code nicht, da Du den Domainennamen übergibst und nicht den Namen eines Servers.
Ich hab Deinen Code ausprobiert und bin auf "Netzwerk nicht gefunden" gekommen. Und mein Rechner arbeitet garantiert im Netz.
Hallo K-H,

das erklärt natürlich einiges! Vorallem auch die Fehlermeldung, die bei meinem Test erschien. Ist die selbe wie bei dir. Danke für den Test!

Zitat von p80286:
Ich hab versucht über NetServerEnum die bekannten Server zu finden, tue mich aber mit der Parameterübergabe etwas schwer.
Hab jetzt auch Tests durchgeführt mit anderem Code. Das hat jedoch auch nicht anderes ergeben. Das heißt, hier sind dann Luckie und Rolf Warnecke gefragt, die scheinbar den Code in TLoggedOnUser für eine brauchbare Lösung halten. Ich bin jedoch nicht in der Lage, diese zu erkennen. Deshalb die Bitte an euch, mir zu sagen wie's geht.

Zitat von nahpets:
bin als Domänenbenutzer an meinem Rechner angemeldet und habe ausprobiert:

Delphi-Quellcode:
ShowMessage(RunningOnServerOrWorkstation(GetEnvironmentVariable('USERDOMAIN')));
ShowMessage(RunningOnServerOrWorkstation(GetEnvironmentVariable('USERDNSDOMAIN')));
Das erste ShowMessage liefert mir "Der Netzwerkpfad wurde nicht gefunden."
Das zweite ShowMessage liefert mir "This is a Server."

Das kannst Du auch auf der Dosebene per Ping prüfen:

Delphi-Quellcode:
ping %USERDNSDOMAIN%
ping %USERDOMAIN%
Erste Variante liefert Dir die IP des Domänservers, zweite variante kann Host nicht finden.
Hallo Stephan,

auch dir danke für den Test! Das sieht jetzt so aus, als ob der Code so funktionieren würde (wenn das Netzwerk angeschlossen ist). Widerspricht allerdings dem Test von K-H. Ist bei euch beiden ein Netzwerk angeschlossen? Heißt der Server gleich oder unterschiedlich wie die Domain? Woran könnte es sonst liegen und wie lässt sich das lösen?

Falls sich da nichts ergibt, nehme ich die Lösung von Union mit GetEnvironmentVariable('USERDNSDOMAIN')!

Freue mich auf eure Anregungen.

Guido.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#16

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

  Alt 1. Okt 2008, 11:53
Hallo,

Zitat:
Ist bei euch beiden ein Netzwerk angeschlossen? Heißt der Server gleich oder unterschiedlich wie die Domain? Woran könnte es sonst liegen und wie lässt sich das lösen?
Mein Rechner ist immer im Netz, es sei denn, ich ziehe explizit das Kabel.
Unser Server hat weder den in %USERDOMAIN% noch den in %USERDNSDOMAIN% enthaltenen Namen.
Was unser "Ober-Admin" da jetzt genau wie konfiguriert hat, kann ich nicht sagen.

Wie Du nun definitiv den lokalen vom Domain-Admin unterscheiden kannst, kann ich nicht sagen.
Eventuell kann Dir bei www.administrator.de helfen.

Stephan

PS:
Was steht bei Dir, abhängig von der Anmeldung, denn in %LOGONSERVER%?
http://www.schlotsoft.de/coder/vb/getlogonserver.htm
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#17

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

  Alt 1. Okt 2008, 12:24
Hallo zusammen,

ich habe in der Zwischenzeit ein wenig weiter bosseln können:
Wenn bei
RunningOnServerOrWorkstation(Servernamen)
Servernamen ein im Netz gültiger Name ist, und der Rechner nicht erreichbar ist, dann kommt "Netzwerkpfad nicht gefunden".
Ist der Rechner erreichbar, dann funktioniert auch die Server/Workstation-Erkennung.

Zitat:
PS:
Was steht bei Dir, abhängig von der Anmeldung, denn in %LOGONSERVER%?
Das isses!
Zumindestens bei mir funktioniert das (wenn ich im Netz bin und ohne führende \\).
Die Gegenprobe steht noch aus.

Gruß
K-H
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#18

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

  Alt 1. Okt 2008, 12:38
Du darfst auf keinen Fall den Servernamen aus dem Domainnamen holen. Die sind normalerweise immer unterschiedlich. Den Servernamen erhältst Du über die Environment Variable LOGONSERVER.
ShowMessage(RunningOnServerOrWorkstation(GetEnvironmentVariable('LOGONSERVER')));
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Guido Eisenbeis

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

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

  Alt 2. Okt 2008, 12:54
Zitat von nahpets:
Unser Server hat weder den in %USERDOMAIN% noch den in %USERDNSDOMAIN% enthaltenen Namen.

...

Was steht bei Dir, abhängig von der Anmeldung, denn in %LOGONSERVER%?
@Stephan,
danke für den Test!

In %LOGONSERVER% steht bei mir:

Workstation OHNE Domain, lokal angemeldet: \\ComputerName
Workstation MIT Domain, lokal angemeldet: Nix
Workstation MIT Domain, in Domain angemeldet: \\ServerName*

* Obwohl bei mir zu Hause kein Server angeschlossen ist.


Zitat von Union:
Du darfst auf keinen Fall den Servernamen aus dem Domainnamen holen. Die sind normalerweise immer unterschiedlich. Den Servernamen erhältst Du über die Environment Variable LOGONSERVER.
@Union

Danke für die Info. Das ergibt auch Sinn, entsprechend unserer Tests (siehe oben).

Deine Lösung mit 'USERDNSDOMAIN' funktioniert scheinbar einwandfrei (siehe Posting #4). Dennoch haben DP-User in diesem Thread darauf hingewiesen, dass Umgebungs-Variablen unzuverlässig seien. Deshalb tue ich mir auch die Mühe an, einen anderen Weg zu finden.

Wie siehst du das denn mit der Zuverlässigkeit von Umgebungs-Variablen?


Zitat von p80286:
Wenn bei RunningOnServerOrWorkstation(Servernamen) Servernamen ein im Netz gültiger Name ist, und der Rechner nicht erreichbar ist, dann kommt "Netzwerkpfad nicht gefunden".
Ist der Rechner erreichbar, dann funktioniert auch die Server/Workstation-Erkennung.
@K-H
Das deckt sich mit den anderen Tests. Das würde doch bedeuten, dass die Erkennung in dem Code funktioniert!? Wenn man eine boolsche Abfrage auf "IsWorkstation" macht, dann würde das Ergebnis doch zuverlässig sein, oder nicht!?

Edit: Wenn man aber dann mit diesem Code dennoch auf die Umgebungs-Variable 'LOGONSERVER' zugreifen muss, dann kann man doch gleich die Lösung von Union nehmen!? Oder bekommt man den 'LOGONSERVER' auch ohne Umgebungs-Variablen? Ich habs schon mit Code probiert, der den Namen des DoainControllers ermittelt. Der funktioniert aber nur, wenn die Netzwerkverbindung zum DomainController besteht.

Wer ist denn überhaupt der Meinung, dass die Umgebungs-Variablen unzuverlässig sind, und warum?

Guido.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#20

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

  Alt 2. Okt 2008, 13:13
Zitat:
Wie siehst du das denn mit der Zuverlässigkeit von Umgebungs-Variablen?
Das ist ein zweischenidiges Schwert: Einerseits wird das für jeden Prozess auf jeden Fall gesetzt. Auf der anderen Seite kann natürlich jeder Prozess auch sein Environment ändern. Theoretisch könntest Du in Deinem Programm ja auch eine Zeile haben wie:
SetEnvironmentVariable(pchar('LOGONSERVER'), pchar('MS1.MICOROSOFT.COM')) Zulässig sind sie auf jeden Fall und werden ja auch von vielen Programmen z.b. zur Konfiguration genutzt. Sie sind aber nicht gegen unbefugten Schreibzugriff geschützt.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 19:10 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