Re: SetEntriesInAcl_() falscher Parameter
Verfasst: 26.01.2013 17:25
@HeX0R
Lag es vielleicht an fehlendem Adminrecht?
Lag es vielleicht an fehlendem Adminrecht?
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Nee nee, natürlich hatte ich Adminrechte.RSBasic hat geschrieben:@HeX0R
Lag es vielleicht an fehlendem Adminrecht?
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.
Code: Alles auswählen
#CONTAINER_INHERIT_ACE | #OBJECT_INHERIT_ACE
Code: Alles auswählen
SetNamedSecurityInfo_(ServiceName, #SE_SERVICE, #DACL_SECURITY_INFORMATION, 0, 0, 0, 0)
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.
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
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... )
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.
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!
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:
[...]
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