Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TNotificationCenter: Die Benachrichtigungsplattform ist nicht verfügbar (https://www.delphipraxis.net/200336-tnotificationcenter-die-benachrichtigungsplattform-ist-nicht-verfuegbar.html)

colaflasche 10. Apr 2019 16:01

TNotificationCenter: Die Benachrichtigungsplattform ist nicht verfügbar
 
Guten Tag,

ich verwende ein TNotificationCenter um Notifications auszulösen. Das klappt auch alles wunderbar, bis der Dienst Windows-Pushbenachrichtigungs-Benutzerdienst_<Benutzer> gestoppt wird, dann erhalte ich folgende Meldung:

Zitat:

Exception EOleException in Modul Test.exe bei 00000000002E0A4E.
Die Benachrichtigungsplattform ist nicht verfügbar.
Wie kann ich herausfinden, ob der Dienst läuft, bzw. ob das NotificationCenter aktiv ist? TNotificationCenter.Supported hilft da leider nicht.

Mein Problem ist, dass das ganze auf einem Terminalserver (Windows Server 2016) läuft und da gibt es mehrere Benutzer und die dürfen scheinbar diesen Dienst nicht starten. Details habe ich nicht, der Kunde kontrolliert den Server. Ich kenne mich auch nicht mit den Berechtigungen aus, was da wo eingestellt werden muss, dass der Dienst gestartet werden kann/darf/soll.

Wenn hierzu jemand eine Idee hätte wäre das auch okay für mich. Aber wichtiger wäre mir zu wissen, wie ich herausfinden kann, ob ich Notifications überhaupt darstellen kann.

TiGü 10. Apr 2019 16:12

AW: TNotificationCenter: Die Benachrichtigungsplattform ist nicht verfügbar
 
Du willst also prüfen, ob der benötigte Service läuft?

Probiere doch mal: https://www.swissdelphicenter.ch/en/...de.php?id=1275

colaflasche 11. Apr 2019 09:20

AW: TNotificationCenter: Die Benachrichtigungsplattform ist nicht verfügbar
 
Danke, aber ich weiß ja nicht, wie der Dienst heißt. Für jeden Benutzer gibt es einen eigenen Dienst.

Der Dienstname lautet: WpnUserService_<Hex-Wert, der den Benutzer repräsentiert>
Anzeigename: Windows-Pushbenachrichtigungs-Benutzerdienst_<Hex-Wert, der den Benutzer repräsentiert>

Und auf einem Terminalserver mit 10 Benutzern habe ich den Dienst 10 mal.
Welcher ist also für meinen aktuellen Benutzer?

TiGü 11. Apr 2019 10:11

AW: TNotificationCenter: Die Benachrichtigungsplattform ist nicht verfügbar
 
Deine App läuft ja im jeweiligen Benutzerkontext (nehme ich an).
Du musst also nur schauen, ob ein Dienst läuft, der mit "WpnUserService" anfängt:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

// nach einer Idee von: http://www.chami.com/tips/delphi/040698D.html


uses
  System.SysUtils,
  Winapi.Windows,
  Winapi.WinSvc;

function IsServiceRunning(const AServiceName: string): Boolean;
const
  // assume that the total number of services is less than 4096. increase if necessary
  cnMaxServices = 4096;

type
  TSvcA = array [0 .. cnMaxServices] of TEnumServiceStatus;
  PSvcA = ^TSvcA;

var
  I: integer;
  // service control manager handle
  schm: SC_Handle;
  // bytes needed for the next buffer, if any
  nBytesNeeded,
  // number of services
  nServices,
  // pointer to the next unread service entry
  nResumeHandle: DWORD;
  // service status array
  ssa: PSvcA;

  dwServiceType: DWORD;
  dwServiceState: DWORD;
begin
  Result := False;

  // connect to the service control manager
  schm := OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE);

  if (schm > 0) then
  begin
    nResumeHandle := 0;

    New(ssa);
    try
      dwServiceType := SERVICE_WIN32_SHARE_PROCESS;
      dwServiceState := SERVICE_ACTIVE;

      EnumServicesStatus(
        schm,
        dwServiceType,
        dwServiceState,
        ssa^[0],
        SizeOf(ssa^),
        nBytesNeeded,
        nServices,
        nResumeHandle);

      // assume that our initial array was large enough to hold all
      // entries. add code to enumerate if necessary.

      for I := 0 to nServices - 1 do
      begin
        Result := string(ssa^[I].lpServiceName).StartsWith(AServiceName);
        if Result then
          Break;
      end;
    finally
      Dispose(ssa);

      // close service control manager handle
      CloseServiceHandle(schm);
    end;
  end;
end;

begin
  try
    Writeln('Is a WpnUserService running? ', IsServiceRunning('WpnUserService').ToString(TUseBoolStrs.True));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.

omp 20. Jun 2019 11:08

AW: TNotificationCenter: Die Benachrichtigungsplattform ist nicht verfügbar
 
Ich habe gerade auch das Problem. Ein Kunde erhält die Fehlermeldung auf einem Terminalserver mit Windows 2012 R2. Nur bei Remoteverbindung, kein Fehler bei Anmeldung direkt am Server. Ich habe selbst einen 2012 R2 getestet, da aber keine Probleme.

Die Dienst-Suche von TiGü habe ich auf meinem Testserver (auf dem es ja kein Problem gibt) ausgeführt und der Dienst wird nicht gefunden. Es muss also eine andere Ursache geben.

colaflasche, bist Du da weitergekommen?

Gruß und Danke, Harald

colaflasche 18. Jul 2019 16:59

AW: TNotificationCenter: Die Benachrichtigungsplattform ist nicht verfügbar
 
Leider nicht, ich habe jetzt eine ganz billige Lösung, ich kreiere mir das Notification-Center dynamisch. Wenn das fehlschlägt, schlucke ich die Exception und gebe ich auch keine Notifications aus.
Was besseres ist mir nicht eingefallen.

colaflasche 19. Jul 2019 09:24

AW: TNotificationCenter: Die Benachrichtigungsplattform ist nicht verfügbar
 
oh oh, aus den Releasenotes von 10.3.2:
Problems if "Windows Push Notifications User Service XXX" services is not running

Ich werde das mal prüfen!


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