Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Angemeldeten Benutzer aus Dienst ermitteln - Windows 7 (https://www.delphipraxis.net/139886-angemeldeten-benutzer-aus-dienst-ermitteln-windows-7-a.html)

kuba 7. Sep 2009 17:22


Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Hallo,

ich verwende zur Zeit folgenden Code der in diesem Thread ermittelt wurde, um den aktuell angemeldeten Benutzer zu ermitteln:


Delphi-Quellcode:

function GetLUserName : string;
var
  Token : TJWSecurityToken;
begin
  Token := TJwSecurityToken.CreateWTSQueryUserToken();
  try
    try
      Result := Token.TokenOwner.AccountName[''];
      //AddToLog('Username requested: ' + Result);
    except
      on e : Exception do
      begin
        //AddToLog('@GetUsername' + #13#10 + e.Message);
        Result := '';
      end;
      on e : EJWSCLProcessNotFound do
      begin
        //AddToLog('No user is loged on');
        Result := '';
      end;
    end;
  finally
    Token.Free;
  end;
end;
Das funktioniert einwandfrei mit Windows Vista, mit Windows 7 crascht die Routine jedoch.
Kann mir jemand sagen woran das liegt ? Sind meine JEDI's zu alt ?

KUBA

himitsu 7. Sep 2009 17:24

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
was heißt "crascht"?

kuba 7. Sep 2009 17:31

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Der NT-Service steigt (bei Windows 7, und auch bei Windows 2000) direkt nach dem Start wieder aus, mit Systemfehler 1067.
Dass der Code unter Win2000 nicht funktioniert ist ja bekannt, aber dass er in Vista funktioniert und in Windows 7 nicht mehr ist doch seltsam,oder ?

kuba

himitsu 7. Sep 2009 17:40

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
1067 = ERROR_PROCESS_ABORTED = The process terminated unexpectedly.

hmmm, sehr hilfreich

Dann würde ich mal die Log-Funktionen nutzen und schauen was da nicht will.

Wobei bei dieser Funktion eigentlich nicht viel passieren sollte, da die Exceptions ja abgefangen würden ... also würde ich vermuten, daß es an was anderem liegt.

kuba 7. Sep 2009 17:48

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
sicher, Name des fehlerhaften Moduls: KERNELBASE.dll

anscheinend fehlt der Aufruf der Funktion in der DLL, oder sind meine Jedi's vielleicht doch zu alt ?
Habe erst seit ca. 2 Monaten Vista drauf und Teste meinen Code jetzt auch mit der Windows 7 Testversion unter Virtual Box...

Bin schon den halben Tag am googeln was Systemfehler 1067 bedeutet, jetzt weiss ich jedoch dass es an der GetUsername Routine liegt ...

Also, ich hätt schon ne Idee wie es "ordentlich" funktionieren würde. Leider hab ich nicht so den Plan ...
Vielleicht kann mir jemand erklären wie man folgenden Codeschnipsel ändern muss um eine Funktion statt ein Programm aufzurufen.
Kann eigentlich nicht so schwierig sein, komme aber leider nicht selbst drauf ...

Delphi-Quellcode:
 try
        CmdLine := Format('"%s%s" %s',[IncludeTrailingPathDelimiter(PW1),PW2,PW3]);
        FillChar(SI, SizeOf(SI), #0);
        FillChar(PI, SizeOf(PI), #0);
        SI.cb := SizeOf(SI);
        SI.lpDesktop := PChar('WinSta0\Default');
        SI.dwFlags := STARTF_USESHOWWINDOW;
        SI.wShowWindow := SW_SHOWDEFAULT;
        ProcCreated := CreateProcessAsUser(
                            hUserToken,
                            nil,
                            PChar(CmdLine), // pointer to command line string HIER MÖCHTE ICH GERN EINE FUNKTION AUFRUFEN !!!
                            nil,            // pointer to process security attributes
                            nil,            // pointer to thread security attributes
                            True,           // handle inheritance
                            0,              // creation flags
                            nil,            // pointer to new environment block
                            nil,            // pointer to current directory name
                            SI,             // STARTUPINFO
                            PI);            // PROCESS_INFORMATION

        if ProcCreated then
        begin
            CloseHandle(PI.hProcess);
            CloseHandle(PI.hThread);
        end
        else
            ShowMessage('Error ' + SysErrorMessage(GetLastError));
    finally
        CloseHandle(hUserToken);
    end;
diese Funktion möchte ich gern mit o.g. Routine aufrufen:

Delphi-Quellcode:
function GetUserName : string;
var
  Token : TJwSecurityToken;
begin
  Token := TJwSecurityToken.CreateTokenEffective(TOKEN_READ);
  try
    Result := Token.TokenOwner.AccountName[''];
  finally
    Token.Free;
  end;
end;
Die crascht jedenfalls nicht, funktioniert aber nur wenn der angemeldete Benutzer diese ausführt ...

kuba

himitsu 7. Sep 2009 18:05

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Starte mal den Service in deinem Userkontext und nicht als Service,
dann solltest du fehlende Funktionsaufrufe erkennen können (die stehen dann in der Exception)

kuba 7. Sep 2009 18:08

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Zitat:

Zitat von himitsu
Starte mal den Service in deinem Userkontext und nicht als Service,
dann solltest du fehlende Funktionsaufrufe erkennen können (die stehen dann in der Exception)

danke für den Tip, probiers gleich aus - bis später ..

Ich verwende in meinem NT-Service übrigens den Code aus diesem Tread.

Habe festgestellt, dass es auch Probleme unter Vista gibt, wenn man z.B. den aktuellen User abmelden will. Das funktioniert ebenfalls nur wenn der "LOGOFF" im Userkontext ausgeführt wird. Daher wäre ich sehr dankbar, wenn mir jemand einen Tip geben könnte, wie man o.g. Code anpassen kann um auch z.B. ein "LOGOFF" im Userkontext auszuführen. Zur Zeit verwende ich ein "LOGOFF.EXE", das muss aber auch "schöner" gehen ...

kuba

Dezipaitor 8. Sep 2009 10:31

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Unter Windows 7 hat sich am Terminal Service etwas geändert, was zu einem Problem führen kann.
Im Subversion trunk habe ich eine angepasst Version, die ich jedoch noch nicht richtig testen konnte.

Ich werde ein neues Package machen, sobald ich diese Version auf Win7 testen konnte. Im Moment fehlt mir aber die Zeit. Freiwillige?

kuba 8. Sep 2009 18:13

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Zitat:

Zitat von Dezipaitor
Unter Windows 7 hat sich am Terminal Service etwas geändert, was zu einem Problem führen kann.
Im Subversion trunk habe ich eine angepasst Version, die ich jedoch noch nicht richtig testen konnte.

Ich werde ein neues Package machen, sobald ich diese Version auf Win7 testen konnte. Im Moment fehlt mir aber die Zeit. Freiwillige?

Hallo,

ich hab mal diesen Code in der Unit JwsclToken verwendet. Bekomme leider Fehler beim compilieren...

Was muss ich runterladen und installieren um den Code zu testen ??

kuba

himitsu 8. Sep 2009 18:23

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
WAS bemängelt denn der Compiler?

Zitat:

Zitat von kuba
Was muss ich runterladen und installieren um den Code zu testen ??

Am Einfachsten das gesamte JWSCL?
Und eventuell nicht noch die JCL (aber den dort eingebundenen Units nach, könnte es sein, daß nur die JWSCL reicht)

Dezipaitor 8. Sep 2009 18:24

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
1. Welche Fehler?
2. Einfach eine Quelltextdatei aus einer neueren Version einer Bibliothek zu nehmen, ist höchstwahrscheinlich zum Scheitern verurteilt. Entweder alles oder garnicht :)

kuba 8. Sep 2009 18:30

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Zitat:

Zitat von Dezipaitor
1. Welche Fehler?
2. Einfach eine Quelltextdatei aus einer neueren Version einer Bibliothek zu nehmen, ist höchstwahrscheinlich zum Scheitern verurteilt. Entweder alles oder garnicht :)

na eben..
was muss ich denn runterladen, wo isses denn ??
Ach sooo geht das :roll:


kuba

kuba 8. Sep 2009 18:45

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Übrigens...

früher (unter Win2000+XP) habe ich einfach AltDefaultUsername in der Registry ausgelesen um den aktuellen Benutzer herauszufinden. Der Schlüssel ist unter Vista und Windows 7 immer noch vorhanden, liefert jedoch nicht den gewünschten Usernamen sondern ist einfach leer. Jetzt hab ich mir überlegt, ob es sinnvoll ist diesen Schlüssel zu "missbrauchen" und einfach selbst den Usernamen hineinzuschreiben. Das müsste durch ein Hilfsprogramm möglich sein, das "LOGOFF" erledige ich ja zur Zeit auch über ein Hilfsprogramm. Mein Hilfsprogramm könnte mehrere Aufgaben erledigen...

Wenn ich das richtig verstanden habe ist es auch üblich ein sogenanntes watchdog Programm zu verwenden um bestimmte Useraktionen auszuführen und Zustände zu ermitteln.

werde den CODE trotzdem testen :zwinker:

kuba

Dezipaitor 8. Sep 2009 18:55

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Der Trunk reicht auf völlig.

Aber normalerweise empfehle ich Subversion, wie Tortoise SVN. Dann kann man es auch einfach aktuell halten.

UPDATE:
:warn:
Und Nein, es geht so: http://blog.delphi-jedi.net/security-library/

kuba 14. Sep 2009 14:56

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Hy,

danke nochmal ! Hab mich momentan leider etwas festgefahren. Sobald ich weiter bin melde ich mich nochmal ...

kuba

kuba 16. Sep 2009 16:26

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Hallo,

ich hab das JWAPI+JWSCL Update mit TortoiseSVN durchgeführt, jetzt hab ich allerdings ein Problem. Ich benötige MSXML.DCU, die ist bei Delphi 2005 PE nicht dabei. Ich hab zwar einen Patch in der DP gefunden: MSXML

Aber der pass nicht, ich erhalte Fehlermeldung : [Fataler Fehler] JwsclToken.pas(49): F2051 Unit JwaWindows wurde mit einer unterschiedlichen Version von MSXML.IXMLDOMDocument compiliert

Jemand eine Idee ??

KUBA

kuba 16. Sep 2009 19:39

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Hy,

mittlerweile bin ich weiter und hab die Updates JWSCL+JWAPI installiert, jetzt läuft auch alles schön.

Nur noch ein Problem, kann mir jemand sagen ob folgendes bei Windows 7 genauso ist wie bei Windows Vista ?

WinXP: Service=0, 1.User=0, 2.User=1, 3.User=2, ...
WinVista: Service=0, 1.User=1, 2.User=2, 3.User=3, ...
Windows7: ?

KUBA

MagicAndre1981 16. Sep 2009 22:17

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Windows 7 hat wie Vista die Session 0 Isolation. Also die Dienste laufen in Session 0 und die Nutzer fangen bei 1 an

lbomboes 6. Apr 2010 15:29

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
ich bekomme die gleiche Fehlermeldung wie Du zu Beginn (JwaWindows wurde mit einer unterschiedlichen Version von MSXML.IXMLDOMDocument compiliert)

Was hast Du denn unternommen um diesen zu beheben?

Danke und Gruß,
Lars

Dezipaitor 6. Apr 2010 19:41

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Wie hast du denn JwaWindows erstellt/eingebunden (PAS oder DCU)?

lbomboes 7. Apr 2010 08:32

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Dezipaitor - ich habe sie kompiliert (DCU).

1. D7 Package (dynamic debug) kompiliert (D9 ist nicht existent, Anleitung von Jwa meint, das nächst niedrige Package verwenden)
2. Testprojekt erstellt (eine einfache Fensterapplication unter Borland Delphi Personal 2005)
2. DCU Pfad in Suchpfad des Projekt reingeschrieben
3. COM Pfad in Suchpfad des Projekt reingeschrieben
4. in USES Pfad der Unit1.pas (= Unit des Fensters) JwaWindows hinzugefügt
5. Fehler erscheint "msxml.dcu" nicht auffindbar
6. MSXML2_TLB.pas hier runtergeladen und in msxml.pas umgenannt (auch oben in der Datei selber) - Delphi erstellt daraus die msxml.dcu
7. Fehler erscheint "JwaWindows wurde mit einer unterschiedlichen Version von MSXML.IXMLDOMDocument compiliert"

...

Könnt Ihr mir helfen? Ich kann anscheinent mit meiner Version kein Typenbibliothek erstellen. Ich verstehe erst gar nicht warum Delphi die JwaWindows.dcu erstellen konnte OHNE die msxml.dcu zu benötigen aber später beim Einbinden darauf behart... Wenn ich mir meine msxml4.dll im Windowsverzeichnis anschaue, steht da Version 4.0 SP2... vielleicht ist das das Problem? Vielleicht kann mir die jemand noch mal als .PAS umsetzen?

Ja - ich bin für jede Hilfe dankbar!

Viele Grüße,
Lars

btw: Unter dem Menüpunkt: Hilfe->Info über Borland Delphi->Versionsinfo... steht msxml4.dll, 4.20.9870.0, C:\WINNT\system32\

Dezipaitor 7. Apr 2010 16:48

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Mit der TLB hat das nichts zu tun. Du musst irgendwo bei Delphi eine msxml.dcu haben.

lbomboes 8. Apr 2010 08:22

Re: Angemeldeten Benutzer aus Dienst ermitteln - Windows 7
 
Ich habe eine ältere msxml2_tlb.pas im Internet gefunden, die auf der msxml3.dll basiert. Diese wurde von mir in msxml.pas umbenannt und in das \LIB Verzeichnis von Delphi "geworfen". Das Resultat: Es funktioniert. Delphi macht aus der .pas Datei die .dcu und es treten keine weiteren Fehler auf.

Vielen Dank für Eure Hilfe.

Gruß,
Lars


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