![]() |
Feststellen, ob Benutzer angemeldet ist
Ich programmiere gerade einen Dienst für Windows 2000, der bestimmte Sachen nur ausführen soll, wenn ein Benutzer angemeldet ist.
Wie kann ich feststellen, ob ein Benutzer angemeldet ist? (Der Benutzername ist mir nicht wichtig) |
Re: Feststellen, ob Benutzer angemeldet ist
Hat denn keiner eine Idee? Es muß doch einen Befehl bzw. eine Prozedur dafür geben :-D
|
Re: Feststellen, ob Benutzer angemeldet ist
Zitat:
Dies würde doch leicht gehen mit dem Benutzernamen ![]() |
Re: Feststellen, ob Benutzer angemeldet ist
und wie sieht der benutzername aus, wenn keiner angemeldet ist? '', also nicht, funktioniert nicht, das habe ich schon probiert. :-D
|
Re: Feststellen, ob Benutzer angemeldet ist
Lass es dir doch einfach irgendwie ausgeben, dann siehst du es doch ;)
|
Re: Feststellen, ob Benutzer angemeldet ist
Guck mal bei
![]() |
Re: Feststellen, ob Benutzer angemeldet ist
Moin Rainer,
schau Dir doch mal die API ![]() Wenn ich mich nicht sehr irre, dürfte kein interaktiver Benutzer angemeldet sein, wenn keine WinSta0 dabei ist. Oder anders formuliert: Existiert WinSta0 ist ein interaktiver Benutzer angemeldet. |
Re: Feststellen, ob Benutzer angemeldet ist
Ich benutze im Moment folgende Funktion:
Delphi-Quellcode:
Welchen Wert hat der String, wenn kein User angemeldet ist?
function GetUsername: String;
var Buffer: array[0..255] of Char; Size: DWord; begin Size := SizeOf(Buffer); if not Windows.GetUserName(Buffer, Size) then RaiseLastOSError; //RaiseLastWin32Error; {Bis D5}; SetString(Result, Buffer, Size - 1); end; |
Re: Feststellen, ob Benutzer angemeldet ist
GetUserName holt sich den Usernamen aus dem Token des aktuellen Prozesses - sprich du bekommst den Benutzernamen des Kontos unter dem dein Programm läuft..!
Ich würde auf LsaEnumerateLogonSessions + LsaGetLogonSessionData zurückgreifen - funktioniert entgegen PSDK auch schon unter Win2k... |
Re: Feststellen, ob Benutzer angemeldet ist
Mein Programm ist ein Service: Er läuft also immer (wenn Windows gebootet hat).
Und jetzt soll das Programm einfach nur erfahren können, ob ein Benutzer angemeldet ist oder nicht. Deswegen frage ich nach dem Wert, den GetUserName hat, wenn keiner angemeldet ist. |
Re: Feststellen, ob Benutzer angemeldet ist
könntest du dir nicht einfach alle prozesse auflisten lassen mit dem dazugehörigen User (also unter welchem user das ganze läuft)? Dann könnntest du unter den usern die sich da ergeben prüfen welches wirkliche user sind und welches System-User sind.
|
Re: Feststellen, ob Benutzer angemeldet ist
Zitat:
Greetz alcaeus |
Re: Feststellen, ob Benutzer angemeldet ist
Äh.. hallo?? Hit me, kill me, but don't ignore me!! ;)
Ich hab doch schon geschrieben: Zitat:
Deswegen hab ich dir auch schon die zwei API-Funktionen ![]() ![]() |
Re: Feststellen, ob Benutzer angemeldet ist
nur wie binde ich diese Befehle von Windows in Delphi ein? Ich habe in dem Bereich keinerlei Erfahrung! :(
|
Re: Feststellen, ob Benutzer angemeldet ist
Ja, die Delphi-Units enhalten leider keine Übersetzungen der benötigten Header-Files. Aber zum Glück gibt es ja die Übersetzungen von Marcel van Brakel welche man hier findet:
![]() |
Re: Feststellen, ob Benutzer angemeldet ist
Danke für deinen Tip, wie benutze ich denn die Komponenten?
Bzw. gibt es eine Hilfe, in der die Funktionen erklärt sind? Oder kann mir einer, das wär total nett :bounce2: :bounce2: :bounce2: , einen Codeschnipsel senden, mit dem mein Programm (ein System Service) den aktuellen UserName herausfindet bzw. einen bestimmten Wert liefert, wenn alle User abgemeldet sind? Viele Grüße, Rainer |
Re: Feststellen, ob Benutzer angemeldet ist
Wenn es hilft:
Ich brauche diesen Code, weil Win2000, wenn ich EWX_LOGOFF von meinem Service aus sende, sich abmeldet. Wenn der User abgemeldet ist und EWX_LOGOFF nochmal gesendet wird (weil ein Netzwerkbefehl kommt), dann fährt sich Win2000 Pro herunter. Deswegen bräuchte ich eine Funktion, mit der der Service nachgucken kann, ob sich der User bereits abgemeldet hat bzw. noch im Abmeldevorgang ist. |
Re: Feststellen, ob Benutzer angemeldet ist
In der JwaNtSecApi.pas habe ich jetzt folgende Funktion gefunden:
Delphi-Quellcode:
Allerdings weiß ich so erstmal damit nichts anzufangen, weil es so viele Parameter gibt und das Ergebnis auch kein Datentyp ist, mit dem ich was anfangen kann.
function LsaLogonUser(LsaHandle: HANDLE; const OriginName: LSA_STRING;
LogonType: SECURITY_LOGON_TYPE; AuthenticationPackage: ULONG; AuthenticationInformation: PVOID; AuthenticationInformationLength: ULONG; LocalGroups: PTOKEN_GROUPS; SourceContext: PTOKEN_SOURCE; var ProfileBuffer: PVOID; var ProfileBufferLength: ULONG; var LogonId: LUID; var Token: HANDLE; var Quotas: QUOTA_LIMITS; var SubStatus: NTSTATUS): NTSTATUS; stdcall; Weiß einer, wie man die o.g. Prozedur aufruft? |
Re: Feststellen, ob Benutzer angemeldet ist
Beschäftige mich immer noch mit dem leidigen Thema, da bis jetzt nichts meinen Erwartungen entspricht bzw. manche Prozeduren einfach nur unüberschaubar sind.
Kennt keiner einen Codeschnipsel, der mir sagt, ob definitiv ein Benutzer angemeldet ist (also nicht das Anmeldefenster von 2000/XP mit Benutzername/Passwort angezeigt wird)? Motzi hatte folgendes geschrieben: Zitat:
Delphi-Quellcode:
Wie spreche ich diese Funktion an und wie werte ich aus, ob ein Benutzer angemeldet ist?
function LsaLogonUser(LsaHandle: HANDLE; const OriginName: LSA_STRING;
LogonType: SECURITY_LOGON_TYPE; AuthenticationPackage: ULONG; AuthenticationInformation: PVOID; AuthenticationInformationLength: ULONG; LocalGroups: PTOKEN_GROUPS; SourceContext: PTOKEN_SOURCE; var ProfileBuffer: PVOID; var ProfileBufferLength: ULONG; var LogonId: LUID; var Token: HANDLE; var Quotas: QUOTA_LIMITS; var SubStatus: NTSTATUS): NTSTATUS; stdcall; Puuh :duck: hatte mir das gar nicht so kompliziert vorgestellt, zu erfahren, ob ein Benutzer angemeldet ist. Bin für jede Hilfe sehr dankbar! :bounce2: |
Re: Feststellen, ob Benutzer angemeldet ist
Man kann auch einfach die WinStats enumerieren und gucken, ob eine WinStat0 dabei ist, das ist die einzige interaktive WinStat die es gibt.
Delphi-Quellcode:
procedure EnumWinStats(WindowsStation: PChar; lParam: LPARAM); stdcall;
begin Form1.ListBox1.Items.Add(WindowsStation); end; procedure TForm1.Button1Click(Sender: TObject); begin EnumWindowStations(@EnumWinStats, 0); end; |
Re: Feststellen, ob Benutzer angemeldet ist
Hallo,
ich schreibe grad ein Programm bei dem ich das gleiche Problem habe. Leider habe ich noch keine Lösung gefunden und die Variante mit der WinStat0 scheint nicht zu funktionieren, zumindest nicht in meinem Netzwerk(Getestet auf einem WinXP Client im AD). Hat einer bereits eine Lösung gefunden, herauszufinden ob auf dem Rechner jemand angemeldet ist? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:05 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