【问题标题】:How to check if a Windows file is readable/writable?如何检查 Windows 文件是否可读/可写?
【发布时间】:2011-02-28 01:08:49
【问题描述】:

首先:我知道这对于实际检查我是否可以写作并不可靠。我正在编写一个文件传输客户端,并希望“远程”和“本地”文件浏览器窗格之间的功能奇偶校验。我完全理解我将不得不处理任何执行的任何操作的权限相关异常;这不是编程检查,它只是向用户显示。

我已经看到了几个发布这些示例的示例,但是我尝试过的所有方法要么无法理解,要么不起作用。我尝试了以下两种方法,但对于我绝对无法写入的内容(例如 C:\Windows 或 C:\Program Files 的内容)都只返回“是”:

System.Security.Permissions.FileIOPermission fp = new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.Write, Path);
return System.Security.SecurityManager.IsGranted(fp);

System.Security.Permissions.FileIOPermission fp = new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.Write, element.Path);
try
{
    fp.Assert();
    return true;
}
catch(Exception x)
{
    return false;
}

(同样,我知道捕捉Exception 是可怕的,而使用try/catch 进行逻辑则稍微不那么可怕,我只是想让它工作)。

第一个告诉我 IsGranted 已弃用,我应该使用 AppDomain.PermissionSetApplication.PermissionSet,但我找不到任何解释如何使用这些有意义的解释。我还看到我应该手动枚举所有 ACL 以自己弄清楚,但同样没有真正的例子。设置权限的例子很多,但检查它们的例子很少。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net permissions acl file-permissions


    【解决方案1】:

    好吧,这就是我最终得出的结论:

        private readonly static WindowsIdentity _identity = WindowsIdentity.GetCurrent();
        protected static bool GetPermission(FileSystemRights right, string path)
        {
            FileSecurity fs;
            try
            {
                fs = System.IO.File.GetAccessControl(path);
            }
            catch(InvalidOperationException)
            {
                // called on a disk that's not present, ...
                return false;
            }
            catch(UnauthorizedAccessException)
            {
                return false;
            }
            foreach(FileSystemAccessRule fsar in fs.GetAccessRules(true, true, typeof(SecurityIdentifier)))
            {
                if(fsar.IdentityReference == _identity.User && fsar.FileSystemRights.HasFlag(right) && fsar.AccessControlType == AccessControlType.Allow)
                {
                    return true;
                }
                else if(_identity.Groups.Contains(fsar.IdentityReference) && fsar.FileSystemRights.HasFlag(right) && fsar.AccessControlType == AccessControlType.Allow)
                {
                    return true;
                }
            }
            return false;
        }
    

    当然,这并不理想,因为它忽略了拒绝权限。但我不知道应用各种 ACE 的顺序(我认为?)以找出“正确”的能力。尽管如此,拒绝规则还是比较少见的,所以它对我来说大部分时间都有效。

    【讨论】:

      猜你喜欢
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      相关资源
      最近更新 更多