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 3 von 3     123   
QuickAndDirty

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

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 18. Aug 2023, 10:51
@Delrabe
Dass es geht, beweisen ja mehrere Programme, welche die NotifyApp aus dem Server starten.

Auch kann man im Server einen neuen Thread erstellen, ihn in einen anderen Kontext verschieben und von dort aus auf den Nutzerdesktop zugreifen.
z.B. TeamViewer soll das intern tun, um z.B. die UAC-Passorteingabe anzeigen zu können.
Ich bin davon überzeugt, dass du recht hast, dass man auf eine Systray-Autostart-App verzichten kann, wenn man es schafft aus dem Dienst heraus eine Meldung auf aktiven Sessions anzeigen kann.
Wie sieht eine solche Methode aus?
Delphi-Quellcode:
Procedure ShowMessageInAllInteractiveSessions(aMessage:String);
Begin
// was muss hier hin damit ein Dienst auf allen interaktiven Sesssions den Messagetext anzeigen kann?
end;
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 18. Aug 2023, 10:54
Hallo Sinspin,

in meinem Fall würde die Autostart-Version reichen. Sie muß nur funktionieren, insbesondere wenn der angemeldete User nicht über die notwendigen Rechte (z.B. Download) verfügt.
Die Sache ist die, dass man rechte normalerweise in diensten konserviert... sprich..der Admin installiert das Programm...und das Programm installiert einen Dienst der die Sachen ausführt die mehr rechte brauchen.
Der Installer der mit admin rechten läuft (oder eine Erststart der mit Admin rechten läuft) setzt dann den ACL(SDDL) des Dienstes so, dass unprivilegierte Benutzer ihn starten können.
Delphi-Quellcode:
// der erste ist der SD den der Dienst normalerweise hat wenn man ihn nicht anpasst.
//ACL (SDDL )
SECURITY_DESCRIPTOR_STANDARD = 'D:' +
  '(A;;CCLCSWRPWPDTLOCRRC;;;SY)' + // default permissions for local system
  '(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)' + // default permissions for administrators
  '(A;;CCLCSWLOCRRC;;;AU)' + // default permissions for authenticated users
  '(A;;CCLCSWRPWPDTLOCRRC;;;PU)' + // default permissions for power users
  '(A;;CCDCLCSWRPWPDTLOCRSDRC;;;BU)'+ // Built IN Users
  '(A;;RP;;;IU)'; // added permission: start service for interactive users

SECURITY_DESCRIPTOR_ALLOW_START_BY_USER = 'D:' +
  '(A;;CCLCSWRPWPDTLOCRRC;;;SY)' + // default permissions for local system
  '(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)' + // default permissions for built-in administrators
  '(A;;CCLCSWRPLOCRRC;;;IU)'+ // permissions for interactively logged-on user von MozillaMaintainance und ChromeElevation
  '(A;;CCLCSWRPLOCRRC;;;SU)'+ // permissions for service logon user von MozillaMaintainance und ChromeElevation
  '(A;;CCDCLCSWRPWPDTLOCRSDRC;;;BU)'+ // permissions for built-in users
  '(A;;CCLCSWRPLOCRRC;;;AU)' + // default permissions for authenticated users
  '(A;;CCLCSWRPWPDTLOCRRCRP;;;PU)'; // default permissions for power users

const
  advapi32 = 'advapi32.dll';
  {$IFDEF UNICODE}
  AWSuffix = 'W';
  {$ELSE}
  AWSuffix = 'A';
 {$ENDIF UNICODE}
function ConvertStringSecurityDescriptorToSecurityDescriptorA; external advapi32 name 'ConvertStringSecurityDescriptorToSecurityDescriptorA';
function ConvertStringSecurityDescriptorToSecurityDescriptorW; external advapi32 name 'ConvertStringSecurityDescriptorToSecurityDescriptorW';
function ConvertStringSecurityDescriptorToSecurityDescriptor; external advapi32 name 'ConvertStringSecurityDescriptorToSecurityDescriptor' + AWSuffix;


Procedure SetServiceSecurityDescriptor(ServiceName,Permission:String);// in ServiceAfterInstall ausführen da hat man immer Admin Rechte.
var
  SA: TSecurityAttributes;
  SvcMgr,SvcHandle: SC_HANDLE;
Begin
  SA.nLength := SizeOf(SA);
  SA.bInheritHandle := True;
  if not ConvertStringSecurityDescriptorToSecurityDescriptor(PWideChar(Permission),
                                                         1,
                                                         SA.lpSecurityDescriptor,
                                                         nil
                                                         ) then RaiseLastOSError;
{$IF DEFINED(CLR)}   //A.R. CLR = Common Language Runtime = .NET
  SvcMgr := OpenSCManager('', nil, SC_MANAGER_ALL_ACCESS);
{$ELSE}
  SvcMgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
{$ENDIF}
  if SvcMgr = 0 then RaiseLastOSError;
  try
    SvcHandle := OpenService(SvcMgr, PWidechar(ServiceName) , SERVICE_ALL_ACCESS);
    if SvcHandle = 0 then RaiseLastOSError;
    try
      SetServiceObjectSecurity(SVCHandle,DACL_SECURITY_INFORMATION,SA.lpSecurityDescriptor);
    finally
      CloseServiceHandle(SvcHandle);
    end;
  finally
    CloseServiceHandle(SvcMgr);
  end;
  LocalFree(HLOCAL(SA.lpSecurityDescriptor));
end;

Eine ander Möglichkeit Rechte zu konservieren ist es einen Geplantentask im Taskscheduler zu hinterlegen. Das wollte ich in zukunft mal versuchen... habe es aber bisher noch nie ausgerollt...nur damit experimentiert.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (18. Aug 2023 um 11:05 Uhr)
  Mit Zitat antworten Zitat
Delrabe

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

AW: Windows-Dienst, Notification, Zugriff verweigert

  Alt 22. Aug 2023, 12:58
@QuickAndDirty: Danke für den Hinweis.

Inzwischen habe ich allerdings entschieden, ganz auf Windows-Dienste zu verzichten. Die Update-Kontrolle wird von einer unsichtbare Kontroll-App erledigt werden, die im Hintergrund arbeitet. Das Programm wir über ein Monitor-Programm gesteuert werden, wobei der Anwender u.a. einstellen kann, dass sich die Kontroll-App. nach dem Ende einer Überprüfung selbst beendet. Damit können überflüssige Ressourcen vermieden werden. Der Anwender muss lediglich sicherstellen, dass die Kontroll-App im Autostart oder im Task Scheduler eingetragen ist, wobei es am besten ist, wenn der Update-Monitor die entsprechenden Einstellungen vornehmen kann. Dies muss ich allerdings erst noch ausknobeln.

Der Anwender wird die Update-Kontrolle über ein InnoSetup installieren müssen und dort sollten auch die benötigte Rechte abgehandelt werden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 04:50 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