1

在互联网上搜索,我找到了两种方法来确定进程是否可以写入文件;检查权限并尝试写入。我决定尝试这两种方法,并得出了一个令人惊讶的结果。

似乎检查文件的安全权限会报告该进程对受 UAC 保护的目录中的文件具有写访问权限,无论该进程是否在提升模式下运行。另一方面,使用尝试写入 (System.IO) 会报告只有当进程在提升模式下运行时,该进程才具有对 UAC 保护目录中文件的写访问权限。

我的问题如下:

  1. 为什么使用安全权限方法会给出错误的结果?
  2. 在哪些情况下会想要使用安全权限而不是真正的写入尝试?

这是我用于测试的代码。

using System;
using System.IO;
using System.Security;
using System.Security.Permissions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (var filename in new[]{@"C:\Windows\win.ini",
                                          Environment.ExpandEnvironmentVariables(@"%tmp%\temp.txt")})
            {
                Console.WriteLine("File Name: {0}", filename);
                Console.WriteLine("Write Permission : {0}", WriteAccess(filename));
                Console.WriteLine("IO Write Attempt : {0}", WriteAccess2(filename));
                Console.WriteLine();
            }

            var principal = System.Threading.Thread.CurrentPrincipal;
            Console.ReadLine();
        }

        static bool WriteAccess(string filename)
        {
            var permissionSet = new PermissionSet(PermissionState.None);
            permissionSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.Write, filename));
            return permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet);
        }

        static bool WriteAccess2(string filename)
        {
            try
            {
                // assumes the file exists
                using (var fs = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite))
                    return true;
            }
            catch (UnauthorizedAccessException)
            {
                return false;
            }
        }
    }
}

输出(非提升过程)

文件名:C:\Windows\win.ini
写权限:
IO 写尝试:

文件名:C:\Users\Alex\AppData\Local\Temp\temp.txt
写权限:真
IO 写尝试:真

输出(提升的过程)

文件名:C:\Windows\win.ini
写权限:
IO 写尝试:

文件名:C:\Users\Alex\AppData\Local\Temp\temp.txt
写权限:真
IO 写尝试:真
4

0 回答 0