Seite 1 von 2

SetEntriesInAcl_() falscher Parameter

Verfasst: 26.01.2013 00:10
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?

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 26.01.2013 13:56
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.

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 26.01.2013 15:19
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!

Re: SetEntriesInAcl_() falscher Parameter

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

GELÖSCHT

Verfasst: 26.01.2013 16:01
von mirca
GELÖSCHT

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 26.01.2013 16:41
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?

GELÖSCHT

Verfasst: 26.01.2013 16:53
von mirca
GELÖSCHT

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 26.01.2013 16:59
von ts-soft
Mit sc sollte man doch jeden Dienst löschen können, obwohl ich die lieber direkt in der Registry rauswerfe.

Re: SetEntriesInAcl_() falscher Parameter

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

Re: SetEntriesInAcl_() falscher Parameter

Verfasst: 26.01.2013 17:23
von HeX0R
sc hatte mir das Entfernen verweigert, aus der Registry konnte ich ihn aber schmeissen.