2015-05-20 43 views
0

我想寫一個工具,限制了搞亂文件服務器結構的能力。在這個項目中,我試圖限制用戶將文件保存在目錄中,但是阻止用戶在特定文件夾中創建子目錄。該子目錄將以另一種方式創建,至今已有效。c#如何將FileSystemRights.CreateDirectories設置爲拒絕,但FileSystemRights.AppendData允許

但我面臨的問題,ntfs權限似乎混合「創建目錄」和「追加數據」。現在,「附加數據」部分是阻止用戶將文件保存在目錄中的部分,這是不需要的。但是,如果允許,相同的權限可以創建子目錄。

在Windows資源管理器安全窗口中,兩個權限都設置爲相同的複選框,但由於枚舉FileSystemRights同時具有CreateDirectories和AppendData,所以我認爲我可以將它們設置爲appart。

directorySecurity.AddAccessRule(
        new FileSystemAccessRule(sidAll, FileSystemRights.CreateDirectories, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
        PropagationFlags.None, AccessControlType.Deny) 
        ); 

       directorySecurity.AddAccessRule(
        new FileSystemAccessRule(sidAll, FileSystemRights.AppendData, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
        PropagationFlags.None, AccessControlType.Allow) 
        ); 

       directoryInfo.SetAccessControl(directorySecurity); 

但是,當設置一個允許和一個拒絕時,兩者都被拒絕。

任何想法或提示?

回答

0

的問題解決方式如下:

// Create a new DirectoryInfo object. 
DirectoryInfo directoryInfo = new DirectoryInfo(_folderPath); 

// Get a DirectorySecurity object that represents the 
// current security settings. 
DirectorySecurity directorySecurity = directoryInfo.GetAccessControl(); 
SecurityIdentifier sidAll = new SecurityIdentifier("S-1-1-0"); 


//Set the permissions for files in that folder to allow 

FileSystemRights rights = FileSystemRights.Modify | 
          FileSystemRights.ReadAndExecute | 
          FileSystemRights.ListDirectory | 
          FileSystemRights.Read | 
          FileSystemRights.Write 

directorySecurity.AddAccessRule(
      new FileSystemAccessRule(
       sidAll, 
       rights, 
       InheritanceFlags.ContainerInherit | 
       InheritanceFlags.ObjectInherit, 
       PropagationFlags.None, 
       AccessControlType.Allow) 
      ); 

FileSystemRights subfolderRights = FileSystemRights.CreateDirectories | 
            FileSystemRights.DeleteSubdirectoriesAndFiles | 
            FileSystemRights.Delete; 

//Set the rights for subfolders of the 

directorySecurity.AddAccessRule(
      new FileSystemAccessRule(
       sidAll, 
       subfolderRights, 
       InheritanceFlags.ContainerInherit, PropagationFlags.None, 
       AccessControlType.Deny) 
      ); 

// Set the new access settings. 
directoryInfo.SetAccessControl(directorySecurity); 

注意在InheritanceFlags參數的差異和AccessControllType參數。我的一個朋友給了我解決方案,但我還沒有能夠調查InheritanceFlags參數的差異。只要有時間,我會盡量提示他們的工作方式。

SecurityIdentifier sidAll在這裏只是作爲一個例子。