SetEntriesInAcl_() falscher Parameter

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
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:

SetEntriesInAcl_() falscher Parameter

Beitrag von HeX0R »

Ich werde bald wahnsinnig... :evil:

Ich versuche verzweifelt den Code von folgender Seite nach PB zu übersetzen:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Das hier habe ich:

Code: Alles auswählen

#DACL_SECURITY_INFORMATION = $00000004
#SET_ACCESS                = $00000002
#NO_INHERITANCE            = $8000000B
#HEAP_ZERO_MEMORY          = $00000008

Structure _TRUSTEE
	*pMultipleTrustee;
	MultipleTrusteeOperation.l
	TrusteeForm.l
	TrusteeType.l
	*ptstrName
EndStructure

Structure EXPLICIT_ACCESS
	grfAccessPermissions.l
	grfAccessMode.l
	grfInheritance.l
	Trustee._TRUSTEE
EndStructure

Procedure Modify_DAC(ServiceName.s, AccessGroup.s = "GUEST")
	Protected sStatus.SERVICE_STATUS
	Protected Result, schSCManager, schService
	Protected *psd.SECURITY_DESCRIPTOR, dwBytesNeeded, dwSize, bDaclPresent, *pacl.ACL, bDaclDefaulted
	Protected ea.EXPLICIT_ACCESS, dwError, *pNewAcl.ACL, sd.SECURITY_DESCRIPTOR

	schSCManager = OpenSCManager_(0, 0, #SC_MANAGER_ALL_ACCESS)
	If schSCManager
		schService = OpenService_(schSCManager, @ServiceName, #READ_CONTROL | #WRITE_DAC)
		If schService
			;Get the current security descriptor.

			If QueryServiceObjectSecurity_(schService, #DACL_SECURITY_INFORMATION, @*psd, 0, @dwBytesNeeded) = 0
				If GetLastError_() = #ERROR_INSUFFICIENT_BUFFER
					dwSize = dwBytesNeeded;
					*psd   = AllocateMemory(dwSize)
					If *psd
						Result = QueryServiceObjectSecurity_(schService, #DACL_SECURITY_INFORMATION, *psd, dwSize, @dwBytesNeeded)
					EndIf
				EndIf
			EndIf

			If Result
				Result = 0
				;Get the DACL.
				If GetSecurityDescriptorDacl_(*psd, @bDaclPresent, @*pacl, @bDaclDefaulted)
					;Build the ACE.
					BuildExplicitAccessWithName_(@ea, @AccessGroup, #SERVICE_START | #SERVICE_STOP | #READ_CONTROL | #DELETE, #SET_ACCESS, #NO_INHERITANCE)
					dwError = SetEntriesInAcl_(1, @ea, *pacl, @*pNewAcl)
					If dwError <> #ERROR_SUCCESS
						Debug dwError ;<- 87 = Falscher Parameter!
					Else
						;Initialize a new security descriptor.
						If InitializeSecurityDescriptor_(@sd, #SECURITY_DESCRIPTOR_REVISION)
							;Set the new DACL in the security descriptor.
							If SetSecurityDescriptorDacl_(@sd, #True, *pNewAcl, #False)
								;Set the new DACL For the service object.
								Result = SetServiceObjectSecurity_(schService, #DACL_SECURITY_INFORMATION, @sd)
							EndIf
						EndIf
					EndIf
				EndIf
			EndIf

			If *psd
				FreeMemory(*psd)
			EndIf
			If *NewAcl
				LocalFree_(*NewAcl)
			EndIf

			CloseServiceHandle_(schService)
		EndIf
		CloseServiceHandle_(schSCManager)
	EndIf
	ProcedureReturn Result
EndProcedure
Problem ist diese Zeile:

Code: Alles auswählen

dwError = SetEntriesInAcl_(1, @ea, *pacl, @*pNewAcl)
das würfelt immer Fehler 87 (falscher Parameter) heraus, habe schon die verrücktesten Dinge probiert, bekomme diesen Fehler aber einfach nicht weg.
Hat von Euch irgendjemand eine Idee?
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: SetEntriesInAcl_() falscher Parameter

Beitrag von Danilo »

Das Problem ist evtl. das Flag #NO_INHERITANCE im Aufruf von BuildExplicitAccessWithName_(). Kannst Du das prüfen?
Probier mal mit 0, das geht bei mir hier.

EDIT:
Hier mal noch ein einfacheres/kleineres Modify_DAC() zum rumspielen, nach der Methode im Code von http://support.microsoft.com/kb/295004/de

Code: Alles auswählen

#DACL_SECURITY_INFORMATION = $00000004
#SET_ACCESS                = $00000002
;#NO_INHERITANCE            = $8000000B
;#HEAP_ZERO_MEMORY          = $00000008

EnableExplicit

Structure _TRUSTEE
   *pMultipleTrustee;
   MultipleTrusteeOperation.l
   TrusteeForm.l
   TrusteeType.l
   *ptstrName
EndStructure

Structure EXPLICIT_ACCESS
   grfAccessPermissions.l
   grfAccessMode.l
   grfInheritance.l
   Trustee._TRUSTEE
EndStructure

Procedure Modify_DAC(ServiceName.s, user.s = "GUEST")
   Protected *psd.SECURITY_DESCRIPTOR, *pacl.ACL, *pNewAcl.ACL
   Protected ea.EXPLICIT_ACCESS, dwError

        #SE_SERVICE = 2
        Debug GetNamedSecurityInfo_(ServiceName, #SE_SERVICE, #DACL_SECURITY_INFORMATION, 0, 0, @*pacl, 0, @*psd)
        BuildExplicitAccessWithName_(@ea, @user, #SERVICE_START | #SERVICE_STOP | #DELETE | #READ_CONTROL , #SET_ACCESS, 0);#NO_INHERITANCE)
        dwError = SetEntriesInAcl_(1, @ea, *pacl, @*pNewAcl)
        If dwError <> #ERROR_SUCCESS
          Debug dwError ;<- 87 = Falscher Parameter!
        Else
          Debug "OK"
        EndIf
        Debug SetNamedSecurityInfo_(ServiceName, #SE_SERVICE, #DACL_SECURITY_INFORMATION, 0, 0, *pNewAcl, 0)
               
        If *psd
            LocalFree_(*psd)
        EndIf
        If *pNewAcl
            LocalFree_(*pNewAcl)
        EndIf

EndProcedure

Procedure enumServices()
    Protected schSCManager, pcbBytesNeeded.l, lpServicesReturned.l, i
    Protected *mem.ENUM_SERVICE_STATUS
    schSCManager = OpenSCManager_(0, 0, #SC_MANAGER_CONNECT|#SC_MANAGER_ENUMERATE_SERVICE)
    If schSCManager
        Debug schSCManager
    #SERVICE_WIN32 = $30
        EnumServicesStatus_(schSCManager,#SERVICE_WIN32,#SERVICE_STATE_ALL,0,0,@pcbBytesNeeded,@lpServicesReturned,0)
        If pcbBytesNeeded
            *mem = AllocateMemory(pcbBytesNeeded)
            If *mem
                EnumServicesStatus_(schSCManager,#SERVICE_WIN32,#SERVICE_STATE_ALL,*mem,pcbBytesNeeded,@pcbBytesNeeded,@lpServicesReturned,0)
                Debug lpServicesReturned
                If lpServicesReturned
                    For i = 1 To lpServicesReturned
                        Debug PeekS(*mem\lpServiceName)
                        Debug PeekS(*mem\lpDisplayName)
                        Debug *mem\ServiceStatus\dwCurrentState
                        Debug "---"
                        *mem + SizeOf(ENUM_SERVICE_STATUS)
                    Next
                EndIf
            EndIf
        EndIf
    EndIf
EndProcedure



;enumServices()
;Modify_DAC("myService")
Mit Admin-Rechten ausführen / kompilieren.
Zuletzt geändert von Danilo am 26.01.2013 15:46, insgesamt 2-mal geändert.
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 »

Ey cool, vielen Dank! :allright:

Ich hatte bereits mit deinem ersten Verbesserungsvorschlag gespielt und dabei einen Dienst erstellt, den ich ums verrecken nicht mehr löschen konnte ;)
Da musste ich jetzt erst mal ne halbe Stunde kämpfen.

Aber das hier funktioniert nun 1A!

Muchas Gracias!
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: SetEntriesInAcl_() falscher Parameter

Beitrag von Danilo »

HeX0R hat geschrieben:Ich hatte bereits mit deinem ersten Verbesserungsvorschlag gespielt und dabei einen Dienst erstellt, den ich ums verrecken nicht mehr löschen konnte ;)
Da musste ich jetzt erst mal ne halbe Stunde kämpfen.
Wie hast Du es wieder hinbekommen?

Ich habe mir den Windows Search Dienst (WSearch) geblockt. Access Denied. Deshalb wollte Outlook auch nicht mehr starten.
Musste Windows Search über das Control Panel deinstallieren (Uninstall a program > Turn Windows features on and off)
und jetzt geht alles wieder. Mal probieren was passiert, wenn ich es wieder installiere.

Also besser nicht mit dem Service "WSearch" testen! :D
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
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
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: SetEntriesInAcl_() falscher Parameter

Beitrag von NicTheQuick »

mirca hat geschrieben:@ Danilo
Warum nutzt du eine englische Windows Version?
Ist das gecrackt ...
Ein bisschen dreist nach sowas zu fragen, meinst du nicht?
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
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 »

Mit sc sollte man doch jeden Dienst löschen können, obwohl ich die lieber direkt in der Registry rauswerfe.
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
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: SetEntriesInAcl_() falscher Parameter

Beitrag von Danilo »

mirca hat geschrieben:@ Danilo
Warum nutzt du eine englische Windows Version?
Ich habe die Sprachen Deutsch, Englisch und Thai installiert und kann
zwischen diesen umschalten.
Nutze aber eigentlich nur Englisch, einfach aus Gewohnheit.
Bei PB nutze ich auch die englische Installation. So habe ich
auch die originale Hilfe von Fred und muss nicht noch mit
eventuellen Übersetzungsfehlern rechnen, da dieser Layer weg fällt.
Beim Programmieren ist bis hin zu den Schlüsselwörtern (If, EndIf, While, ..)
auch alles Englisch. Bei einer deutschen Hilfe zum Programmieren muss
ich manchmal erst englische Begriffe im Kopf zurück übersetzen, während
ich in der englischen Hilfe einfach flüssig lesen kann.

Da viele Programme nur in Englisch verfügbar sind (oder waren)
und man als Entwickler sowieso den ganzen Tag Englisch liest (Foren,
Blogs, Entwickler-Dokumentationen, Bücher uvm.), nutze ich schon ewig
Englisch auch für's OS).
Habe auch schon schlechte Erfahrung gemacht. Beispielsweise Visual Studio
in Deutsch installiert gehabt. Dann konnte ich mal englische Addons nicht
installieren, oder neue Features von Microsoft kamen erst in der englischen
Version raus und die deutsche Version 2 Monate später (SDKs und sowas).
Also gleich alles Englisch, dann gibt es diese Probleme nicht und man muss
nicht 2 Monate warten bis man etwas Neues ausprobieren kann, während der
Rest der VisualStudio-Gemeinde schon fleissig darüber bloggt und Apps bastelt.

Bei Entwicklerbüchern gab es früher gutes Zeug nur in Englisch. Das deutsche
Angebot waren meist nur Anfängersachen. In den letzten Jahren ist es etwas
besser geworden und es gibt immer mehr Bücher auch in Deutsch. Entweder
übersetzt, oder auch direkt von manchen deutschen Autoren.
Die besten Perlen für Entwickler sind aber noch immer nur auf Englisch verfügbar.
Das wird wohl auch so bleiben, da sich eine Übersetzung nur für den Massenmarkt
wirklich lohnt, nicht zu fortgeschrittenen Spezialthemen wie Compilerbau und -optimierungen.
mirca hat geschrieben:Ist das gecrackt
Das nennt sich "MSDN Abo".
mirca hat geschrieben:oder sieht das einfach cool aus?
Deutsch ist doch irgendwie blöd, oder? :D
Probier z.B. mal deutsche Filme zu schauen! Nicht nur mit deutscher Sprache, sondern
in Deutschland produzierte Filme, Serien, Shows. Fast alles Müll.
Ich muss da meist nach spätestens 10 Minuten aus schalten, weil es mir einfach zu blöd ist.
mirca hat geschrieben:Deutsch ist deine Muttersprache liege ich da richtig?
Ja. Ist das sehr schlimm?
mirca hat geschrieben:Ich frag nur weil ich nämlich jemandem kenne der nur deshalb eine
englische Version nutzt weil es 'cooler' aussieht.
Ich glaube mit bald 36 Jahren sind einem andere Sachen wichtig.
Da ich keine Freunde habe, sieht es hier sowieso niemand. 8)

Wie gesagt, da für Entwickler eh das meiste Angebot auf Englisch verfügbar ist,
kann man auch gleich komplett umsteigen. Wohl eine Sache der Gewohnheit,
aber je mehr Du auf Englisch gelesen hast, desto flüssiger kannst Du damit arbeiten.
Und dann kommt der Tag, da kannst Du mit Englisch besser arbeiten als mit Deutsch...
Zuletzt geändert von Danilo am 26.01.2013 17:23, insgesamt 1-mal geändert.
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 »

sc hatte mir das Entfernen verweigert, aus der Registry konnte ich ihn aber schmeissen.
Antworten