0

我有一个奇怪的情况,特权脚本(即它已被 UAC-ed)无法“正常”写入文件。也就是说,尝试使用 aStreamWriter或 via aFileStreamFileMode.Create或类似的模式写入文件路径会抛出UnauthorizedAccessException但是usingFileMode.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();
    }
}
4

1 回答 1

2

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

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

于 2013-10-09T10:23:26.310 回答