none
Ordnerberechtigungen setzen Windows Server 2008 SP2 RRS feed

  • Frage

  • Hallo,
    ich möchte Dateirechte auf einen Windows Server 2008 SP2 setzen.

    Die Applikation (mit .NET V4) wird mit Adminrechten gestartet (Application.manifest < requestedExecutionLevel level="requireAdministrator" uiaccess="false">).
    Der Benutzer wird im Code zuvor angelegt, existiert also. Der Benutzer ist in keiner Gruppe drin. Ich habe es auch mit einen Benutzer aus der Gruppe Users / Benutzer probiert, leider ohne Erfolg.

    Warum gelingt es mir nicht, mit den folgenden Zeilen dem Benutzer alle Dateirechte zu geben?

    Wenn ich den Ornerberechtigungen aufmache, sehe ich den angelegten Benutzer. Dieser hat keine Berechtigungen. 

        string folder = @"D:\test";
        string user = Environment.MachineName + @"\" + localUserName;
        FilesystemSecurity.AddDirectorySecurity(folder, user, FileSystemRights.FullControl, AccessControlType.Allow);


        public void AddDirectorySecurity(string directoryPath, string identity,
          System.Security.AccessControl.FileSystemRights fileSystemRights,
       System.Security.AccessControl.AccessControlType accessControlType)
        {
          // Create a new DirectoryInfo object.
          System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo(directoryPath);

          // Get a DirectorySecurity object that represents the current security settings.
          System.Security.AccessControl.DirectorySecurity dirSecurity = dirInfo.GetAccessControl();

          // Add the FileSystemAccessRule to the security settings. 
          dirSecurity.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule(identity,
       fileSystemRights, accessControlType));

          // Set the new access settings.
          dirInfo.SetAccessControl(dirSecurity);
        }

    Leider habe ich nicht so viel Glück wie der User hier: http://social.msdn.microsoft.com/Forums/de-AT/visualcsharpde/thread/4728f330-8734-4a32-8167-6a0ca74f29cb

    Habt Ihr Tips für mich?

    Danke

    Andreas

    Sonntag, 16. Januar 2011 19:47

Antworten

  • Vielen Dank für Eure Hilfe. Ich habe viel gelernt ;-)

    Es lag letztenendes an den Flags:

    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit  und  PropagationFlags.None

    Wenn ich die so übergebe, werden die Rechte gesetzt.

     

    Gruß

    Andreas

     

    • Als Antwort markiert AndreasM85 Mittwoch, 19. Januar 2011 20:44
    Mittwoch, 19. Januar 2011 20:44

Alle Antworten

  • Hallo Andreas,

    mal ein funktionierender Code aus alten Threads kopiert:

    private void Form1_Load(object sender, EventArgs e)
    {
      SecurityIdentifier sidBenutzer = new SecurityIdentifier(
      WellKnownSidType.BuiltinUsersSid, null);
      SetPermissionFolder(@"c:\Test", sidBenutzer);
    }
    
    private void SetPermissionFolder(string path, IdentityReference user)
    {
      DirectoryInfo myDirectoryInfo = new DirectoryInfo(path);
      DirectorySecurity myDirectorySecurity =
        myDirectoryInfo.GetAccessControl();
      FileSystemRights rights = FileSystemRights.Read |     
        FileSystemRights.Modify;
      myDirectorySecurity.AddAccessRule(new FileSystemAccessRule(
        user, rights,AccessControlType.Allow));
      myDirectoryInfo.SetAccessControl(myDirectorySecurity);
    }
    
    

    [Verzeichnisse Berechtigung weitergeben]
    http://www.ms-news.net/f824/verzeichnisse-berechtigung-weitergeben-9231655.html


    ciao Frank
    Montag, 17. Januar 2011 09:31
  • Hallo Andreas,

    Da kann so manches dazwischenfunken, schwer aus der Ferne zu sagen...

    Da Du aber in Deinem Beitrag einerseits keine Ausnahmen erwähnst und andererseits die Rechtevergabe auch mit einem "normalen" Benutzer keinen sichtbaren Erfolg bringt (muss nicht heißen dass sie fehlschlägt), nehme ich an, dass dem betroffenen Benutzer entweder direkt oder in geerbter Form (explizit oder über Gruppenzugehörigkeit) die Rechte verweigert wurden. Kann das sein? - In einem solchen Fall müßtest Du die Verweigerungs-ACEs erst rausnehmen bevor Du die neue Zulassungs-ACE hinzufügst:

    FileSystemAccessRule accessRuleDeny =
      new FileSystemAccessRule(identity, fileSystemRights, AccessControlType.Deny);
    
    dirSecurity.RemoveAccessRule(accessRuleDeny);
    

    FileSystemSecurity.RemoveAccessRule-Methode (FileSystemAccessRule)
    http://msdn.microsoft.com/de-de/library/zbfbabws.aspx

    FileSystemSecurity.RemoveAccessRuleAll-Methode (FileSystemAccessRule)
    http://msdn.microsoft.com/de-de/library/f847a84z.aspx

    [Übrigens: Schon beim Setzen einer Zugriffsverweigerung wird man von Windows gewarnt: "Sie sind im Begriff einen Zugriffsverweigerungseintrag zu setzen. Zugriffsverweigerungen haben Vorrang vor Zugriffsgenehmigungen. Falls ein Benutzer Mitglied in zwei Gruppen ist, und einer Gruppe der Zugriff genehmigt und der anderen Grupp der Zugriff verweigert ist, wird dem Benutzer der Zugriff verweigert."]

    Ob tatsächlich ein Deny-ACE Schuld am beschriebenen Verhalten ist, erfährst Du u.a. indem Du die Rechte auflistest:

    AuthorizationRuleCollection ruleCollection = dirSecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount) );
    
    foreach (FileSystemAccessRule authorizationRule in ruleCollection)
    {
      Debug.WriteLine(string.Format("IdentityReference: {0}", authorizationRule.IdentityReference));
      Debug.WriteLine(string.Format("AccessControlType: {0}", authorizationRule.AccessControlType));
      Debug.WriteLine(string.Format("FileSystemRights: {0}", authorizationRule.FileSystemRights));
      Debug.WriteLine(string.Format("IsInherited: {0}", authorizationRule.IsInherited));
    }
    
    

    Gruß
    Marcel

    Montag, 17. Januar 2011 13:45
    Moderator
  • Der Tip mit der Zugriffsverweigerung ist gut ... Ich studiere morgen die Links und werde die Rechte des Verzeichnisses auflisten. Ich bin mir fast sicher, daß es keine Zugriffsverweigerung gibt. Ich prüfe es und werde berichten.


    Danke erstmal.

    Andreas

     

     

    Montag, 17. Januar 2011 21:50
  • Hallo Andreas,

    siehe ggf. auch in meinen Links speziell u.a.:

    [c# - An example of setting NTFS Directory / File ACLS]
    http://blog.crowe.co.nz/archive/2007/08/25/c---An-example-of-setting-NTFS-Directory--File.aspx

    insbesondere dort das:

          // Remove any inheritable permissions from the path 
          RemoveInheritablePermissons(Path);


    ciao Frank
    • Als Antwort vorgeschlagen Frank Dzaebel Donnerstag, 20. Januar 2011 06:00
    Montag, 17. Januar 2011 22:43
  • Vielen Dank für Eure Hilfe. Ich habe viel gelernt ;-)

    Es lag letztenendes an den Flags:

    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit  und  PropagationFlags.None

    Wenn ich die so übergebe, werden die Rechte gesetzt.

     

    Gruß

    Andreas

     

    • Als Antwort markiert AndreasM85 Mittwoch, 19. Januar 2011 20:44
    Mittwoch, 19. Januar 2011 20:44