SetEntriesInAcl_() falscher Parameter
Re: SetEntriesInAcl_() falscher Parameter
@HeX0R
Lag es vielleicht an fehlendem Adminrecht?
Lag es vielleicht an fehlendem Adminrecht?
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: SetEntriesInAcl_() falscher Parameter
Ist mir auch schon oft so gegangen, meist wenn die Dienste bei einer deinstallation eines Programmes,
verweist, weiterhin dort verweilten
Und das ist leider sehr häufig der Fall.
verweist, weiterhin dort verweilten

Und das ist leider sehr häufig der Fall.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- HeX0R
- Beiträge: 3042
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Re: SetEntriesInAcl_() falscher Parameter
Nee nee, natürlich hatte ich Adminrechte.RSBasic hat geschrieben:@HeX0R
Lag es vielleicht an fehlendem Adminrecht?
Nur so zur Info, was ich eigentlich versuche:
Ich habe ein Programm, das als Dienst eingetragen werden kann. Eingetragen wird es natürlich mit Adminrechten.
Aber das Steuern wollte ich dem Programm auch ohne Adminrechte erlauben, also Start/Stop/Pause/Resume.
Bei diesen Versuchen habe ich meinen (eigenen) Dienst versehentlich mit irgendwelchen abartigen Rechten versehen und ihn daher nicht mehr löschen können.
Zumindest nicht mit sc und auch nicht als Systemadministrator.
Zuletzt geändert von HeX0R am 26.01.2013 17:34, insgesamt 1-mal geändert.
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
Re: SetEntriesInAcl_() falscher Parameter
Kann jeder selbst mit den Codes der ersten 2 Beiträge ausprobieren.HeX0R hat geschrieben:Bei diesen Versuchen habe ich meinen (eigenen) Dienst versehentlich mit irgendwelchen abartigen Rechten versehen und ihn daher nicht mehr löschen können.
Zumindest nicht mit sc und auch nicht als Systemadministrator.
Aber: ACHTUNG, DAS IST FALSCH UND BESCHAEDIGT DEIN SYSTEM! NICHT ZU EMPFEHLEN!
Bei der Funktion BuildExplicitAccessWithName_() den letzten Parameter von 0 oder #NO_INHERITANCE auf die folgende Kombination ändern:
Code: Alles auswählen
#CONTAINER_INHERIT_ACE | #OBJECT_INHERIT_ACE
da diese Flags fürs Dateisystem sind (Rechte von Ordern, so wie das VB-Beispiel in meinem MSDN-Link) und nicht für Services.
Bei mir war "WSearch", der Windows Search and Indexing Service, ebenfalls komplett geblockt (auch mit elevation zum admin).
Fehlernummer 5: Zugriff verweigert.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
- HeX0R
- Beiträge: 3042
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Re: SetEntriesInAcl_() falscher Parameter
HaHaHa, zwei Idioten!
Genau so, also mit "Administrator", ist mir das auch passiert
Genau so, also mit "Administrator", ist mir das auch passiert

{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
- HeX0R
- Beiträge: 3042
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Re: SetEntriesInAcl_() falscher Parameter
Sodele, ich muss meine erste Begeisterung etwas revidieren.
Es ging tatsächlich, aber nur, weil ich einen Fehler eingebaut hatte.
Mein *pNewAcl war immer 0.
Soll heissen, ein simples:
sorgt dafür, dass Hinz und Kunz (also auch mein Programm) den Service bedienen dürfen (nicht löschen!).
Was ich nicht hinbekommen habe, ist die Rechte einer bestimmten Gruppe zuzuordnen.
Zwar zeigt der letzte Codeteil von Danilo keinen Fehler mehr, aber mein Programm bekommt trotzdem immer "Zugriff verweigert",
egal, ob ich "GAST", "GÄSTE", "BENUTZER", "SYSTEM", "MEINUSERNAME", oder "MACHENDLICHDUARSCH" versuche.
Für die Zwecke meines Programmes genügt das zwar, aber ich verstehe trotzdem nicht wirklich, wieso das nicht hinhaut.
Es ging tatsächlich, aber nur, weil ich einen Fehler eingebaut hatte.
Mein *pNewAcl war immer 0.
Soll heissen, ein simples:
Code: Alles auswählen
SetNamedSecurityInfo_(ServiceName, #SE_SERVICE, #DACL_SECURITY_INFORMATION, 0, 0, 0, 0)
Was ich nicht hinbekommen habe, ist die Rechte einer bestimmten Gruppe zuzuordnen.
Zwar zeigt der letzte Codeteil von Danilo keinen Fehler mehr, aber mein Programm bekommt trotzdem immer "Zugriff verweigert",
egal, ob ich "GAST", "GÄSTE", "BENUTZER", "SYSTEM", "MEINUSERNAME", oder "MACHENDLICHDUARSCH" versuche.
Für die Zwecke meines Programmes genügt das zwar, aber ich verstehe trotzdem nicht wirklich, wieso das nicht hinhaut.
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
Re: SetEntriesInAcl_() falscher Parameter
Moin HeX0R,HeX0R hat geschrieben:Was ich nicht hinbekommen habe, ist die Rechte einer bestimmten Gruppe zuzuordnen.
Zwar zeigt der letzte Codeteil von Danilo keinen Fehler mehr, aber mein Programm bekommt trotzdem immer "Zugriff verweigert",
egal, ob ich "GAST", "GÄSTE", "BENUTZER", "SYSTEM", "MEINUSERNAME", oder "MACHENDLICHDUARSCH" versuche.
ich glaube Du solltest etwas anders rangehen. BuildExplicitAccessWithName_() ist nur dazu da, die Structure ea.EXPLICIT_ACCESS
richtig auszufüllen. Das kannst Du auch selbst machen und hast so mehr Kontrolle.
Dabei habe ich auch gerade gesehen das #NO_INHERITANCE in AccCtrl.h als $0 definiert ist.
Bei Dir gestern war es $8000000B, was das eigentliche Problem gewesen sein könnte!
Hier mal ein Ausschnitt für das Füllen der Struktur ea.EXPLICIT_ACCESS:
Code: Alles auswählen
#NO_MULTIPLE_TRUSTEE = 0
; AccCtrl.h
#NO_INHERITANCE = $0
#SUB_OBJECTS_ONLY_INHERIT = $1
#SUB_CONTAINERS_ONLY_INHERIT = $2
#SUB_CONTAINERS_AND_OBJECTS_INHERIT = $3
#INHERIT_NO_PROPAGATE = $4
#INHERIT_ONLY = $8
Enumeration
#TRUSTEE_IS_SID
#TRUSTEE_IS_NAME
#TRUSTEE_BAD_FORM
#TRUSTEE_IS_OBJECTS_AND_SID
#TRUSTEE_IS_OBJECTS_AND_NAME
EndEnumeration
Enumeration
#TRUSTEE_IS_UNKNOWN
#TRUSTEE_IS_USER
#TRUSTEE_IS_GROUP
#TRUSTEE_IS_DOMAIN
#TRUSTEE_IS_ALIAS
#TRUSTEE_IS_WELL_KNOWN_GROUP
#TRUSTEE_IS_DELETED
#TRUSTEE_IS_INVALID
#TRUSTEE_IS_COMPUTER
EndEnumeration
ea\grfAccessMode = #SET_ACCESS ; oder #GRANT_ACCESS
ea\grfAccessPermissions = #SERVICE_START | #SERVICE_STOP | #DELETE | #READ_CONTROL
ea\grfInheritance = #NO_INHERITANCE
ea\Trustee\MultipleTrusteeOperation = #NO_MULTIPLE_TRUSTEE
ea\Trustee\pMultipleTrustee = 0
ea\Trustee\ptstrName = @user.s ; oder: @group.s oder: *sid
ea\Trustee\TrusteeForm = #TRUSTEE_IS_NAME ; oder: #TRUSTEE_IS_NAME oder: #TRUSTEE_IS_SID
ea\Trustee\TrusteeType = #TRUSTEE_IS_USER ; oder: #TRUSTEE_IS_GROUP oder: #TRUSTEE_IS_WELL_KNOWN_GROUP
Gruppennamen wie "Users" setzen können.
Dann gibt es noch die Möglichkeit SIDs zu verwenden. Das sind Security IDentifiers.
Dann setzt Du ea\Trustee\TrusteeForm auf #TRUSTEE_IS_SID und ea\Trustee\ptstrName
ist ein Pointer zu einem SID.
Die SID-Struktur ist nicht richtig definiert. Es ist nur ein Speicherbereich, der immer
unterschiedlich groß sein kann.
Es gibt aber Funktionen um diese SID abzurufen oder zu erstellen:
Mit google findest Du Beispiele in anderen Sprachen, wenn Du nach ein paar der obigen StichwörterLookupAccountName_()
The LookupAccountName function accepts the name of a system and an account as input.
It retrieves a security identifier (SID) for the account and the name of the domain on which the account was found.
LsaLookupNames_()
The LsaLookupNames function retrieves the security identifiers (SIDs) that correspond to an array of user, group, or local group names.
CreateWellKnownSid_()
The CreateWellKnownSid function creates a SID for predefined aliases.
( Erstellt eine SID aus den Enumeration-Einträgen von WELL_KNOWN_SID_TYPE, z.B.
#WinBuiltinUsersSid = 27
#WinBuiltinGuestsSid = 28
#WinAccountAdministratorSid = 38
#WinAccountGuestSid = 39 ; uvm... )
und Funktionsnamen suchst.
Du musst dann nur ea\Trustee\ptstrName, ea\Trustee\TrusteeForm und ea\Trustee\TrusteeType
jeweils etwas anders setzen. Solltest Du in MSDN finden können.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
- HeX0R
- Beiträge: 3042
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Re: SetEntriesInAcl_() falscher Parameter
Yo, ich weiss, hatte das Ergebnis der Funktion auch überprüft und war damit eigentlich einverstanden.Danilo hat geschrieben:ich glaube Du solltest etwas anders rangehen. BuildExplicitAccessWithName_() ist nur dazu da, die Structure ea.EXPLICIT_ACCESS
richtig auszufüllen. Das kannst Du auch selbst machen und hast so mehr Kontrolle.
Aber selbst befüllen ginge natürlich auch, klar.
Nach deiner Antwort gestern hatte ich auch gleich die Befürchtung, dass ich den Wert falsch recherchiert hatte.Danilo hat geschrieben:Dabei habe ich auch gerade gesehen das #NO_INHERITANCE in AccCtrl.h als $0 definiert ist.
Bei Dir gestern war es $8000000B, was das eigentliche Problem gewesen sein könnte!
Es war zumindest definitv der Verursacher meines Ursprungsproblems.
Besten Dank, ich werde die Tage mal ein wenig damit "rumspielen".Danilo hat geschrieben:Hier mal ein Ausschnitt für das Füllen der Struktur ea.EXPLICIT_ACCESS:
[...]
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
- HeX0R
- Beiträge: 3042
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Re: SetEntriesInAcl_() falscher Parameter
*Ächz* Ich habe es geschafft...
Nachdem ich alle möglichen Methoden erfolglos probiert habe, bin ich auf die Idee gekommen die Permissions zu ändern.
Dieses #READ_CONTROL und #DELETE war mir eh suspekt, ich wollte ja nur das An- und Ausknipsen erlauben.
Also habe ich es in #SERVICE_START | #SERVICE_STOP | #SERVICE_PAUSE_CONTINUE geändert, und siehe da...
So sieht das nun aus:
Vielen Dank nochmal an Danilo 
Nachdem ich alle möglichen Methoden erfolglos probiert habe, bin ich auf die Idee gekommen die Permissions zu ändern.
Dieses #READ_CONTROL und #DELETE war mir eh suspekt, ich wollte ja nur das An- und Ausknipsen erlauben.
Also habe ich es in #SERVICE_START | #SERVICE_STOP | #SERVICE_PAUSE_CONTINUE geändert, und siehe da...
So sieht das nun aus:
Code: Alles auswählen
Procedure Modify_DAC(ServiceName.s, UserName.s)
Protected *psd.SECURITY_DESCRIPTOR, *pacl, *pNewAcl
Protected ea.EXPLICIT_ACCESS, Result
If GetNamedSecurityInfo_(ServiceName, #SE_SERVICE, #DACL_SECURITY_INFORMATION, #Null, #Null, @*pacl, 0, @*psd) = #ERROR_SUCCESS
BuildExplicitAccessWithName_(@ea, @UserName, #SERVICE_START | #SERVICE_STOP | #SERVICE_PAUSE_CONTINUE, #SET_ACCESS, #NO_INHERITANCE)
If SetEntriesInAcl_(1, @ea, *pacl, @*pNewAcl) = #ERROR_SUCCESS
If SetNamedSecurityInfo_(ServiceName, #SE_SERVICE, #DACL_SECURITY_INFORMATION, #Null, #Null, *pNewAcl, 0) = #ERROR_SUCCESS
Result = #True
EndIf
EndIf
EndIf
If *psd
LocalFree_(*psd)
EndIf
If *pNewAcl
LocalFree_(*pNewAcl)
EndIf
ProcedureReturn Result
EndProcedure

{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}