@@ -13,17 +13,12 @@ import (
1313
1414const ServiceName = "SingcastService"
1515
16- func InstallService () error {
16+ func InstallService (homeDir string ) error {
1717 exe , err := os .Executable ()
1818 if err != nil {
1919 return fmt .Errorf ("get executable: %w" , err )
2020 }
2121
22- homeDir , err := os .Getwd ()
23- if err != nil {
24- return fmt .Errorf ("get working directory: %w" , err )
25- }
26-
2722 m , err := mgr .Connect ()
2823 if err != nil {
2924 return fmt .Errorf ("connect to SCM: %w" , err )
@@ -65,13 +60,20 @@ func UninstallService() error {
6560 }
6661 defer m .Disconnect ()
6762
68- s , err := m . OpenService (ServiceName )
63+ namePtr , err := windows . UTF16PtrFromString (ServiceName )
6964 if err != nil {
70- return fmt . Errorf ( "service %s not found: %w" , ServiceName , err )
65+ return err
7166 }
72- defer s .Close ()
7367
74- if err := s .Delete (); err != nil {
68+ // Use windows.OpenService with DELETE only — mgr.OpenService hardcodes
69+ // SERVICE_ALL_ACCESS which requires standard rights the DACL does not grant.
70+ h , err := windows .OpenService (m .Handle , namePtr , windows .DELETE )
71+ if err != nil {
72+ return fmt .Errorf ("open service %s: %w" , ServiceName , err )
73+ }
74+ defer windows .CloseServiceHandle (h )
75+
76+ if err := windows .DeleteService (h ); err != nil {
7577 return fmt .Errorf ("delete service: %w" , err )
7678 }
7779 return nil
@@ -83,15 +85,11 @@ func UninstallService() error {
8385//
8486// Access mask:
8587//
86- // SERVICE_QUERY_STATUS = 0x0004
87- // SERVICE_START = 0x0010
88- // SERVICE_STOP = 0x0020
89- // SERVICE_INTERROGATE = 0x0080
90- // Total = 0x00B4
91- //
92- // SIDs: AU = Authenticated Users, BA = Built-in Administrators, SY = Local System.
88+ // AU (Authenticated Users): 0x100B4 — DELETE + query status + start + stop + interrogate
89+ // BA (Built-in Admins): 0xF01FF — SERVICE_ALL_ACCESS
90+ // SY (Local System): 0xF01FF — SERVICE_ALL_ACCESS
9391func setServiceDACL (serviceName string ) error {
94- sddl := "D:(A;;0x00B4 ;;;AU)(A;;0x01FF ;;;BA)(A;;0x01FF ;;;SY)"
92+ sddl := "D:(A;;0x100B4 ;;;AU)(A;;0xF01FF ;;;BA)(A;;0xF01FF ;;;SY)"
9593
9694 sd , err := windows .SecurityDescriptorFromString (sddl )
9795 if err != nil {
0 commit comments