Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Lokal am Computer angemeldet, oder an Domäne? (https://www.delphipraxis.net/121401-lokal-am-computer-angemeldet-oder-domaene.html)

Guido Eisenbeis 26. Sep 2008 19:30


Lokal am Computer angemeldet, oder an Domäne?
 
Hallo.

Nachdem ich nun das halbe Internet runtergeladen und gelesen habe, ist zwar mein Wissen, aber auch mein Kopf angeschwollen, von der Komplexität des Themas.

Grundsätzlich geht es um Benutzerrechte, bezogen auf die Anmeldung als Admin, Standardnutzer oder eingeschränkter Nutzer. Das Ganze dann noch sowohl lokal am PC, als auch in einer Domäne.

Ich habe mich nun recht intensiv mit diesen Dingen beschäftigt und bin nun an einem Punkt, wo ich eure Hilfe brauche. (Weil ich sonst noch durchdrehe.) :cyclops:

Mein Problem: Wie kann ich ermitteln, ob ein Programm im Kontext eines lokalen Benutzers oder eines Domänennutzers läuft?

Hintergrund ist eine RunAsAdmin-Applikation, bei der ich am Anfang die Daten eines Benutzers auslese. Diese Daten sind der User-Name und die "Domain". Bei der Domain kann es dann eine echte Netzwerkdomäne sein, oder es wird der Computername ausgelesen. Es gibt nun zwei RadioButtons: einen für "Local" und einen für "Domain". Nun würde ich gerne den richtigen RadioButton vorbelegen.

Dazu müsste ich aber wissen, ob der ermittelte User lokal oder an einer Domäne angemeldet ist. Da es nun einen Benutzer(-Namen) sowohl lokal als auch in der Domäne geben kann (z. B. "Administrator") ist das schon mal eine Hürde. Die weitaus größere Hürde ist jedoch, dass ein Computername genauso lauten kann, wie ein Domänenname (oder?).

Wie kann ich also zuverlässig ermitteln, ob z. B. gerade der lokale oder der Domänen-Administrator mein Programm ausführt?

Guido.

Edit: Schreibfehler korrigiert.

Luckie 26. Sep 2008 21:20

Re: Lokal am Computer angemeldet, oder an Domäne?
 
Guck, ob der Logon Server der lokale Computer ist oder der Domainserver. Siehe dazu mein Programm LoggedOn: http://www.michael-puff.de/Artikel/LoggedOn.shtml

Guido Eisenbeis 27. Sep 2008 13:45

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

ich hatte schon auf eine Antwort von dir gehofft, da in ich-weiß-nicht-wieviel-Prozent aller Themen, Tipps und Codes dein Name aufgetaucht ist. (Unter anderem auch "Impersonate" und "RunAsUser", das allerdings nur noch erwähnt, aber nirgends als Code zu finden ist. Weder auf deiner Seite, noch über Download-Links.)

Deinen Code von LoggedOn habe ich mir kurz angesehen. Der Code ist recht umfangreich. Vielleicht kannst du mir ein wenig Sucherei ersparen und mir die relevanten Stellen nennen, die es ermöglichen zu ermitteln, ob der Nutzer lokal oder an einer Domäne angemeldet ist. Bei LoggedOn scheint es umgekehrt zu sein: Dort muss man erst angeben, ob am lokalen PC oder in einer Domäne gescannt werden soll. Das hilft mir leider nicht weiter. Vielleicht kannst du da ein wenig Licht in die Sache bringen. :)

Guido.

Union 27. Sep 2008 15:11

Re: Lokal am Computer angemeldet, oder an Domäne?
 
Sehr einfach gehts mit:
Delphi-Quellcode:
GetEnvironmentVariable('USERDNSDOMAIN');
Ist das Ergebis leer, dann handelt es sich um eine lokale Anmeldung.

Guido Eisenbeis 27. Sep 2008 17:44

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

was ich nicht zu hoffen wagte, ist nun eingetreten: Eine einfache Lösung, die auch zu funktionieren scheint! :hello:

Weißt du auf welche Win-Versionen das beschränkt ist, oder wo ich das erfahren kann? Ausreichen würde es, wenn es funktioniert ab Win2000 und später, also: Win2000 Prof, WinXP Home, Prof, Vista (evtl. alle), und Win200x Server (Hab ich eine vergessen? :gruebel: ).

Ansonsten vielen Dank! Geniale Lösung!

Guido.




____________________________________________
Wo der Gewinn am höchsten, da ist das Recht.
(Leider nur zu wahr!)

Luckie 27. Sep 2008 22:35

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

Zitat von Guido Eisenbeis
Hallo Michael,

ich hatte schon auf eine Antwort von dir gehofft, da in ich-weiß-nicht-wieviel-Prozent aller Themen, Tipps und Codes dein Name aufgetaucht ist. (Unter anderem auch "Impersonate" und "RunAsUser", das allerdings nur noch erwähnt, aber nirgends als Code zu finden ist. Weder auf deiner Seite, noch über Download-Links.)

Das hat nichts zu sagen, ich weiß auch viles nicht und das ist bisher noch wesentlich mehr, als dass ich weiß. ;) Und Beides, den Artikel und das Demo zu Impersonate gibt es noch auf meiner Homepage und auch RunAsUser:
Impersinate Artikel und Demo: http://www.michael-puff.de/Artikel/Impersonate.shtml
RunAsUser: http://www.michael-puff.de/Developer/Delphi/Programme/
Es überkommt mich eben nur manchmal und dann baue ich meiner Seite um.

Zitat:

Deinen Code von LoggedOn habe ich mir kurz angesehen. Der Code ist recht umfangreich.
Länger angucken. ;) Ist eigentlich alles hübsch in Klassen verpackt. Die entscheidende Funktion ist MSDN-Library durchsuchenNetWkstaUserEnum*. Auf die Umgebungsvariable würde ich mich nicht unbedingt verlassen. EWahrscheinlich gewinnt man eher im Lotto, als dass sie nicht vorhanden ist, aber man weiß ja nie.

*) Warum wird die Funktion jetzt nicht gefunden? :roll: Hat wahrscheinlich hiermit zu tun: http://www.delphipraxis.net/viewtopi...=946815#946815

Guido Eisenbeis 27. Sep 2008 23:14

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

Zitat von Luckie
Länger angucken. ;) Ist eigentlich alles hübsch in Klassen verpackt. Die entscheidende Funktion ist MSDN-Library durchsuchenNetWkstaUserEnum*.

Habs mir länger angeguckt. :wink: Leider kann ich nicht die Antwort auf meine Frage finden. So wie ich das verstanden habe, braucht auch NetWkstaUserEnum die Angabe des Server(-Namens), um dann die User aufzulisten.

Ich brauche aber das "Gegenteil": "Domäne"*, UserName und Passwort habe ich. Ich will nun wissen, ob die "Domäne" eine Netzwerk-Domäne ist oder ein lokaler Wert*.

* "Domäne" enthält entweder den Namen der Netzwerk-Domäne oder den Namen des Computers / der Arbeitsgruppe.

Guido.

Luckie 27. Sep 2008 23:17

Re: Lokal am Computer angemeldet, oder an Domäne?
 
Ich gebe auch nur die Domain an in meinem Programm.

Guido Eisenbeis 27. Sep 2008 23:21

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

Zitat von Luckie
Ich gebe auch nur die Domain an in meinem Programm.

Wie hilft mir das?

RWarnecke 27. Sep 2008 23:25

Re: Lokal am Computer angemeldet, oder an Domäne?
 
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.

Guido Eisenbeis 27. Sep 2008 23:39

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

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?

Guido Eisenbeis 28. Sep 2008 02:49

Re: Lokal am Computer angemeldet, oder an Domäne?
 
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.DLL' Name '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;

p80286 30. Sep 2008 13:37

Re: Lokal am Computer angemeldet, oder an Domäne?
 
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

nahpets 30. Sep 2008 13:55

Re: Lokal am Computer angemeldet, oder an Domäne?
 
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

Guido Eisenbeis 30. Sep 2008 22:01

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

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:

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:

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.

nahpets 1. Okt 2008 10:53

Re: Lokal am Computer angemeldet, oder an Domäne?
 
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

p80286 1. Okt 2008 11:24

Re: Lokal am Computer angemeldet, oder an Domäne?
 
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

Union 1. Okt 2008 11:38

Re: Lokal am Computer angemeldet, oder an Domäne?
 
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.
Delphi-Quellcode:
ShowMessage(RunningOnServerOrWorkstation(GetEnvironmentVariable('LOGONSERVER')));

Guido Eisenbeis 2. Okt 2008 11:54

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

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:

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:

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!? :gruebel: 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.

Union 2. Okt 2008 12:13

Re: Lokal am Computer angemeldet, oder an Domäne?
 
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:
Delphi-Quellcode:
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.

Guido Eisenbeis 2. Okt 2008 12:22

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

Zitat von Union
Zitat:

Einerseits wird das für jeden Prozess auf jeden Fall gesetzt. Auf der anderen Seite kann natürlich jeder Prozess auch sein Environment ändern.

Heißt das, dass es im Prozess meines Programmes zuverlässig ist, solange mein Programm die Umgebungs-Variable nicht selbst ändert? Oder kann das von außen, also von einem anderen Programm geändert werden?

Guido

Union 2. Okt 2008 12:30

Re: Lokal am Computer angemeldet, oder an Domäne?
 
Jeder Prozess erhält eine Kopie des System-Environments. Wenn man ein Delphi Programm schreibt und die obige Funktion ausführt, und dann ein weiteres Programm startet das die Variable ausgibt, ist sie unverändert. Kann man auch über cmd testen. Ob es nicht doch die Möglichkeit gibt, irgendwie auf den (fremden) Processspeicher zuzgreifen, entzeiht sich meiner Kenntnis.

nahpets 2. Okt 2008 12:35

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

Zitat von Guido Eisenbeis
Heißt das, dass es im Prozess meines Programmes zuverlässig ist, solange mein Programm die Umgebungs-Variable nicht selbst ändert? Oder kann das von außen, also von einem anderen Programm geändert werden?

theoretisch könnte Dein Programm über eine Batch aufgerufen werden, die vorher die Umgebungsvariabeln "umschießt".

Schau doch bitte mal in der Registry unter
Code:
HKEY_CURRENT_USER\Volatile Environment
Dort findest Du einen Eintrag LOGONSERVER und einen Eintrag USERDNSDOMAIN.

Wenn die sich, abhängig von der Anmeldung, unterscheiden, könnte das für Dich eine Alternative sein.

Jetzt komme mir bitte keiner uns sage:

Wenn Du das Programm per Batch aufrufst, kannst Du dort die Einträge vor dem Programmaufruf ändern.

Habe es ausprobiert, Änderung ist möglich.

Guido Eisenbeis 2. Okt 2008 12:58

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

Zitat von Union
Jeder Prozess erhält eine Kopie des System-Environments.

Das verstehe ich nun so, dass eine Enviroment-Varibable im System-Enviroment NICHT geändert wird, wenn in meinem oder einem anderen Programm diese Variable geändert wird, da dieses Programm mit seiner eigenen Kopie der Enviroment-Variablen arbeitet. Ist das richtig?


Zitat:

Zitat von nahpets
Schau doch bitte mal in der Registry unter
Code:
HKEY_CURRENT_USER\Volatile Environment
Dort findest Du einen Eintrag LOGONSERVER und einen Eintrag USERDNSDOMAIN.

Ich habe in der Registry den Wert für 'LOGONSERVER' geändert und dann sowohl mit Delphi als auch in der DOS-Konsole überprüft. Weder in Delphi noch in der Konsole hat sich der Wert geändert! Das würde doch die oben stehende Aussage bestätigen, dass das System-Enviroment unverändert bleibt, sogar wenn der oben genannte Registry-Eintrag geändert wird?

Guido.

nahpets 2. Okt 2008 13:23

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

Zitat von Guido Eisenbeis
Ich habe in der Registry den Wert für 'LOGONSERVER' geändert und dann sowohl mit Delphi als auch in der DOS-Konsole überprüft. Weder in Delphi noch in der Konsole hat sich der Wert geändert! Das würde doch die oben stehende Aussage bestätigen, dass das System-Enviroment unverändert bleibt, sogar wenn der oben genannte Registry-Eintrag geändert wird?

Nein, nein, Missverständnis:
Eine Änderung der Registry führt nicht zu einer Änderung der Umgebungsvariabeln und umgekehrt, was ich sagen wollte ist:
Den Wert in der Registry kannst Du genauso manipulieren, wie den Wert der Umgebungsvariabeln. D. h.: Zu Laufzeit Deines Programmes hast Du keine 100%ige Sicherheit, dass die Umgebungsvariabeln noch den ursprünglichen Wert enthalten, ebenso könnte jemand die Einträge in der Registry geändert haben. Beides ginge am Einfachsten durch Aufruf Deines Programmes per Batch, mit vorheriger Manipulation innerhalb des Batchs. Die Batchdatei bekommt beim Ausführen ihre eigene Umgebung, kann dann damit "machen was sie will" und die so veränderte Umgebung ist dann das System-Enviroment für Dein Progamm. Neben LOGONSERVER könnte ja auch PATH geändert werden, aber deshalb suchen wir in unseren Programmen nicht danach, ob es noch eine andere Möglichkeit gibt, an den Suchpfad zu kommen.
Änderungen der Registry aus einem Batch könnten dann eher dauerhaft sein (bis zum Neustart des Systems?).

Zugegeben halte ich die Diskussion für eher akademisch.

An einem normalen System solltest Du Dich sowohl auf die Umgebungsvariabeln, als auch auf die Einträge in der Registry verlassen können. Andernfalls müsste "jemand" hergehen und bewußt diese Einträge ändern, um Dir bei Deinem Programm Probleme "zubeschaffen".

Bei meiner Arbeit als Administrator käme ich bei meinen eigenen Systemen nicht auf die Idee, hier eine Manipulation zu erwarten, wer da was manipulieren will, sucht sich sicherlich nicht ganz so banale Dinge.

Guido Eisenbeis 2. Okt 2008 13:39

Re: Lokal am Computer angemeldet, oder an Domäne?
 
Ich habe gerade meinen PC neugestartet. Der von mir veränderte Eintrag in der Registry wurde automatisch zurückgesetzt.

Zitat:

Zitat von nahpets
An einem normalen System solltest Du Dich sowohl auf die Umgebungsvariabeln, als auch auf die Einträge in der Registry verlassen können. Andernfalls müsste "jemand" hergehen und bewußt diese Einträge ändern, um Dir bei Deinem Programm Probleme "zubeschaffen".

Somit sehe ich nun die Umgebungs-Variablen als ausreichend sicher an! (Es sei denn, jemand würde das Gegenteil konkret beweisen.)

Unter "Ausreichen sicher" verstehe ich, dass die Umgebungs-Variablen ohne mehr oder weniger aufwendige Manipulation zuverlässige Werte beinhalten.

Somit verwende ich die von Union in Posting #4 gepostete Lösung.

Vielen Dank an alle Mitwirkenden!

Guido.

nahpets 2. Okt 2008 13:48

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

Zitat von Guido Eisenbeis
Somit sehe ich nun die Umgebungs-Variablen als ausreichend sicher an!

ja!
Zitat:

Zitat von Guido Eisenbeis
Unter "Ausreichen sicher" verstehe ich, dass die Umgebungs-Variablen ohne mehr oder weniger aufwendige Manipulation zuverlässige Werte beinhalten.

ja!

p80286 2. Okt 2008 14:38

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

bei der Suche nach Servern habe ich einwenig mit NetServerEnum herum gespielt.
1) der %LOGONSERVER% taucht in keiner der generierten Listen auf.
2) über die Maske $80000000 sehe ich alle für mich verfügbaren Domänen
3) über die Maske $40000000 sehe ich alle Rechner in meiner näheren Umgebung (Netzsegment?)

Ich hoffe diese Info hilft dem einen oder anderen weiter.

Gruß
K-H

Guido Eisenbeis 2. Okt 2008 14:49

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

Ich habe den Code in Posting #12 nach den hier gewonnenen Erkenntnissen aktualisiert und entsprechende Edit-Hinweise eingefügt. Auf dass es auch anderen hilft. :-D

Guido.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 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