0

特権スクリプト (つまり、UAC 化されているスクリプト) が「正常に」ファイルに書き込めないという、ちょっと変わった状況があります。StreamWriterつまり、または を使用して ファイル パスに書き込もうとするFileStreamと、 のモードまたは同様のモードで がスローFileMode.Createれますが、を使用すると完全に機能します。UnauthorizedAccessExceptionFileMode.Truncate

問題のファイルは、 にあるグループ ポリシーscripts.iniファイルですC:\Windows\Sysnative\GroupPolicy\Machine\Scripts\scripts.ini。(注:私のOSが64ビットであるという理由だけでWindowsが書き直すのは素晴らしい考えだと思うので、私には必要です... )sysnativesystem32syswow64

回避策 (つまり、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

FileMode FileMode Enumerationの msdn ノートを確認しました

ファイルが既に存在するが隠しファイルである場合、 UnauthorizedAccessException 例外がスローされますFileMode.Create

于 2013-10-09T10:23:26.310 に答える