我的程序无法写入 HOSTS 文件,即使以管理员身份运行也是如此



我有一个奇怪的问题。我正在用 C#(.Net 4 客户端配置文件)编写一个应用程序,它将更改 HOSTS 文件中的条目。我在 HOSTS 文件的用户帐户中添加了"完全访问权限",我可以在普通文本编辑器中毫无问题地编辑该文件。

在 Visual Studio

2010 调试器中运行时(当选择"启用 Visual Studio 宿主进程"时),应用程序可以正常工作。

当我在Visual Studio之外运行应用程序时,即使"以管理员身份运行"(!!)我可以在尝试写入主机文件时出现未经授权的访问异常。为什么?详细的信息没有给我任何线索:

System.UnauthorizedAccessException was caught
  Message=Der Zugriff auf den Pfad "C:WindowsSystem32driversetchosts" 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 ActionsSaveHosts.cs:Zeile 16.
  InnerException: 
   (there is none)

我还没有编写清单文件。我正在使用默认清单选项进行编译。那么问题出在哪里呢?我能做什么?

谢谢。

如果启用了 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, @"driversetchosts");
                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>

关系。我找到了罪魁祸首。UAC 一切都很好,但我的卡巴斯基阻止了我的程序:-/

谢谢你,亚历山大的帮助。

相关内容

  • 没有找到相关文章

最新更新