在 UAC 之后写入文件时未授权访问异常

本文关键字:授权 访问 异常 文件 UAC 之后 | 更新日期: 2023-09-27 18:34:28

我有一个有点奇怪的情况,一个特权脚本(即它已经被UAC编辑(无法"正常"写入文件。也就是说,尝试使用 StreamWriter 或通过具有 FileMode.Create 或类似模式的FileStream写入文件路径会引发UnauthorizedAccessException但是使用 FileMode.Truncate 效果很好!

有问题的文件是组策略scripts.ini文件,位于 C:'Windows'Sysnative'GroupPolicy'Machine'Scripts'scripts.ini 。(注意:我需要sysnative,因为 Windows 认为仅仅因为我的操作系统是 64 位就重写system32 syswow64是个好主意......

现在这主要是一个理论问题,因为我确实有一个解决方法(即使用 FileMode.Truncate(,但我想知道是否有人知道特权脚本如何最终无法写入文件?这似乎特别奇怪,因为FileMode.Create等同于现有文件的FileMode.Truncate

示例代码 - 插入上面的文件名(如果你敢 - 请先备份,特别是如果你注册了关闭脚本...(,编译和使用以管理员身份运行:

using System;
using System.IO;
using System.Security.Principal;
class Program
{
    static void Main(string[] args)
    {
        WindowsIdentity identity = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        // Outputs true.
        Console.WriteLine(principal.IsInRole(WindowsBuiltInRole.Administrator));
        // Throws an UnauthorizedAccessException.
        // using (var w = new StreamWriter(@"filename_here"))
        // Also throws UnauthorizedAccessException.
        // using (var fs = new FileStream(@"filename_here", FileMode.Create, FileAccess.ReadWrite))
        // Works!
        using (var fs = new FileStream(@"filename_here", FileMode.Truncate, FileAccess.ReadWrite))
        {    
            var w = new StreamWriter(fs);
            w.WriteLine("Test");
            w.Close();
        }
        Console.WriteLine("Press any key to close...");
        Console.ReadLine();
    }
}

在 UAC 之后写入文件时未授权访问异常

刚刚检查了文件模式文件模式枚举的 msdn 注释

它提到FileMode.Create
如果文件已存在,但是一个隐藏文件,则会引发 UnauthorizedAccessException 异常。