2011-12-12 70 views
2

我有一個文件夾,它有一些嚴格的限制。對於一個用戶,這個人可以看到文件是否存在,但不能複製文件,打開文件等等。他們能做的唯一的事情就是看文件是否存在。FileSystemRights:僅列表文件夾

當我看頂層,我看到列出文件夾內容進行檢查。這是他們被允許擁有的唯一權限。現在

enter image description here

,當使用C#拉權利,我看到幾個項目設置,不只是一個。當我更深入地看待權利時,我發現在這個較低的層次上,相應的項目被檢查。

enter image description here

當我得到的權利,這個文件夾,它顯示因爲讀了低級別的標誌設置該文件夾具有「讀」訪問。但是,我已經用此用戶的帳戶進行了測試。他們肯定沒有閱讀權限。

如果我重新創建一個新的文件夾,並設置爲這裏列出的權限,然後用戶可以將文件複製出來的新文件夾,他們不應該是能夠做到的。

我不理解Windows安全模式。

我如何驗證用戶具有列表訪問,但不讀訪問?我會特別查詢什麼?注意:查詢「列出文件夾/讀取數據」而不是「讀取權限」不起作用,如下所示。這兩者顯然都是由更高級別的「列出文件夾內容」選項設置的。

UPDATE:

我包括代碼剪斷我用拉的信息。也許這將有助於確定我在找什麼。

internal void GroupsFromPath(string pth, bool IncludeInherited) 
    { 
     DirectorySecurity ds; 
     try 
     { 
      DirectoryInfo di = new DirectoryInfo(pth); 
      ds = di.GetAccessControl(AccessControlSections.Access); 
     } 
     catch 
     { 
      return ret; 
     } 

     AuthorizationRuleCollection acl = ds.GetAccessRules(true, 
       IncludeInherited, typeof(NTAccount)); 

     foreach (FileSystemAccessRule ace in acl) 
     { 
      bool L = CheckRights(ace, FileSystemRights.Traverse | 
       FileSystemRights.ListDirectory); 

      bool R = CheckRights(ace, FileSystemRights.Read); 
      bool W = CheckRights(ace, FileSystemRights.Modify); 

      DO_MAGIC(pth, L, R, W); 
     } 
    } 

    private bool CheckRights(FileSystemAccessRule ACE, 
      FileSystemRights fileSystemRights) 
    { 
     bool r = ((ACE.FileSystemRights & fileSystemRights) == fileSystemRights) 
      && (ACE.AccessControlType == AccessControlType.Allow); 

     return r; 
    } 

回答

3

對於你必須確保該權限只適用於「此文件夾和子文件夾」(看你的截圖)列表訪問。

FileSystemAccessRuleInheritanceFlags屬性必須設置爲InheritanceFlags.ContainerInheritPropagationFlags屬性必須設置爲PropagationFlags.None

有關完整列表(InheritanceFlags/PropagationFlags)看到的Damir Dobric的博客。

BEGIN編輯

檢查給定FileSystemAccessRule是否實現「列出文件夾內容只有」權限 你可以用下面的方法(使用InheritanceFlagsPropagationFlags屬性):

private static bool CheckListFolderContentOnly(FileSystemAccessRule ace) 
{ 
    if (ace.PropagationFlags == PropagationFlags.None && 
     ace.InheritanceFlags == InheritanceFlags.ContainerInherit && 
     ace.FileSystemRights == (FileSystemRights.ReadAndExecute | FileSystemRights.Synchronize)) 
    { 
    return true; 
    } 

    return false; 
} 

END編輯

希望,這有助於。

+0

我不想改變價值。我正在嘗試獲取已經在ACE中的值。我不明白你的陳述如何適用於這種情況。 – Jerry

+0

@Jerry:我已經更新了我的答案。您可以使用PropagationFlags和InheritanceFlags檢查「僅列出文件夾內容」權限。 – Hans

+0

說實話,這對我來說沒有任何意義,但它確實會返回正確的價值。當我使用相同的模式來檢查READ和WRITE時,它會返回相應的真/假值。謝謝!! – Jerry