如何使用具有管理员权限且无需手动干预的c#修改主机文件

如何使用具有管理员权限且无需手动干预的c#修改主机文件,c#,host,hosts,C#,Host,Hosts,我一直在尝试多种方法,但我无法避免出现“您想以管理员身份打开应用程序”的警报。是否有人建议使用这样一段代码来避免/处理向主机文件中添加新条目的警报。 提前谢谢 不,修改文件肯定需要管理员权限,否则任何病毒都可能劫持主机文件,并将所有浏览器请求重定向到恶意网站。我没有代表对我提出的问题发表评论,但我会根据假设回答 你的目标 使用管理权限运行应用程序 为什么要弹出UAC? 您请求管理员权限的弹出窗口是为了防止应用程序在您不知情的情况下简单地获取管理员权限,从而修改系统的关键文件 如何预防它? 我强烈

我一直在尝试多种方法,但我无法避免出现“您想以管理员身份打开应用程序”的警报。是否有人建议使用这样一段代码来避免/处理向主机文件中添加新条目的警报。 提前谢谢


不,修改文件肯定需要管理员权限,否则任何病毒都可能劫持主机文件,并将所有浏览器请求重定向到恶意网站。

我没有代表对我提出的问题发表评论,但我会根据假设回答

你的目标

使用管理权限运行应用程序

为什么要弹出UAC?

您请求管理员权限的弹出窗口是为了防止应用程序在您不知情的情况下简单地获取管理员权限,从而修改系统的关键文件

如何预防它?

我强烈建议不要采取这一步骤,但想到的第一个选项是从控制面板禁用UAC(用户帐户控制)

备选方案

另一种方法是将程序作为计划任务运行,设置为以最高权限运行。然后,您可以通过运行计划任务来执行程序,并且在没有UAC弹出窗口的情况下具有管理员访问权限。
这可以通过命令行或GUI完成,并且仍然需要管理员权限来创建计划任务

是的,我知道,但是有没有任何方法可以通过编程方式提供此类权限/绕过/处理此类警报而无需手动干预..这就是我需要的,如果您有任何想法,请告诉我UAC弹出窗口的全部要点是防止应用程序进行未经授权的更改。若有一种方法可以绕过它,那个么就并没有什么方法可以阻止任何应用程序改变任何设置。唯一的方法就是禁用UAC,我怀疑有人会想要它。。。
public bool ModifyHostsFile(string sEntryIPAddr, string sEntryURL)
    {
        try
        {
            WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
            bool administrativeMode = principal.IsInRole(WindowsBuiltInRole.Administrator);

            if (!administrativeMode)
            {
                //ProcessStartInfo startInfo = new ProcessStartInfo();
                //startInfo.Verb = "runas";
                //startInfo.FileName = Application.ExecutablePath;
                //Process.Start(startInfo);
                //bool bStatus = GrantAccess(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), @"drivers\etc\hosts"));
                using (StreamWriter w = File.AppendText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), @"drivers\etc\hosts")))
                {
                    w.WriteLine(sEntryIPAddr + " " + sEntryURL);
                }
                Application.Exit();
            }
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return false;
        }   
    }

    private bool GrantAccess(string fullPath)
    {
        DirectoryInfo dInfo = new DirectoryInfo(fullPath);
        DirectorySecurity dSecurity = dInfo.GetAccessControl();
        dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
        dInfo.SetAccessControl(dSecurity);
        return true;
    }