【问题标题】:Disabling network adapter without admin rights prompt在没有管理员权限提示的情况下禁用网络适配器
【发布时间】:2014-05-02 07:12:19
【问题描述】:

当用户单击按钮时,我需要在 Windows 8 平板电脑上启用/禁用所有网络适配器(有点像飞行模式)。

这可以通过 Powershell 中的以下 cmdlet 来完成:“Disable-NetAdapter * –Confirm:$false”,它是对应的 Enable-NetAdapter。他们做的正是我期望他们做的,但我有两个问题:

  1. 我不想从 WPF 应用程序运行 Powershell。由于它是基于 .NET Framework 构建的,有没有什么方法可以在不调用 cmdlet 的情况下做同样的事情?

  2. 它需要提升权限(例如使用右键单击 +“以管理员身份运行”启动应用程序)。我可以从代码中获得提升的权限,但我总是得到用户访问控制弹出请求批准。有没有办法在不弹出窗口的情况下始终以提升的权限启动应用程序?

【问题讨论】:

  • 如果程序有办法绕过 UAC,那将毫无用处。
  • 您能否请求提升权限以运行包含单击按钮的应用程序?
  • 想一想你的最后一个问题。如果您始终可以以提升的权限启动应用程序,但没有收到 UAC 提示 - 这难道不是网络威胁的完美解决方案吗?您希望您的应用程序提示用户输入 UAC,但我认为没有办法通过 .NET 绕过它 - 应该是这样。
  • 正如 cloyd800 所说,没有办法自动提升您编写的代码,只有由“windows 发布者”证书进行数字签名并位于一些特殊文件夹中的代码(如 %SystemRoot%\System32)允许自动提升自己 (source)。这样在控制面板中打开项目之类的操作就不会导致 UAC 提示(就像在 Vista 中所做的那样)。您编写程序的唯一方法是您是 Microsoft 的员工。

标签: c# wpf powershell


【解决方案1】:

Win32_NetworkAdapter 类包含启用/禁用方法http://msdn.microsoft.com/en-us/library/aa394216

这是来自Programmatically Enable / Disable Connection的代码示例

如果操作需要,您需要在 Admin 或 System 上下文中运行,理想情况下,因为 UAC 不会妨碍 System,您可以作为服务运行!

【讨论】:

【解决方案2】:

这是我在生产中实际使用的一些 VB.NET 代码示例:

Imports System.Management
Imports System.Text.RegularExpressions

            Try
                Dim scope As New ManagementScope("\\" + computername + "\root\CIMV2")
                scope.Connect()

                Dim query As New ObjectQuery( _
                    "SELECT * FROM Win32_NetworkAdapter WHERE Manufacturer != 'Microsoft' AND NOT PNPDeviceID LIKE 'ROOT\\%'")

                Dim searcher As New ManagementObjectSearcher(scope, query)

                For Each queryObj As ManagementObject In searcher.Get()

                    Dim ServiceName As String = queryObj("ServiceName")
                    Dim ProductName As String = queryObj("Description")
                    If Regex.IsMatch(ServiceName, ".*NETw.*") Then
                        'if we detect a wireless connection service name...

                        If Regex.IsMatch(queryObj("netenabled"), ".*true.*", RegexOptions.IgnoreCase) Then                                
                           MessageBox.Show(ProductName + " is already enabled! [ " + queryObj("netenabled") + " ]")

                        Else
                            'Try to enable the wireless connection here
                            queryObj.InvokeMethod("Enable", Nothing)                                
                                MessageBox.Show(ProductName + " was successfully enabled!")                               
                        End If
                    End If
                Next
            Catch ex As Exception
                Messagebox.show(ex.Message)
            End Try

编辑:添加 C# 等效项:

try {
ManagementScope scope = new ManagementScope("\\\\" + computername + "\\root\\CIMV2");
scope.Connect();

ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_NetworkAdapter WHERE Manufacturer != 'Microsoft' AND NOT PNPDeviceID LIKE 'ROOT\\\\%'");

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);


foreach (ManagementObject queryObj in searcher.Get()) {
    string ServiceName = queryObj("ServiceName");
    string ProductName = queryObj("Description");
    if (Regex.IsMatch(ServiceName, ".*NETw.*")) {
        //if we detect a wireless connection service name...

        if (Regex.IsMatch(queryObj("netenabled"), ".*true.*", RegexOptions.IgnoreCase)) {
            MessageBox.Show(ProductName + " is already enabled! [ " + queryObj("netenabled") + " ]");

        } else {
            //Try to enable the wireless connection here
            queryObj.InvokeMethod("Enable", null);
            MessageBox.Show(ProductName + " was successfully enabled!");
        }
    }
}
} catch (Exception ex) {
Messagebox.show(ex.Message);
}

【讨论】:

  • c#中应该是queryObj.GetPropertyValue(xxx)
猜你喜欢
  • 2018-07-05
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多