Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Windows-Dienst, Notification, Zugriff verweigert (https://www.delphipraxis.net/213534-windows-dienst-notification-zugriff-verweigert.html)

QuickAndDirty 18. Aug 2023 09:51

AW: Windows-Dienst, Notification, Zugriff verweigert
 
Zitat:

Zitat von himitsu (Beitrag 1525748)
@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;

QuickAndDirty 18. Aug 2023 09:54

AW: Windows-Dienst, Notification, Zugriff verweigert
 
Zitat:

Zitat von Delrabe (Beitrag 1525747)
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.

Delrabe 22. Aug 2023 11:58

AW: Windows-Dienst, Notification, Zugriff verweigert
 
@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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 Uhr.
Seite 3 von 3     123   

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