c# - 是否有任何方法可以在 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,但只有当应用程序以提升的权限运行时 - 我必须以管理员身份显式运行应用程序
解决方案
看看SimpleImpersonation。它也可以作为 nuget 包使用。从项目站点,这是如何使用的:
var credentials = new UserCredentials(domain, username, password);
Impersonation.RunAsUser(credentials, logonType, () =>
{
// do whatever you want as this user.
});
这样,您就可以以普通用户身份运行您的应用程序,并以管理员用户身份运行那些需要更多权限的代码块,只要您提供正确的凭据
我以前用过,效果很好。
推荐阅读
- carthage - swift 4.2 的 Xcode 10 视觉识别问题
- xforms - XSLTForm 日期选择器未正确显示
- node.js - 来自重定向 URL 的 URL 参数
- android - Android Sqlite 通过“selection”和“selectionArgs”搜索日期
- java - 其中一个片段无法立即更新来自其他片段的数据
- java - 更新 SQLite 数据
- android - 导航时获取未定义不是对象错误
- python - 使用 dict 调用 python 函数 - 调用具有参数但未显式列出参数的函数
- java - 从第二个活动绑定到服务
- c# - app.xaml“无法在设计视图中编辑”