SetEntriesInAcl_() falscher Parameter

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: SetEntriesInAcl_() falscher Parameter

Beitrag von RSBasic »

@HeX0R
Lag es vielleicht an fehlendem Adminrecht?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
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

Beitrag von ts-soft »

Ist mir auch schon oft so gegangen, meist wenn die Dienste bei einer deinstallation eines Programmes,
verweist, weiterhin dort verweilten :mrgreen:
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.
Bild
Benutzeravatar
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

Beitrag von HeX0R »

RSBasic hat geschrieben:@HeX0R
Lag es vielleicht an fehlendem Adminrecht?
Nee nee, natürlich hatte ich Adminrechte.

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.
mirca
Beiträge: 169
Registriert: 13.11.2011 16:05

GELÖSCHT

Beitrag von mirca »

GELÖSCHT
Zuletzt geändert von mirca am 17.10.2013 11:38, insgesamt 1-mal geändert.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: SetEntriesInAcl_() falscher Parameter

Beitrag von Danilo »

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.
Kann jeder selbst mit den Codes der ersten 2 Beiträge ausprobieren.

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
Modify_DAC("myService","Administrator") blockt dann den Service "myService",
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
Benutzeravatar
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

Beitrag von HeX0R »

HaHaHa, zwei Idioten!
Genau so, also mit "Administrator", ist mir das auch passiert :mrgreen:
Benutzeravatar
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

Beitrag von HeX0R »

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:

Code: Alles auswählen

SetNamedSecurityInfo_(ServiceName, #SE_SERVICE, #DACL_SECURITY_INFORMATION, 0, 0, 0, 0)
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.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: SetEntriesInAcl_() falscher Parameter

Beitrag von Danilo »

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.
Moin HeX0R,

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
Wenn Du auf ea\Trustee\TrusteeType = #TRUSTEE_IS_GROUP setzt, solltest Du einen
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:
LookupAccountName_()
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... )
Mit google findest Du Beispiele in anderen Sprachen, wenn Du nach ein paar der obigen Stichwörter
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
Benutzeravatar
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

Beitrag von HeX0R »

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.
Yo, ich weiss, hatte das Ergebnis der Funktion auch überprüft und war damit eigentlich einverstanden.
Aber selbst befüllen ginge natürlich auch, klar.
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!
Nach deiner Antwort gestern hatte ich auch gleich die Befürchtung, dass ich den Wert falsch recherchiert hatte.
Es war zumindest definitv der Verursacher meines Ursprungsproblems.
Danilo hat geschrieben:Hier mal ein Ausschnitt für das Füllen der Struktur ea.EXPLICIT_ACCESS:
[...]
Besten Dank, ich werde die Tage mal ein wenig damit "rumspielen".
Benutzeravatar
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

Beitrag von HeX0R »

*Ä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:

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
Vielen Dank nochmal an Danilo :allright:
Antworten