代码之家  ›  专栏  ›  技术社区  ›  Dominic Zukiewicz

无法复制文件,即使在C中授予了FileIOPermission#

  •  4
  • Dominic Zukiewicz  · 技术社区  · 16 年前

    我在尝试 FileIOPermission 在.NET 3.5中的Windows 7中。我曾是Windows XP用户,并被授予此权限,因为我是管理员。

    我写了以下代码,测试看是否可以写到C:\Program Files\Outlook……

    static void Main(string[] args)
    {
        Console.WriteLine("Am I an administrator? " + new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
    
        //  Try and open a file in C:\Program Files\Microsoft Office\Office14\BCSLaunch.dll
        string path = @"C:\Program Files\Microsoft Office\Office14\BCSLaunch.dll";
    
        try
        {
            FileIOPermission ioPerm = new FileIOPermission(FileIOPermissionAccess.Read, path);
            ioPerm.Demand();
    
            string backupPath = Path.ChangeExtension(path, ".bak");
            FileIOPermission writeAccess = new FileIOPermission(FileIOPermissionAccess.AllAccess, backupPath);
            writeAccess.Demand();
    
            Console.WriteLine("Read access is permitted: {0} => {1}",path,SecurityManager.IsGranted(ioPerm));
            Console.WriteLine("Write backup file is permitted: {0} => {1}", backupPath, SecurityManager.IsGranted(writeAccess));
    
            File.Copy(path, backupPath);
    
            Console.WriteLine("File copied! {0}",backupPath);
            Console.WriteLine("Deleting file.....");
            File.Delete(path);
        }
        catch (UnauthorizedAccessException uae)
        {
            Console.WriteLine(uae.ToString());
        }
    
        Console.ReadLine();
    }
    

    所以程序会导致 UnauthorizedAccessException (我是这么想的),但我不明白的是 Demand() 允许权限, SecurityManager 确认已授予权限,但在执行 File.Copy() 我确实得到了例外。

    虽然我很高兴看到.NET阻止了我,但为什么它没有在我打电话时提前通知我呢? 需求() ?

    我得到以下输出:

    Am I an administrator? False
    Read access is permitted: C:\Program Files\Microsoft Office\Office14\BCSLaunch.dll => True
    Write backup file is permitted: C:\Program Files\Microsoft Office\Office14\BCSLaunch.bak => True
    System.UnauthorizedAccessException: Access to the path 'C:\Program Files\Microsoft Office\Office14\BCSLaunch.bak' is denied.
       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite)
       at System.IO.File.Copy(String sourceFileName, String destFileName)
       at TryAndGetUACPrompt.Program.Main(String[] args) in C:\Users\..............
    

    有人能帮我理解为什么我得到的信息有冲突吗?

    ——

    更新时间:格林尼治标准时间19:30

    我使用以下代码查看了源文件的ACL:

    Console.WriteLine("ACL Permissions for Source....");
    FileSecurity fileSecurityForOriginalPath = new FileSecurity(path, AccessControlSections.Access);
    
    foreach (FileSystemAccessRule rule in fileSecurityForOriginalPath.GetAccessRules(true,true,typeof(NTAccount)))
    {
       Console.WriteLine("{0} => {1}", rule.FileSystemRights, rule.AccessControlType);
    }
    

    输出如下:

    ACL Permissions for Source....
    FullControl => Allow
    FullControl => Allow
    ReadAndExecute, Synchronize => Allow
    

    因此,我确实可以阅读它。但是,我尝试使用此代码查看备份路径的权限,并且 明显地 ,我会得到一个异常,因为我的备份(目标)文件在物理上不存在,所以我无法检查它的权限。

    接下来我将尝试另一个建议,将此检查转移到另一个方法中。

    更新时间:格林威治标准时间19:45

    我已将读/写需求重构为另一个方法:

    private static FileIOPermission CheckWriteAccess(string backupPath)
    {
        FileIOPermission writeAccess = new FileIOPermission(FileIOPermissionAccess.AllAccess, backupPath);
        writeAccess.Demand();
        return writeAccess;
    }
    
    private static FileIOPermission CheckReadAccess(string path)
    {
        FileIOPermission ioPerm = new FileIOPermission(FileIOPermissionAccess.Read, path);
        ioPerm.Demand();
        return ioPerm;
    }
    

    这两个都无一例外地返回罚款。

    因此,如果.NET安全性增强了DACL,我想知道为什么它认为它会成功,如果事实上它不会成功。

    ——

    更新19:57 GMT

    好的,我检查了目录的权限,而不是备份文件(目标文件),并将其作为输出获取(使用.getAccessRules()中authorizationRuleCollection上的foreach)

    Checking write access in this directory....
    FullControl => Allow
    268435456 => Allow
    FullControl => Allow
    268435456 => Allow
    FullControl => Allow
    268435456 => Allow
    ReadAndExecute, Synchronize => Allow
    -1610612736 => Allow
    268435456 => Allow
    

    我用过 Enum.Format(typeof(FileSystemAccessRights),rule,"G") 为了获得格式,有效地执行toString(),但我只是不确定这些数字是否正确。

    输出上述内容的代码:

    private static DirectorySecurity CheckWriteAccess(string backupPath)
    {
        DirectorySecurity writeAccess = new DirectorySecurity( Path.GetDirectoryName(backupPath),AccessControlSections.Access);
    
        Console.WriteLine("Checking write access in this directory....");
        foreach (FileSystemAccessRule rule in writeAccess.GetAccessRules(true, true, typeof(NTAccount)))
        {
            Console.WriteLine("{0} => {1}", Enum.Format(typeof(FileSystemRights),rule.FileSystemRights,"G"), rule.AccessControlType);
        }
    
        return writeAccess;
    }
    
    1 回复  |  直到 11 年前
        1
  •  5
  •   x0n    16 年前

    只读读/写的cas iopermisson授予您 能力 读或写。它不注意文件系统级权限(acls)。请检查文件夹上的acl,再近一点。)

    -奥辛