FileDaclEx.Add rückgängig machen

Post Reply
RBiebach
Posts: 13
Joined: 16. Jan 2007, 16:23
Contact:

FileDaclEx.Add rückgängig machen

Post by RBiebach » 16. Dec 2009, 09:48

Hallo,

ich verweigere den Hauptbenutzern für das %CommonStartMenu% die Rechte 'Löschen' und 'Unterordner und Dateien löschen'.

Dies soll verhindern, das sich unserere Hauptbenutzer die Verknüpfungen aus dem %CommonStartMenu% auf den lokalen Desktop ziehen und so für andere Benutzer unerreichbar machen. Dies klappt auch prima.

Nun will ich bei der Deinstallation des Pakets den Ursprungszustand wieder herstellen. Leider weiß ich nicht wie.

In der Hilfe steht auch nur FileDaclEx.Add aber kein .Del und FileDacl.Del sagt immer 'Falsche Flags!'.

Hier mal mein Versuch:

Code: Select all

[Product]
#Set:Product
#Security:Product
#Security:DelProduct, DELETE

[Set:Product]
ShowPicture 1, OrdnerSchloss256.bmp, 40, , 100%, 100%, , VCENTER

[Security:Product]
FileDaclEx.Add ("%CommonStartMenu%", "%$LocalPowerUsers%", DENY, DELETE_CHILD DELETE, SUB_CONTAINERS_AND_OBJECTS_INHERIT)

[Security:DelProduct]
FileDacl.Del("%CommonStartMenu%", "%$LocalPowerUsers%", DENY)
Hab auch schon versucht: FileDacl.Del("%CommonStartMenu%", "%$LocalPowerUsers%", DENY, DELETE_CHILD DELETE)
oder: FileDaclEx.Add("%CommonStartMenu%", "%$LocalPowerUsers%", SET, DELETE_CHILD DELETE, SUB_CONTAINERS_AND_OBJECTS_INHERIT) -> klappt aber nicht, da 'Verweigern' noch drin steht und natürlich höhere Prio hat.

Kann mir jemand helfen?

Danke und Gruß
Ralf

Walter_Schulz
Posts: 876
Joined: 17. Dec 2004, 12:29
Contact:

Post by Walter_Schulz » 16. Dec 2009, 15:13

Wie sieht es aus, wenn per REVOKE alle dortigen DACL-Eintraege der Hauptbenutzer geloescht werden?

RBiebach
Posts: 13
Joined: 16. Jan 2007, 16:23
Contact:

Post by RBiebach » 18. Dec 2009, 16:00

Also, ich hab mal untersucht was REVOKE so macht. Als Ergebnis habe ich jetzt zwei Probleme entdeckt.

1. Der Befehl FileDaclEx.Add funktioniert nicht in einer Deinstallation.

Code: Select all

[Product]
#Set:Product
#Security:Product
#Security:DelProduct, DELETE

[Set:Product]
ShowPicture 1, OrdnerSchloss256.bmp, 40, , 100%, 100%, VCENTER

[Security:Product]
FileDaclEx.Add ("%CommonStartMenu%", "%$LocalPowerUsers%", GRANT, WRITE_DAC, SUB_CONTAINERS_AND_OBJECTS_INHERIT)

[Security:DelProduct]
-FileDaclEx.Add ("%CommonStartMenu%", "%$LocalPowerUsers%", REVOKE, ALL, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
Die Installation klappt. Bei der Deinstallation kommt die Fehlermeldung:
-----------------------------------------------
Kann Sicherheitsbefehl nicht ausführen:

-FileDaclEx.Add ("C:\Dokumente und Einstellungen\All Users\Startmenü", "Hauptbenutzer", REVOKE, ALL, SUB_CONTAINERS-AND-OBJECTS-INHERIT)

Windows-Fehlercode: 0
-----------------------------------------------
Speziell die '0' find ich extrem aussagekräftig. Lasse ich das '-' weg, passiert gar nichts.

Also habe ich 2 Installationspakete gebaut. Das Erste setzt Berechtigungen,

Code: Select all

[Security:Product]
FileDaclEx.Add ("%CommonStartMenu%", "%$LocalPowerUsers%", GRANT, WRITE_DAC, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
das Zweite nimmt sie mit Revoke wieder weg.

Code: Select all

[Security:Product]
FileDaclEx.Add ("%CommonStartMenu%", "%$LocalPowerUsers%", REVOKE, ALL, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
Klappt auch. :D Also das Ganze zusätzlich mit DENY getestet,

Code: Select all

[Security:Product]
FileDaclEx.Add ("%CommonStartMenu%", "%$LocalPowerUsers%", GRANT, WRITE_DAC, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
FileDaclEx.Add ("%CommonStartMenu%", "%$LocalPowerUsers%", DENY, DELETE_CHILD DELETE, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
klappt nicht. :x Das zweite Paket (s.o.) entfernt nur die gesetzten Zulassen-Rechten.

Was aber gar nicht funktioniert ist das Entfernen von gesetzten Verweigerungsrechten. Aber genau das macht DENY, es setzt Verweigern-Rechte. Entgegen der Hilfe werden also keine Rechte entzogen, sondern nur eine 'andere Art' von Rechten gesetzt. Und das bleibt dann so bis ans Windows-Ende.

Hat irgend jemand schon mal so was gemacht? Ich würde die Aktion schon gern auch rückgängig machen können, ohne persönlich an jeden Rechner zu laufen.

Danke, schönes WE, Gruß
Ralf

Walter_Schulz
Posts: 876
Joined: 17. Dec 2004, 12:29
Contact:

Post by Walter_Schulz » 21. Dec 2009, 12:39

@matrix42-support:
Bug?

Erste INF:
FileDaclEx.Add ("%CommonStartMenu%", "%$LocalPowerUsers%", DENY, DELETE_CHILD DELETE, SUB_CONTAINERS_AND_OBJECTS_INHERIT)

Zweite INF:
FileDaclEx.Add ("%CommonStartMenu%", "%$LocalPowerUsers%", REVOKE)

Laut Doku sollte REVOKE *alle* Eintraege der DACL fuer den angegebenen Namen loeschen, was offensichtlich nicht funktioniert. Nach dem Ausfuehren der zweiten Inf ist die DACL unveraendert.
In der mir vorliegenden Doku koennte ein Syntax-Beispiel fuer REVOKE bei FileDaclEx.Add zumindestens nicht schaden ... ;-)

@RBiebach: Bitte die Doku, insbesondere die Help zur Setup.inf beachten. Dort steht ausdruecklich drin, dass FileDaclEx.Add nur bei der Installation verwendet wird.
EDIT: Einen Call beim Support ueber die offiziellen Supportwege aufmachen?

Ciao!
Walter Schulz

RBiebach
Posts: 13
Joined: 16. Jan 2007, 16:23
Contact:

Post by RBiebach » 21. Dec 2009, 15:07

Das der Befehl nur bei der Installation durchgeführt wird, habe ich gelesen. Aber ich dachte, probiers halt mal. Steht ja auch sonst nicht alles drin :)

Call ist schon aufgemacht.

Die Beispiele für FileDaclEx.Add sind schon ein bisschen mager, "Jeder" "Grant" "All" bringt fürs Verständnis herzlich wenig.

Sobald ich was weiß, werd ich's hier posten.

Danke schon mal fürs mitüberlegen, Gruß
Ralf

skyfreak
Posts: 1
Joined: 31. Dec 2009, 14:57
Contact:

Die Lösung

Post by skyfreak » 31. Dec 2009, 15:19

Die Lösung ist eigentlich ganz übersichtlich, erschließt sich aber nicht unbedingt, was zum einen auf eine Merkwürdigkeit in Windows liegt, zum anderen an den nicht dokumentierten ".Del" Befehlen. Zunächst einmal ist festzustellen, dass der Befehl

[Security:DelProduct]
FileDacl.Del("%CommonStartMenu%", "%$LocalPowerUsers%", DENY)

falsch ist. Denn hier wird der alte FileDacl verwendet, nicht der neue FileDaclEx. Der hat aber andere Flags und die sind nicht kompatibel. Daher die Warnung: "Falsche Flags".

Der Befehl FileDaclEx bildet eigentlich nur einen Windows Call ab, der dann genau so ausgeführt wird, wie wenn man ihn "mit Hand" programmieren würde. Es handelt sich um "SetNamedSecurityInfo" und einigen initialisierungen vorher. Dort könnte man im MSDN nachsehen, was es da so gibt.

Das merkwürdige an diesem Befehl ist, dass es nicht zu gelingen scheint, einen DENY mit REVOKE wieder zu entfernen. Es ist mir zwar unklar, warum das so ist, jedoch kann man sich mit einem Trick behelfen. Wenn man das DENY in ein GRANT "umwandelt", so kann man dieses dann mit einem REVOKE entfernen.

Im Endeffekt läuft es also darauf hinaus: Beim Installieren DENY, beim Deninstallieren zunächst GRANT, dann REVOKE.

Zwei Dinge müssen dabei jedoch beachtet werden. Erstens: Beim Deinstallieren werden die Befehle in umgekehrter Reihenfolge abgearbeitet, so dass man zunächst das REVOEK, dann das GRANT Schreiben muss (wenn man von oben nach unten liest).
Zweitens: Die ".Del" Befehle werden tatsächlich nur beim Deinstallieren ausgeführt, die ".Add" Befehle beim Installieren. Ein "-" davor bei der Deinstallation usw. ist nicht nötig, man braucht noch nicht einmal zwei eigene Abschnitte. Im Endeffekt lautet der Code also:

Code: Select all

[Security:Product]
FileDaclEx.Add("%CommonStartMenu%", "%$LocalPowerUsers%", DENY, DELETE_CHILD DELETE, SUB_CONTAINERS_AND_OBJECTS_INHERIT)

FileDaclEx.Del("%CommonStartMenu%", "%$LocalPowerUsers%", REVOKE)
FileDaclEx.Del("%CommonStartMenu%", "%$LocalPowerUsers%", GRANT, DELETE_CHILD DELETE, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
Vielleicht nicht ganz einfach, aber es funktioniert.

RBiebach
Posts: 13
Joined: 16. Jan 2007, 16:23
Contact:

Lösung gefunden

Post by RBiebach » 04. Jan 2010, 15:29

Hallo skyfreak,

es klappt tatsächlich. Da soll einer drauf kommen. Hier der Abschnitt, mit dem es funzt.

Code: Select all

[Security:Product]
;Hauptbenutzer wird auf die Rechte eines Benutzers eingestellt für 'All Users\\Desktop' und 'All Users\\Startmenü'
FileDaclEx.Add ("%CommonDesktop%", "%$LocalPowerUsers%", DENY, ADD_FILE ADD_SUBDIRECTORY APPEND_DATA WRITE_ATTRIBUTES WRITE_EA DELETE_CHILD DELETE, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
FileDaclEx.Add ("%CommonStartMenu%", "%$LocalPowerUsers%", DENY, ADD_FILE ADD_SUBDIRECTORY APPEND_DATA WRITE_ATTRIBUTES WRITE_EA DELETE_CHILD DELETE, SUB_CONTAINERS_AND_OBJECTS_INHERIT)


FileDaclEx.Del ("%CommonStartMenu%", "%$LocalPowerUsers%", REVOKE, ALL, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
FileDaclEx.Del ("%CommonStartMenu%", "%$LocalPowerUsers%", GRANT, ADD_FILE ADD_SUBDIRECTORY APPEND_DATA WRITE_ATTRIBUTES WRITE_EA DELETE_CHILD DELETE, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
FileDaclEx.Del ("%CommonDesktop%", "%$LocalPowerUsers%", REVOKE, ALL, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
FileDaclEx.Del ("%CommonDesktop%", "%$LocalPowerUsers%", GRANT, ADD_FILE ADD_SUBDIRECTORY APPEND_DATA WRITE_ATTRIBUTES WRITE_EA DELETE_CHILD DELETE, SUB_CONTAINERS_AND_OBJECTS_INHERIT)
Ich musste allerdings an das 'REVOKE' noch 'ALL' und die Vererbung hängen, Sonst hat er den GRANT-Eintrag immer stehen lassen.

Vielen Dank an alle,

Gruß
Ralf

Post Reply

Return to “Paketierung”

Who is online

Users browsing this forum: No registered users and 5 guests