Seite 2 von 2

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 26.01.2013 17:25
von RSBasic
@HeX0R
Lag es vielleicht an fehlendem Adminrecht?

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 26.01.2013 17:28
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.

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 26.01.2013 17:34
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.

GELÖSCHT

Verfasst: 26.01.2013 17:34
von mirca
GELÖSCHT

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 26.01.2013 17:51
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.

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 26.01.2013 20:13
von HeX0R
HaHaHa, zwei Idioten!
Genau so, also mit "Administrator", ist mir das auch passiert :mrgreen:

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 27.01.2013 01:05
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.

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 27.01.2013 09:47
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.

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 27.01.2013 14:11
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".

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 28.01.2013 22:34
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: