AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Windows-Dienst, Notification, Zugriff verweigert
Thema durchsuchen
Ansicht
Themen-Optionen

Windows-Dienst, Notification, Zugriff verweigert

Ein Thema von Delrabe · begonnen am 13. Aug 2023 · letzter Beitrag vom 22. Aug 2023
Antwort Antwort
Seite 1 von 3  1 23      
Delrabe

Registriert seit: 18. Aug 2009
11 Beiträge
 
#1

Windows-Dienst, Notification, Zugriff verweigert

  Alt 13. Aug 2023, 21:11
Hallo,

auf einem Windows 10-Rechner verwalte ich ein komplexes und umfangreiches Delphi-Projekt mit Datenbank-Anbindung und einem funktionierenden Update-Mechanismus. Zusätzlich hätte ich gerne einen Windows-Dienst, der bei Anwendern gelegentlich prüft, ob Programm-Updates vorhanden sind, und dies ggf. meldet. Dies ist in erster Linie gedacht für Sys-Admin's, die Software auf Client-Rechnern verwalten, und für sporadische User, die gerne einmal ein Update verpassen.

Inzwischen habe ich den Dienst (TService-Anwendung) und einen Dienst-Monitor (Standard-Anwendung) erstellt. Mit dem Dienst-Monitor kann man Dienst-Details einstellen und die Standard-Aktionen (Dienst installieren, starten usw.) vornehmen. Alles funktioniert wie gewünscht, nur kann der Dienst derzeitig keine Meldung an den User schicken.

Dies hatte ich natürlich als erstes geprüft, und das war via TNotificationCenter, TNotification und PresentNotification sehr einfach. In einer normalen Anwendung funktioniert das auch ohne Probleme, nur beim Dienst erfolgt immer die Meldung "Zugriff verweigert".

Inzwischen habe ich zusätzlich eine kleine Anwendung erstellt, die unsichtbar das Melden übernimmt und die Aktionen protokolliert. Dieses Notify-Programm ruft man auf und übergibt dabei die Meldungsdaten als Parameter. Es ergibt sich dabei dasselbe Verhalten. Beim Aufruf aus einer "normalen" Anwendung funktioniert die Sache, beim Aufruf aus dem Dienst heraus wird bei "NotificationCenter.PresentNotification" wieder der "Zugriff verweigert".

Ich habe mir inzwischen schon den Wolf gegoogelt nach möglicherweise fehlenden Rechten sowie Besonderheiten bei Notification und Windows-Diensten, habe aber nichts gefunden. Ich hoffe, dass mir jemand helfen kann.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 14. Aug 2023, 02:11
Das hat nichts mit Notifications zu tun.

Interactive Dienste sind seit Jahrzehnten grundsätzlich verboten.
Ebenso ist der Zugriff aus einer anderen Session/Desktop nicht erlaubt. (ist im Printip das Gleiche)

Interaktiv = mit dem Nutzer reden/interagieren


Rate mal, warum viele andere Anwendungen auch eine extra NotifyApp im aktuellen Nutzerkontext starten, oder beschissener Weise dauerhaft nutzlos mitlaufen lassen?
Bei Google suchenCreateProcessAsUser
CreateProcessWithLogonW
CreateProcessWithTokenW
usw.


Man kann zwar via Impersonation auch den eigenen Prozess einen Thread des eigenen Prozesses in einen anderen Kontext verschieben, aber das hilft nicht bei Allem und hat sowieso einige Nachteile.




OpenInputDesktop
WTSGetActiveConsoleSessionId
via WMI abfragen welcher Nutzer im aktiven Desktop in der aktiven Konsole eingeloggt ist. (nicht Konsole wie Konsole aka CMD, sondern wie Konsole aka Monitor+Tastatur/Maus)
oder sonstwas


[add]
https://stackoverflow.com/questions/...t-user-session
https://www.delphipraxis.net/101151-...-tservice.html
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (14. Aug 2023 um 02:54 Uhr)
  Mit Zitat antworten Zitat
Delrabe

Registriert seit: 18. Aug 2009
11 Beiträge
 
#3

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 14. Aug 2023, 13:04
Hallo himitsu,

vielen Dank für die schnelle Antwort. Damit weiß ich jetzt, wo genau der Schuh drückt und wie man das Problem prinzipiell beheben kann.

Eine Notify-App habe ich ja schon benutzt; es geht jetzt wohl darum, diese richtig aufzurufen. Leider hat der erste Versucht mittels "SvcLaunchAppInCurrUserSession" aus
https://stackoverflow.com/questions/...t-user-session
auch nicht funktioniert. Das muß ich erst noch analysieren und ggf. Alternativen ausprobieren.

Ich melde mich, sobald ich ein Ergebnis habe.
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
677 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 14. Aug 2023, 13:18
Du brauchst eine Kommunikation zwischen den beiden Programmen die über Sessions (virtuelle Desktops) hinweg funktioniert. Dafür hat Windows Schnittstellen geschaffen die man verwenden muss.
Wir verwenden zur Kommunikation eine NamedPipe.
Der Service ist der PipeServer und muss der Pipe das Recht (eine Custom Security Description) geben, mit anderen Programmen außerhalb der eigenen Session reden zu können.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Delrabe

Registriert seit: 18. Aug 2009
11 Beiträge
 
#5

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 15. Aug 2023, 00:12
Hallo,

kurzer Zwischenbericht: Offenbar geht es darum, das Notify-Programm aus dem Dienst heraus in geeigneter Weise aufzurufen. Dafür habe ich anhand der Beispiele im Netz eine Variante von "ExecuteAsUser" entwickelt. Damit verschwindet bei dem Notify-Aufruf das frühere "Zugriff verweigert". Leider wird jetzt beim Aufruf von "CreateProcessAsUser" der Fehler "Der angeforderte Vorgang erfordert erhöhte Rechte" gemeldet. Die betreffenden Prozeduren befinden sich alle in der beiligenden Unit. Der kritische Punkt ist vielleicht "TExecUsrRec.CrtFlags". Damit habe ich nicht viel Erfahrung. Möglicherweise muß man auch noch etwas beim TStartupInfo einstellen.

Zusatz-Info: Insgesamt sind 3 Delphi-Programme beteiligt; die Dienst-Anwendung, das Monitor-Programm und die kleine Notify-App. Bei den ersten beiden verlange ich Admin-Rechte, bei der Notify-App ist das wohl nicht nötig. Ich weiß aber auch nicht, über welche Rechte der Dienst verfügt, wenn er über "Dienst.exe /Install" aus dem Monitor-Programm erstellt wird.
Angehängte Dateien
Dateityp: zip DutWinAPI.zip (1,5 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#6

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 15. Aug 2023, 12:26
Ich weiß aber auch nicht, über welche Rechte der Dienst verfügt, wenn er über "Dienst.exe /Install" aus dem Monitor-Programm erstellt wird.
Per default läuft ein Service unter dem System-Account, man kann ihm aber über das Service-Applet auch einen anderen Account zuordnen.
Peter Below
  Mit Zitat antworten Zitat
Delrabe

Registriert seit: 18. Aug 2009
11 Beiträge
 
#7

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 15. Aug 2023, 15:57
Hallo,

@Sinspin: Danke für den Hinweis, die Kommunikation zwischen dem Dienst und der Notify.App ist in meinen Augen kein Problem. Die Daten könnten z.B. in einer Datei vom ini-Typ stehen, wo der Dienst unter [MELDUNG] die gewünschten Meldungs-Daten einträgt und die Notify.App anschließend unter [NOTIFY] das Ergebnis und ggf. die Fehlermeldung einträgt. Der Dienst könnte bei Bedarf eine solche Datei erstellen und beim Aufruf der Notify.App diese Datei als Parameter übergeben.

Das Problem ist aber genau dieser Aufruf der Notify.App aus dem Dienst heraus. Das ist offenbar direkt nicht gestattet, weshalb wohl ein Aufruf als "aktueller User" bereitgestellt wird. Leider funktioniert der derzeitig nicht.

Im Detail: Ich verschaffe mir das "Token" des aktuellen Users, wobei "WtsGetActiveConsoleSessionID" und "WTSQueryUserToken" verwendet werden, und rufe danach "CreateProcessAsUser" mit den entsprechenden Parametern auf (vgl. den Quellcode). Leider bekomme ich jetzt eine Fehlermeldung, die wohl bedeutet, dass Admin-Rechte fehlen. Das verstehe ich nicht. Für den Aufruf der Notify.App sind eigentlich keine Admin-Rechte notwendig. Ich selbst bin als Admin angemeldet, nicht als Sys-Admin, aber was spielt das für eine Rolle? Hier wäre ich dankbar für Erläuterungen.

Inzwischen habe ich eine Variante mit "TImpersonateUser" aus dem Netz eingebaut, die wahlweise benutzt werden kann (vgl. die neue Version des Quellcodes). Die funktioniert aber auch nicht, Meldung "Eine Anmeldeanforderung enthielt einen unzulässigen Wert für den Anmeldungstyp" (ERROR_INVALID_LOGON_TYPE). Das liegt möglicherweise daran, dass man zwar den aktuellen User bestimmen kann, aber man kennt natürlich nicht sein PW. Mein Verdacht ist, dass diese Möglichkeit für spezielle Fälle benutzt wird, wo man in einem Programm ein PW abfragt, um Zugriff auf spezielle Features zu ermöglichen.

@peterbelow: Danke für den Hinweis.

@Sinspin: Bei den "Windows Schnittstellen", die man verwenden sollte, wäre ich dankbar für ein paar zusätzliche Info's. So kann ich damit nichts anfangen.
Angehängte Dateien
Dateityp: pas DutWinAPI.pas (8,1 KB, 2x aufgerufen)

Geändert von Delrabe (16. Aug 2023 um 14:09 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.929 Beiträge
 
Delphi 12 Athens
 
#8

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 17. Aug 2023, 08:59
Ich mag das Problem total falsch verstehen,
aber spricht irgendetwas gegen ein Programm das in der Systemtray mit läuft und sich im Autostart in der registry einrichtet und dann den Dienst überwacht und von dem Dienst auch mitgeteilt bekommt, wenn es mal ne Meldung Anzeigen soll?
Ist das nicht mehr "state of the art"?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
677 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 17. Aug 2023, 10:13
Das ist es, wo ich mich jedesmal frage, warum soll der Dienst was starten?
Das macht entweder die Verwaltungsanwendung mit oder man schreibt was Fensterloses fürn Systray was die Meldungen generiert.

Und Kommunikation via INI? Ich weis nicht. Ich bin auch noch aus den vorgen Jahrtausend. Aber das ist schon ne ganz spezielle Idee.
Das nennt sich "Named Pipes" dazu hat Micosoft ne ganze gute docu.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#10

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 17. Aug 2023, 12:11
Genau andersrum.

Warum soll jeder Dreck massenhaft Notify-Programme starten und dauerhaft laufen lassen,
anstatt, nur wenn benötigt, kurzzitig Jenes zu starten?

Auf einem Terminal-Server wird es noch schlimmer, wenn dutzende Leute eingeloggt sind, bei JEDEM dutzende Notify-Programme laufen,
anstatt nur das eine Programm, welches "jetzt" was sagen will, bei aktiven Usern (vielleicht sogar nur bei Admins)



Klar, Programme, welche im Tray ständig einen Status anzeigen müssen sollen, da ist es OK.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (17. Aug 2023 um 12:53 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 12:01 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