簡體   English   中英

C#從“高級安全設置”中獲取目錄的“應用於”信息

[英]C# Get “Apply To” information from “Advanced Security Settings” for a directory

我正在編寫一個應用程序,該應用程序用於搜索文件夾的權限並返回詳細信息,例如權限(例如,完全控制,讀取),AccessControlType(例如,允許,拒絕)和應用於信息(例如,此文件夾,子文件夾和文件) 。

我可以使用DirectoryInfo的GetAccessControl(DirectorySecurity)方法獲得大多數此類信息。 但是,我無法准確獲取目錄的“應用於”信息。 經過大量研究,我遇到了這個StackOverflow問題與解答如何以編程方式(.NET)更改文件夾審核選項下的“適用於”字段,這使我進入了此綜合頁面http://msmvps.com/blogs/p3net/pages/access- control-in-net.aspx,但是使用同時指定的規則,我不會獲得與Windows資源管理器中相同的“應用於”權限。

申請表

(表來自http://msmvps.com/blogs/p3net/pages/access-control-in-net.aspx

這是我用來嘗試轉換InheritanceFlags和PropogationFlags組合的代碼:

private ApplyToType GetApplyToType(InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
{
    if (propagationFlags == PropagationFlags.None && 
        inheritanceFlags == InheritanceFlags.None) 
        return ApplyToType.ThisFolderOnly;

    if (propagationFlags == PropagationFlags.None && 
        inheritanceFlags == InheritanceFlags.ContainerInherit) 
        return ApplyToType.ThisFolderAndSubfolders;

    if (propagationFlags == PropagationFlags.None && 
        inheritanceFlags == InheritanceFlags.ObjectInherit) 
        return ApplyToType.ThisFolderAndFiles;

    if (propagationFlags == PropagationFlags.None && 
        inheritanceFlags == (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit)) 
        return ApplyToType.ThisFolderSubfoldersAndFiles;

    if (propagationFlags == PropagationFlags.InheritOnly && 
        inheritanceFlags == InheritanceFlags.ContainerInherit)
        return ApplyToType.SubfoldersOnly;

    if (propagationFlags == PropagationFlags.InheritOnly && 
        inheritanceFlags == InheritanceFlags.ObjectInherit)
        return ApplyToType.FilesOnly;

    if (propagationFlags == PropagationFlags.InheritOnly && 
        inheritanceFlags == (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit))
        return ApplyToType.SubfoldersAndFilesOnly;

    return ApplyToType.AndreDoesntKnow;
}

以下代碼用於查詢目錄:

var directory = new DirectoryInfo(directoryPath);
var accessControl = directory.GetAccessControl(AccessControlSections.Access);
var rules = accessControl.GetAccessRules(includeExplicit, includeInherited, targetType);
foreach (FileSystemAccessRule rule in rules)
{
    var applyToType = GetApplyToType(rule.InheritanceFlags, rule.PropagationFlags);
    Console.WriteLine(string.Format("Identity:{0}, Rights:{1}, AccessType:{2}, ApplyTo:{3}", rule.IdentityReference, rule.FileSystemRights, rule.AccessControlType, applyToType));
}

但是,當我在Windows資源管理器中查看這些權限時,會看到以下內容:

Windows Exlplorer應用於窗口 當我使用我的應用程序查詢同一文件夾時,我得到:

  • 身份:BUILTIN \\ Administrators,權限:FullControl,訪問類型:允許,ApplyTo: ThisFolderOnly

  • 身份:BUILTIN \\ Administrators,權限:268435456,訪問類型:允許,應用於: SubfoldersAndFilesOnly

  • 身份:NT AUTHORITY \\ SYSTEM,權限:FullControl,訪問類型:允許,適用於: ThisFolderOnly

  • 身份:NT AUTHORITY \\ SYSTEM,權限:268435456,訪問類型:允許,僅應用於: SubfoldersAndFilesOnly

  • 身份:BUILTIN \\ Users,權限:讀取和執行,同步,AccessType:允許,ApplyTo: ThisFolderSubfoldersAndFiles

  • 身份:NT AUTHORITY \\ Authenticated Users,權限:修改,同步,訪問類型:允許,適用於: ThisFolderOnly

  • 身份:NT AUTHORITY \\ Authenticated Users,權限:-536805376,訪問類型:允許,適用於: SubfoldersAndFilesOnly

如您所見,使用這些其他站點的規則,我派生的ApplyTo與Windows資源管理器ApplyTo不匹配。

除此之外,還有什么呢? 我究竟做錯了什么? 要解決Windows資源管理器報告的相同ApplyTo規則,我還需要做什么?

我還應該提到這些結果來自運行Windows 7 x64的開發PC。 根據我們的用戶的看法,在他們的工作環境(Windows XP x86)上,他們觀察到正確的行為。 我對Windows權限了解得不夠多,無法知道Windows 7 x64和Window XP x86之間是否存在差異。

所有這些對我來說都是正確的。 我想嘗試的一件事是,多年來,我學會了不要僅用

propagationFlags == PropagationFlags.None

Isntead,我傾向於使用

(propagationFlags & PropagationFlags.None) == PropagationFlags.None

當新版本的API出現時,如果在位字段上顯示新的標志,這將使我的代碼更具彈性。

該原則甚至適用於更復雜的表達式,例如

(inheritanceFlags & (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit)) == (InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit)

那就是我會立即嘗試的一件事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM