特権スクリプト (つまり、UAC 化されているスクリプト) が「正常に」ファイルに書き込めないという、ちょっと変わった状況があります。StreamWriter
つまり、または を使用して ファイル パスに書き込もうとするFileStream
と、 のモードまたは同様のモードで がスローさFileMode.Create
れますが、を使用すると完全に機能します。UnauthorizedAccessException
FileMode.Truncate
問題のファイルは、 にあるグループ ポリシーscripts.ini
ファイルですC:\Windows\Sysnative\GroupPolicy\Machine\Scripts\scripts.ini
。(注:私のOSが64ビットであるという理由だけでWindowsが書き直すのは素晴らしい考えだと思うので、私には必要です... )sysnative
。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();
}
}