我有一个奇怪的情况,特权脚本(即它已被 UAC-ed)无法“正常”写入文件。也就是说,尝试使用 aStreamWriter
或 via aFileStream
以FileMode.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();
}
}