我有一种奇怪的情况,特权脚本(即它已被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();
}
}
答案 0 :(得分:2)
刚查看了FileMode FileMode Enumeration
的msdn说明它提及FileMode.Create
如果文件已存在但是是隐藏文件,则抛出UnauthorizedAccessException异常。