首页 > 解决方案 > 是否有任何方法可以在 C# WPF appl 中从非管理员用户更改系统 DNS 而无需以提升的权限运行应用程序?

问题描述

我正在开发一个应用程序,该应用程序涉及根据登录使用更改机器的 DNS。应根据 API 响应更改登录用户的 DNS。即使登录的用户是非管理员帐户,也应更改 DNS。有没有办法在不以提升的权限运行应用程序的情况下更改系统的 DNS?

尝试使用“ManagementBaseObject”更改 DNS

public static void SetDNS(string DnsString)
        {
            string[] Dns = { DnsString };
            var CurrentInterface = GetActiveEthernetOrWifiNetworkInterface();
            if (CurrentInterface == null) return;

            ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection objMOC = objMC.GetInstances();
            foreach (ManagementObject objMO in objMOC)
            {
                if ((bool)objMO["IPEnabled"])
                {
                    if (objMO["Caption"].ToString().Contains(CurrentInterface.Description))
                    {
                        ManagementBaseObject objdns = objMO.GetMethodParameters("SetDNSServerSearchOrder");
                        if (objdns != null)
                        {
                            objdns["DNSServerSearchOrder"] = Dns;
                            objMO.InvokeMethod("SetDNSServerSearchOrder", objdns, null);
                        }
                    }
                }
            }
        }

上面的代码正在更改 DNS,但只有当应用程序以提升的权限运行时 - 我必须以管理员身份显式运行应用程序

标签: c#.netwpf

解决方案


看看SimpleImpersonation。它也可以作为 nuget 包使用。从项目站点,这是如何使用的:

var credentials = new UserCredentials(domain, username, password);
Impersonation.RunAsUser(credentials, logonType, () =>
{
    // do whatever you want as this user.
}); 

这样,您就可以以普通用户身份运行您的应用程序,并以管理员用户身份运行那些需要更多权限的代码块,只要您提供正确的凭据

我以前用过,效果很好。


推荐阅读