![]() |
Wie startet Firefox seinen Update Service?
Hallo, ich habe mir einen Update Service geschrieben.
Wie bei FF soll der nicht die ganze Zeit laufen sondern einfach nur wenn er gebraucht wird. Nun bekomme ich den Service ohne Admin privilegien nicht gestartet. openService meldet "Access Denied" Wie macht FF das mit seinem Update Service? |
AW: Wie startet Firefox seinen Update Service?
Könnte man ihn eventuell in die Aufgabenplanung eintragen, damit er alle 7 Tagen sich startet und nach Updates guckt?
|
AW: Wie startet Firefox seinen Update Service?
Weiß nicht, wie er das genau macht. Worauf Du aber vielleicht hinaus willst:
Bei der FF Installation wird gefragt, ob automatisch nach Updates gesucht werden soll (oder sogar explizit nach diesem Service gefragt) Sagt man nein, passiert natürlich nichts. Sagt man ja, gibt es eine UAC Abfrage und das Setup erlangt Admin Rechte, mit deren Hilfe es sicher den Service einrichtet, also auch dem Service selbst das Recht (weiter)gibt. (So ungefähr aus dem Kopf, das Spiel ist prinzipbedingt immer sehr ähnlich) |
AW: Wie startet Firefox seinen Update Service?
Ja ich weiß. Mein Service läuft ja auch als "System" Service und er wurde mit "RUNAS" installiert.
|
AW: Wie startet Firefox seinen Update Service?
Hat irgendwer schon mal den FireFox bei einem Update genau beobachtet?
Was ist Euch da aufgefallen? Eben, nix! Der fragt für die Installation noch nicht mal nach dem Administrator-Zugang trotz UAC. Und warum? Weil die Installation von dem MozillaMaintenance Service durchgeführt wird. Dieser Dienst läuft im Kontext von Lokales System und darf somit auch installieren. Dieser Dienst ist aber im Normal-Zustand beendet und wird nur dann erweckt, wenn es ein Update gibt. Genau darum geht es hier in diesem Thread. Wie weckt Otto-Normal-User den Service auf, damit dieser mit seinen höheren Rechten die Installation vollzieht. Ich habe es gerade mal ausprobiert und das geht mit
Code:
(auch als Otto-Normal-User).
net start MoziallaMaintenance
|
AW: Wie startet Firefox seinen Update Service?
Zitat:
Ich weiß nur nicht WIE? Der Mozilla Update Service läuft, wie mein Service, im "System" Benutzerkontext. Der FF läuft als Benutzer. Wie startet FF den Dienst? |
AW: Wie startet Firefox seinen Update Service?
Zitat:
Liegts daran das OpenService einen Zugang zu allerlei Anderem liefert, neben der Möglichkeit den Service zu starten? ich gucke gerade vielleicht nehme ich mir mit den flags hier einfach zuviel heraus und man muss sich selbst in den anforderungen beschneiden damit es klapt?
Delphi-Quellcode:
hServiceManager := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
if hServiceManager > 0 then begin GetLastError; hService := OpenService(hServiceManager, PChar(ServiceName), SERVICE_START); err := GetLastError; if ERR >0 then Begin {$IFDEF FrameWork_VCL} Showmessage(SysErrorMessage(GetLastError)); {$ENDIF} {$IFDEF FrameWork_FMX} TDialogService.Showmessage(SysErrorMessage(GetLastError)); {$ENDIF} End; |
AW: Wie startet Firefox seinen Update Service?
Probier es mal mit
![]() |
AW: Wie startet Firefox seinen Update Service?
Kann es sein, dass er den service beim windows start hoch fährt, dieser nach einem update schaut und wnen nichts da ist, der service sich einfach beendet ?
(Hab kein FF, von daher nur theorie) |
AW: Wie startet Firefox seinen Update Service?
hab das versuch, geht leider nicht.
Aber wieso sollte es funktionieren wenn ich start und Query rechte anfordere... das ist zurzeit die funktion.
Delphi-Quellcode:
Vermutlich ist der fehler, dass ich den Service mit Shellexecute installiere...
function TServiceController.StartService(ServiceName : string) : TServiceStatusReturn;
var hService : SC_HANDLE; hServiceManager : SC_HANDLE; pDummy : PChar; Tries : Integer; err:Cardinal; begin Result := ServiceGetStatus(nil,PChar(ServiceName)); if Result <> ssrStopped then Exit; // SetServiceObjectSecurity() // vermutlich hServiceManager := OpenSCManager(nil, nil, SC_MANAGER_CONNECT ); if hServiceManager > 0 then begin GetLastError; hService := OpenService(hServiceManager, PChar(ServiceName), SERVICE_START); Err := getlasterror; if ERR >0 then Begin {$IFDEF FrameWork_VCL} Showmessage(SysErrorMessage(GetLastError)); {$ENDIF} {$IFDEF FrameWork_FMX} TDialogService.Showmessage(SysErrorMessage(GetLastError)); {$ENDIF} End; if hService > 0 then begin pDummy := nil; if winsvc.StartService(hService, 0, pDummy) then begin Tries := 5; repeat Sleep(10000); Result := ServiceGetStatus(nil,pchar(ServiceName)); Dec(Tries); until (Tries = 0) or (Result = ssrRunning); end else begin Result := ssrError; end; CloseServiceHandle(hService); end end; CloseServiceHandle(hServiceManager); end; Wenn ich den Service auch über den ServiceManager installieren würde könnte ich die via UAC Angeforderten rechte nutzen um diese funktion SetServiceObjectSecurity()auszuführen. hmm |
AW: Wie startet Firefox seinen Update Service?
Zitat:
|
AW: Wie startet Firefox seinen Update Service?
hab zurzeit diese rechte auf dem Service
Laut SC SDSHOW MyUpdateService
Code:
mit
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)
Code:
erweitere ich die rechte sinnvoll am besten direkt nach installation des service....wegen der uac.
sc sdset MyUpdateService D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWP;;;IU)
geht sowas im batch
Code:
naja auf jedenfall lässt sich der dienst jetzt auch ohne rechte starten
SC SDSHOW MyUpdateService > tempfile.txt
type tempfile.txt | echo (A;;RPWP;;;IU)>tempfile.txt type tempfile.txt > SC SDSET MyUpdateService |
AW: Wie startet Firefox seinen Update Service?
Nur mal nebenbei eine kleine Beobachtung von mir, als reiner Anwender (falls es dem TE lediglich um "ich will aber wissen wie es funktioniert" geht, bitte ignorieren):
<Rant> Firefox läuft bei mir den ganzen Tag. Wenn es mal ein Update gibt, sagt er mir das, und auch, daß ich ihn neu starten muß damit es durchgeführt werden kann. In meinem Anwendungsfall (und ich vermute ich bin nicht der Einzige, der so "arbeitet") hat der Dienst nichts zu tun, was nicht der Browser von sich aus auch machen könnte. Andere Software setzt das auch ohne Dienst um, beim Start wird geprüft, ob es eine neuere Version gibt und gefragt, ob das jetzt installiert werden soll oder später oder eben gar nicht. Prominente Beispiele dafür sind paint.net und Notepad++. Die Entwickler dieser Produkte sind sicherlich nicht zu blöd, einen Update-Dienst zu entwickeln, aber es hat auch Vorteile, wenn man das die Anwendung selbst machen läßt, und auch den Benutzer mit einbezieht:
</Rant> Aber zum lernen, wie so ein Dienst funktioniert und installiert wird, ist das sicher eine tolle Gelegenheit. Dem Endanwender würde ich es dennoch nicht zumuten wollen. Sherlock |
AW: Wie startet Firefox seinen Update Service?
Der Dienst sorgt dafür, dass das Update von jedem Benutzer ausgeführt werden kann.
|
AW: Wie startet Firefox seinen Update Service?
Ja der Dienst "konserviert" halt die UAC-Abfrage und hat System Rechte. Und Ich will einfach vermeiden jedesmal die IT Abteilung bemühen zu müssen.
Die Software die dort ein Update erfährt wird oft aktualisiert, da sie diverse Instanzen einer Mobilen App verwaltet Die Apps aus dem Playstore/Applestore aktualisieren sich ja eigenständig, so dass man Aktualisierungen der Software nicht Kunde für Kunde ausrollen kann.... |
AW: Wie startet Firefox seinen Update Service?
Ich muss quasi diesen C# code in das AfterInstall Event vom dienst bringen denke ich.
Code:
Sähe dann so aus
wchar_t sddl[] = L"D:"
L"(A;;CCLCSWRPWPDTLOCRRC;;;SY)" // default permissions for local system L"(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)" // default permissions for administrators L"(A;;CCLCSWLOCRRC;;;AU)" // default permissions for authenticated users L"(A;;CCLCSWRPWPDTLOCRRC;;;PU)" // default permissions for power users L"(A;;RP;;;IU)" // added permission: start service for interactive users ; PSECURITY_DESCRIPTOR sd; if (!ConvertStringSecurityDescriptorToSecurityDescriptor(sddl, SDDL_REVISION_1, &sd, NULL)) { fail(); } if (!SetServiceObjectSecurity(service, DACL_SECURITY_INFORMATION, sd)) { fail(); }
Delphi-Quellcode:
Falls mal jemand sowas braucht. Es ist getestet und funktioniertinterface ...... function ConvertStringSecurityDescriptorToSecurityDescriptorA(StringSecurityDescriptor: LPCSTR; StringSDRevision: DWORD; var SecurityDescriptor: PSECURITY_DESCRIPTOR; SecurityDescriptorSize: PULONG): BOOL; stdcall; {$EXTERNALSYM ConvertStringSecurityDescriptorToSecurityDescriptorA} function ConvertStringSecurityDescriptorToSecurityDescriptorW(StringSecurityDescriptor: LPCWSTR; StringSDRevision: DWORD; var SecurityDescriptor: PSECURITY_DESCRIPTOR; SecurityDescriptorSize: PULONG): BOOL; stdcall; {$EXTERNALSYM ConvertStringSecurityDescriptorToSecurityDescriptorW} function ConvertStringSecurityDescriptorToSecurityDescriptor(StringSecurityDescriptor: LPCTSTR; StringSDRevision: DWORD; var SecurityDescriptor: PSECURITY_DESCRIPTOR; SecurityDescriptorSize: PULONG): BOOL; stdcall; {$EXTERNALSYM ConvertStringSecurityDescriptorToSecurityDescriptor} .... implementation .... 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 TMyUpdateService.ServiceAfterInstall(Sender: TService); var SA: TSecurityAttributes; Permission:String; SvcMgr,SvcHandle: SC_HANDLE; ServiceName:String; begin Permission := '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;;RP;;;IU)'; // added permission: start service for interactive users SA.nLength := SizeOf(SA); SA.bInheritHandle := True; if not ConvertStringSecurityDescriptorToSecurityDescriptor(PWideChar(Permission), 1, SA.lpSecurityDescriptor, nil ) then RaiseLastOSError; {$IF DEFINED(CLR)} SvcMgr := OpenSCManager('', nil, SC_MANAGER_ALL_ACCESS); {$ELSE} SvcMgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); {$ENDIF} if SvcMgr = 0 then RaiseLastOSError; try ServiceName :=self.Name; 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; Mit RUNAS und UAC Elevation den Service installieren und dann einfach bei Bedarf mit userrechten starten... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr. |
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