Rechte auf ProgramData setzen



  • Hallo,

    ich habe unter VS2010 eine Anwendung in c# mit .net 4.5 erstellt, die von einem User gewartet wird aber von mehreren
    Usern genutzt werden soll. Für diese Anwendung werden Dateien im Verzeichnis "c:\ProgramData" und dort in weiteren
    Unterverzeichnissen abgelegt. Das funktioniert auch soweit, wie der Wartungs-User die Anwendung nutzt und die Daten
    pflegt.

    Wenn jetzt aber ein anderer User die Anwendung startet, kann er nur noch lesend auf die Daten zugreifen, weil er ja nicht
    Eigentümer der Daten ist. Für die Anwendung ist es jedoch erforderlich, dass alle Anwender auch Schreibrechte in diesem
    Verzeichnis und den Unterverzeichnissen bekommen. Ich kann zwar jetzt in Windows die Rechte manuell setzten, jedoch
    sind diese nach einem Windows-Update wieder zurückgesetzt.

    Jetzt würde ich gerne von der Anwendung aus die Rechte auf das Verzeichnis und den Unterverzeichnissen setzen. Das
    funktioniert über

      DirectoryInfo dInfo = new DirectoryInfo(DataDirectory);
      DirectorySecurity dSecurity = dInfo.GetAccessControl();
    
      dSecurity..AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), 
                                                 FileSystemRights.Read | FileSystemRights.Write | FileSystemRights.CreateFiles | 
                                                 FileSystemRights.Modify | FileSystemRights.AppendData, 
                                                 InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, 
                                                 PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
      dInfo.SetAccessControl(dSecurity);
    

    allerdings nur innerhalb der Entwicklungsumgebung (DataDirectory ist das Verzeichnis, auf dass alle schreibend zugreifen
    sollen). Wenn ich die Anwendung nach der Installation auf dem Arbeitsnotebook starte, kommt die Fehlermeldung
    "unauthorizedaccessexception". Die Anwendung darf also die Rechte nicht setzen.Gibt es hier eventuell eine Lösung dafür? Das Verschieben der Daten in ein benutzereigenes Verzeichnis ist nicht möglich, da alle Benutzer auf den selben
    Datenstand zugreifen müssen und der Wartungsuser auch nur als normaler Benutzer angemeldet ist und somit keinen
    Zugriff auf die Daten der anderen User hat.

    nhol



  • Dein Installationsprogramm ist verantwortlich die Rechte für dieses Verzeichnmis korrekt zu setzen.

    Nachträglich kann dies natürlich nur noch ein Admin oder der Eigentümer.
    D.h. auch Deiner Anwendung kann dies wenn sie elevated gestartet ist (so wie der Installer).

    Siehe auch hier:
    https://stackoverflow.com/questions/22107812/privileges-owner-issue-when-writing-in-c-programdata



  • Besten Dank. Ich werde mir das mal genauer ansehen.

    nhol



  • Alternativ die Daten vielleihct in ein Verzeichnis legen auf das alle User Schreibzugriff haben. C:\Users\Public bspw.



  • @sidewinder Halte ich für nicht so ideal. Dieser Ordner wird evtl. Auch im Netz freigegeben und ist eben ein individueller Datenordner.
    Interne Programmdaten, die Rechner spezifisch und benutzerübergreifend sind gehören nach ProgramData.
    Siehe Specs in der MSDN



  • Ich habe das jetzt mal soweit hinbekommen, dass ich als Ersteller die Rechte setzen kann. Die Rechte bleiben
    auch bestehen, allerdings nur, bis zum nächsten Windows-Update. Danach muss ich als Ersteller wieder
    einmal das Programm starten, um die Rechte zu setzen.

    Genau dass ist jetzt aber mein Problem. Das Notebook ist meistens bei einem anderen User im Einsatz, wenn
    das Windows-Update eingespielt wurde. Jetzt kann das Programm die Rechte durch den User nicht mehr neu
    setzen. Dieses Problem lies sich leider auch nicht durch den Installer beheben (ich nutze als Installer den
    Visual Studio Installer aus VS2010 über Hinzufügen Setup-Projekt).



  • Das kann ich nicht bestätigen. Wenn Du die Rechte auf ein Unterverzeichnis änderst und sagst, dass die Rechte von oben vererbt werden sollen muss es gehen.



  • sorry das ich erst jetzt eine Rückmeldung dazu geben kann.

    Ich habe das mit den Rechten und der Vererbung soweit hinbekommen, wie oben schon beschrieben. Allerdings
    werden die Rechte des übergeordneten Verzeichnisses bei einem Windows-Update, aber auch bei einem Update unserer
    Gruppenrichtlinien (durch unsere IT) wieder auf die Standard-Werte zurückgesetzt und an die Unterverzeichnisse vererbt.
    Danach ist es nur noch dem Ersteller des Verzeichnisses möglich, die Rechte wieder zu ändern. Hier habe ich bisher noch
    keine passende Lösung gefunden.