NTFS Berechtigungen per Code ändern

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Infinity.

    NTFS Berechtigungen per Code ändern

    Hallo,

    mein Problem ist das ändern von NTFS Berechtigungen für bestimmte Unterverzeichnisse in ProgramFiles (Programme und Programme (x86)) sowie ProgramData unter Win 7. Hier ist was ich bisher habe.

    VB.NET-Quellcode

    1. Private Sub SetFolderNTFSPermissions(FolderPath As String, UserAccount As String)
    2. Dim FolderInfo As IO.DirectoryInfo = New IO.DirectoryInfo(FolderPath)
    3. Dim FolderAcl As New DirectorySecurity
    4. FolderAcl.AddAccessRule(New FileSystemAccessRule(UserAccount, FileSystemRights.Modify, InheritanceFlags.None, PropagationFlags.None, AccessControlType.Allow))
    5. 'FolderAcl.SetAccessRuleProtection(True, False) 'Kommentar entfernen um vorhandene Berechtigungen zu löschen
    6. FolderInfo.SetAccessControl(FolderAcl)
    7. End Sub


    Das Problem liegt darin, dass die Unterverzeichnisse von den übergeordneten erben. Der Code oben funzt gut bei Verzeichnissen, die nicht von oben erben. Auch neue Verzeichnisse direkt unter C:\ können geändert werden. In der GUI kann man diese Vererbung ja einfach unterbrechen, aber ich weiß nicht wie ich das per Code hinkriegen kann.

    Ich habe mir in MSDN schon nen Wolf angelesen, aber es will einfach net klappen. Soweit ich das Verstanden habe, sind die InheritanceFlags für das erben der ACE's von übergeordneten Objekten zuständig (wobei die Formulierung dazu in MSDN für mich nicht ganz klar ist). Das wäre eigentlich was ich brauche, nur funzt es nicht. Die PropagationFlags dagegen sind für das weitervererben der ACE's an untergeordnete Objekte zuständig (hier ist die Formulierung in MSDN klar). Wie dem auch sei, ich hab schon alle möglichen Kombinationen dieser Flags ausprobiert, aber die neuen Rechte werden meinem Verzeichnis nicht hinzugefügt. Es gibt auch keine Fehlermeldung - es passiert einfach gar nix. Kann mir dabei jemand helfen?

    Danke
    gonzo
    Wenn die Unterverzeichnisse automatisch erben, aber du das nicht willst (habe ich das richtig verstanden?), wieso dann nicht einfach sämtliche Unterverzeichnisse durchgehen und und die alte Berechtigung wieder herstellen.

    Du könntest bevor du irgendwas änderst erst mal checken, wie die alte Berechtigung aussieht und das speichern.

    VB.NET-Quellcode

    1. Dim OldAccessControl As DirectorySecurity = FolderInfo.GetAccessControl()


    Nach der Änderung kannst du dann den Unterverzeichnissen wieder die alte Berechtigung geben:

    VB.NET-Quellcode

    1. For Each SubDir As String In Directory.GetDirectories(FolderPath)
    2. Dim SubDirInfo As New DirectoryInfo(SubDir)
    3. SubDirInfo.SetAccessControl(OldAccessControl)
    4. Next
    Mein Problem ist, das ich Unterverzeichnissen von C:\Program Files (x86) neue ACE's hinzufügen will. Konkret gehts darum, normalen Usern auf das Verzeichnis, in dem mein Programm installiert wird, Vollzugriff zu gewähren. Aber eben nur auf das Verzeichnis meines Programmes. Dies klappt aber mit meinem Code nicht, weil mein Verzeichnis von C:\Program Files (x86) erbt. Diese Vererbung muß zuerst aufgehoben werden - ich weiß nur net wie.
    In der GUI kann man ja auch nicht direkt die Rechte ändern, sondern muß auch da erst mal die Vererbung von oben unterbrechen.
    Danke SystemUnknow, aber auf diese Codestücker bin ich in den letzten 2 Tagen schon öffters gestossen. Ich habe schon massenweise Beispiele ausprobiert und gelesen und gelessen und gelesen. In der Regel geht alles gut mit Verzeichnissen, die nicht von oben erben.

    Ich komme einfach nicht weiter. Ich will ja nicht unverschämt sein, aber es wäre echt nett, wenn hier jemand mal einen Code postet, der die ACL eines beliebigen Unterverzeichnisses von "C:\Program Files (x86)" ändert.

    Danke
    wenn du diese code nicht zum laufen bringst: dotnet-snippets.de/dns/ntfs-be…rdner-setzen-SID1197.aspx
    dann kann ich dir auch nicht mehr helfen !
    [line]-[/line]
    EDIT// Beispiele die ich in meinem letzten post gepostet habe, kannst du für jeden Verzeichnis/Unterverzeichnis berechtigung setzen.
    Schau dir Beispiele genauer an !

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „SystemUnknow“ ()

    ja, recht hast du. Der Code schein in Ordnung zu sein. Meiner, den ich oben gepostet habe, übrigens auch. Nach einingen weiteren Tests hab ich gemerkt, dass das Problem wo anders liegt, was es allerdings auch nicht einfacher macht.

    Also, wenn ich das Programm "Als Administrator ausführen" starte, funzt es wunderbar, wenn ichs normal mit nem Doppelkick starte gehts nicht. Komisch, da ich ja bereits als Admin angemeldet bin. Da man ja Installationen grundsätzlich mit nem Admin Account ausführen muß, hab ich das vorher nicht getestet.

    Na ja, damit hab ich jetzt ein neues Problem. Wie kann ich ein Programm dazu bringen, das es nur während der Installation zusätzlich noch mit der Option "Als Administrator ausführen" gestartet wird?

    SystemUnknow schrieb:

    Für was ?
    Ich werds mal versuchen zu erklären. Ist nicht ganz einfach und ich bin kein Weltmeister im "mich kurzfassen".
    Also mein Programm kommt mit ner mdb Datei auf die alle Benutzer Vollzugriff brauchen. Die Datenbank kann entwerder im Programmverzeichnis (Program Files (x86)) oder im ProgramData Verzeichnis abgelegt werden, die Probleme sind in beiden Fällen die selben. Ich muß den Usern auf das Verzeichnis, in dem die DB liegt, Vollzugriff geben und dazu muss die ACL geändert werden. Und das Ganze muß während oder unmittelbar nach der Installation des Programmes erfolgen. Auf jeden Fall bevor das Programm das erste mal gestartet wird.

    Das hab ich so gelöst: Im Setup-Projekt habe ich eine benutzerdefinierte Aktion während der Installation festgelegt (Install + Commit). Diese Aktion wird ausgeführt, sobald alle Dateien auf dem Zielcomputer installiert sind, aber bevor die Installation beendet ist. Hierbei wird der ACL des Installationsverzeichisses für jeden Benutzer ein Entry mit Vollzugriff hinzugefügt (mein Code im Post #1).
    Naja, und das Problem hierbei ist, das ich gerade herausgefunden habe, dass das Hinzufügen dieser ACEs eben nur funktioniert, wenn das Installationsprogramm (Setup.exe) "Als Administrator ausführen" gestartet wird. Dabei ist es egal, dass ich beim starten von Setup ohnehin schon als Admin angemeldet bin. Wenn ich nicht trotzdem "Als Admin ausführen" wähle, werden die Rechte für C\Prgram Files (x86)\ProgName nicht gesetzt. So komisch dass auch ist, ich verstehs ja auch nicht. Als angemeldeter Administrator muß man trotzdem auf "Als Admin ausführen" gehen, damit das Setup alles macht, was es machen soll.

    So, ich hoffe jetzt wird einigermaßen klar was ich will und wo das Probem liegt. Nochmals auf den Punkt gebracht die Frage: Wie bringe ich mein Setup dazu, das es automatisch "Als Admin ausführen" gestartet wird? Nur ein einziges mal bei der Installation der eigentlichen Anwendung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „gonzo16“ ()

    Um ein Programm "als Administrator auszuführen" gibt es 3 Möglichkeiten (ok es gibt sicher auch noch mehr, aber das sind die einfachsten):

    1. Programmname: Setup.exe
    Dann erkennt Windows Vista bzw. 7 automatisch, dass es sich um eine Installation handelt, und die müssen (wie auch deine) in der Regel als Administrator ausgeführt werden. Davon ist aber abzuraten, weil der User die Datei auch umbenennen kann oder der Name bei einem Download nicht richtig übernommen wird.

    2. Eine Einstellung in der Manifest-Datei setzen
    Das ganze ist hier erklärt: csharp-tricks.blogspot.de/2010…administratorrechten.html

    3. Das Programm neu starten mit Adminrechten
    Das ganze ist hier erklärt: csharp-tricks.blogspot.de/2011…nistratorrechten-neu.html