在UAC之后写入文件时出现UnauthorizedAccessException

时间:2013-10-09 09:18:31

标签: c# windows file uac

我有一种奇怪的情况,特权脚本(即它已被UAC编辑)无法正常写入文件。也就是说,尝试使用StreamWriter或模式为FileStream或类似的FileMode.Create写入文件路径会引发UnauthorizedAccessException然而< / strong>使用FileMode.Truncate效果很好!

相关文件是位于scripts.ini的组策略C:\Windows\Sysnative\GroupPolicy\Machine\Scripts\scripts.ini文件。 (注意:sysnative对我来说是必需的,因为Windows认为将system32重写为syswow64是一个好主意,因为我的操作系统是64位...)。

现在这主要是一个理论问题,因为我确实有一个解决方法(即使用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();
    }
}

1 个答案:

答案 0 :(得分:2)

刚查看了FileMode FileMode Enumeration

的msdn说明

它提及FileMode.Create
如果文件已存在但是是隐藏文件,则抛出UnauthorizedAccessException异常。