0

奇妙な問題があります。HOSTS ファイルのエントリを変更するアプリケーションを C# (.Net 4 クライアント プロファイル) で作成しています。HOSTS ファイルのユーザー アカウントに「フル アクセス」を追加し、通常のテキスト エディターで問題なくファイルを編集できます。

アプリケーションは、Visual Studio 2010 Debugger で実行すると動作します ([Visual Studio ホスティング プロセスを有効にする] が選択されている場合)。

Visual Studio の外部でアプリケーションを実行すると、「管理者として実行」(!!!) した場合でも、HOSTS ファイルを書き込もうとすると UnauthorizedAccessException が発生する可能性があります。なんで?詳細な情報からは何の手がかりも得られませんでした。

System.UnauthorizedAccessException was caught
  Message=Der Zugriff auf den Pfad "C:\Windows\System32\drivers\etc\hosts" wurde verweigert.
  Source=mscorlib
  StackTrace:
   bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   bei System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
   bei System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
   bei System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   bei System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize)
   bei System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding)
   bei System.IO.File.WriteAllLines(String path, String[] contents)
   bei App.HostsFile.Save() in HostsFile.cs:Zeile 125.
   bei App.Actions.SaveHosts.Execute(Context ctxt) in Actions\SaveHosts.cs:Zeile 16.
  InnerException: 
   (there is none)

マニフェスト ファイルを作成していません。デフォルトのマニフェスト オプションでコンパイルしています。それで、問題は何ですか?そして、私は何ができますか?

ありがとうございました。

4

2 に答える 2

3

UACを有効にしている場合は、管理者であっても、プログラムを昇格モードで起動して管理者権限をアクティブにしない限り、ホストを作成することはできません。

コードのセキュリティ権限については、こちらこちらをご覧ください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

    namespace WriteToTheHosts
    {
        class Program
        {
            static void Main(string[] args)
            {
                var systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
                Console.WriteLine(systemPath);
                var path = Path.Combine(systemPath, @"drivers\etc\hosts");
                using (var stream = new StreamWriter(path, true, Encoding.Default))
                {
                    stream.WriteLine("#from .NET");
                }
                Console.ReadKey();

            }
        }
    }

また、プロジェクト設定でデフォルトのマニフェストをオフにし(マニフェスト:「マニフェストなしでアプリケーションを作成する」)、最初のリンクサンプルに示されているように独自のマニフェストを記述します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="WriteToTheHosts" type="win32"/>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
         <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator"/>
         </requestedPrivileges>
      </security>
   </trustInfo>
</assembly>
于 2012-05-26T14:28:52.960 に答える
1

どうでも。犯人を見つけました。UAC ではすべて問題ありませんが、私のカスペルスキーが私のプログラムをブロックしていました :-/

アレクサンダー、助けてくれてありがとう。

于 2012-05-27T07:45:32.717 に答える