[英]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資源管理器中查看這些權限時,會看到以下內容:
當我使用我的應用程序查詢同一文件夾時,我得到:
身份: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.