在 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();
}
}
刚刚检查了文件模式文件模式枚举的 msdn 注释
它提到FileMode.Create
如果文件已存在,但是一个隐藏文件,则会引发 UnauthorizedAccessException 异常。