C#实现启用与禁用本地网络的方式小结【3种方式】

C#实现启用与禁用本地网络的方式小结【3种方式】

方式1:使用Windows API函数

  • 引用System.Runtime.InteropServices命名空间
  • 定义Windows API函数,并声明相关参数
  • 调用Windows API函数

示例代码

using System.Runtime.InteropServices;

// 定义Windows API函数
[DllImport("wininet.dll")]
private extern static bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);

// 启用本地网络
public bool EnableLocalNetwork()
{
    const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
    const int INTERNET_OPTION_REFRESH = 37;

    bool success = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
    success &= InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
    return success;
}

// 禁用本地网络
public bool DisableLocalNetwork()
{
    const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
    const int INTERNET_OPTION_REFRESH = 37;
    const int INTERNET_OPTION_PROXY_SETTINGS_CHANGED = 95;

    bool success = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY_SETTINGS_CHANGED, IntPtr.Zero, 0);
    success &= InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
    success &= InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
    return success;
}

方式2:使用Process.Start启动CMD命令

  • 使用Process.Start方法启动CMD程序,并设置启动参数
  • 使用StandardInput写入CMD命令
  • 使用StandardOutput读取CMD输出

示例代码

using System.Diagnostics;

// 启用本地网络
public bool EnableLocalNetwork()
{
    Process p = new Process();
    p.StartInfo.FileName = "cmd.exe";
    p.StartInfo.Arguments = "/c netsh interface set interface \"本地连接\" admin=enable";
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.CreateNoWindow = true;

    p.Start();
    p.StandardInput.WriteLine();
    p.StandardInput.Close();

    string output = p.StandardOutput.ReadToEnd();
    p.WaitForExit();

    return output.Contains("已成功完成");
}

// 禁用本地网络
public bool DisableLocalNetwork()
{
    Process p = new Process();
    p.StartInfo.FileName = "cmd.exe";
    p.StartInfo.Arguments = "/c netsh interface set interface \"本地连接\" admin=disable";
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.CreateNoWindow = true;

    p.Start();
    p.StandardInput.WriteLine();
    p.StandardInput.Close();

    string output = p.StandardOutput.ReadToEnd();
    p.WaitForExit();

    return output.Contains("已成功完成");
}

方式3:使用WMI(Windows Management Instrumentation)

  • 引用System.Management命名空间
  • 使用ManagementObjectSearcher对象获取适配器信息
  • 使用ManagementObject的InvokeMethod方法执行相应操作

示例代码

using System.Management;

// 获取适配器信息
private ManagementObject GetAdapter()
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter WHERE Name='本地连接'");
    foreach (ManagementObject mo in searcher.Get())
    {
        return mo;
    }
    return null;
}

// 启用本地网络
public bool EnableLocalNetwork()
{
    ManagementObject adapter = GetAdapter();
    if (adapter == null) return false;

    ManagementBaseObject inParams = adapter.GetMethodParameters("Enable");
    ManagementBaseObject outParams = adapter.InvokeMethod("Enable", inParams, null);

    uint resultCode = (uint)outParams["returnValue"];
    return resultCode == 0;
}

// 禁用本地网络
public bool DisableLocalNetwork()
{
    ManagementObject adapter = GetAdapter();
    if (adapter == null) return false;

    ManagementBaseObject inParams = adapter.GetMethodParameters("Disable");
    ManagementBaseObject outParams = adapter.InvokeMethod("Disable", inParams, null);

    uint resultCode = (uint)outParams["returnValue"];
    return resultCode == 0;
}

以上三种方式都可以实现启用与禁用本地网络的功能,其中使用Process.Start启动CMD命令的方式速度较快,但需要使用CMD命令实现,而使用WMI的方式则比较稳定,但速度相对较慢。具体选择哪种方式可以根据实际需求进行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现启用与禁用本地网络的方式小结【3种方式】 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#处理医学影像(四):基于Stitcher算法拼接人体全景脊柱骨骼影像

    在拍摄脊柱或胸片时,经常会遇到因设备高度不够需要分段拍摄的情况, 对于影像科诊断查阅影像时希望将分段影像合并成一张影像,有助于更直观的观察病灶, 以下图为例的两个分段影像:       我们使用OpenCVSharp中的Stitcher类的Stitch方法,导入两张图像并拼接:  但结果却失败了,返回错误结果:ERR_NEED_MORE_IMGS,是由于医学…

    C# 2023年5月9日
    00
  • C#序列化与反序列化实例

    让我来为你详细讲解C#序列化与反序列化实例的完整攻略。 什么是C#序列化与反序列化? C#序列化与反序列化是指将C#的对象序列化成二进制字节流,并将其存储在磁盘或通过网络发送到其他计算机,同时,反序列化是指反过来将二进制字节流反序列化为C#对象。这样做的好处是可以方便地将对象跨平台传输和存储。 如何实现C#序列化与反序列化? C#提供了两种序列化方式:二进制…

    C# 2023年6月1日
    00
  • unity与vue交互(无第三方插件)

    下面我将为您介绍如何进行Unity与Vue交互的攻略,并提供两个示例。 前置知识 在深入讲解 Unity 与 Vue 交互之前,需要掌握以下技术: Unity 中 C# 与 JavaScript 编程 前端开发技术,包括 Vue.js 的使用方法 网络编程基础 Unity与Vue交互实现方式 Unity 以及 Vue.js 都支持WebSocket。因此,我…

    C# 2023年5月15日
    00
  • SharePoint 客户端对象模型 (一) ECMA Script

    下面是关于“SharePoint客户端对象模型(一)ECMAScript”的完整攻略,包含两个示例。 1. SharePoint客户端对象模型简介 SharePoint客户端对象模型(CSOM)是一组API,用于在客户端应用程序中与SharePoint进行交互。CSOM提供了一组类和方法,用于执行各种操作,例如读取和写入列表数据、创建和删除网站等。 2. 使…

    C# 2023年5月15日
    00
  • c#创建圆形类Circle、矩形类实现代码

    下面是关于“c#创建圆形类Circle、矩形类实现代码”的详细攻略。 创建圆形类 Circle 定义类 在 C# 中创建一个 Circle 类,需要定义一个类(class),使用 class 关键字进行定义,并给类起一个名称,本例中我们将其命名为 Circle: class Circle { } 添加属性 接下来,我们需要为圆形类添加若干个属性,包括: 半径…

    C# 2023年6月1日
    00
  • C#使用随机数编写班级点名器的示例代码

    C#使用随机数编写班级点名器的示例代码非常适合初学者练习,下面我会详细讲解一下完整攻略。 第一步:创建一个C#控制台应用程序 首先需要创建一个C#控制台应用程序,并命名为 ClassRollCall。在程序的主类中添加以下代码: using System; namespace ClassRollCall { class Program { static vo…

    C# 2023年5月31日
    00
  • C#委托和事件

    1.委托 两大作用: (1)将方法当作参数传递 (2)方法的一种多态(多播委托) 一个弊端: 委托可以使用=,+=,-=来发布订阅,所以这里有一个弊端,它可以使用“=”将所有已经订阅的取消,只保留=后的这一个订阅。这样如果让多个类中写的委托轻易就能被修改,让程序变得不安全,所以为了解决这个弊端,事件event应运而生。 多说几句,委托和event的关系就类似…

    C# 2023年4月18日
    00
  • C# SaveFileDialog与OpenFileDialog用法案例详解

    C#SaveFileDialog与OpenFileDialog用法案例详解 SaveFileDialog SaveFileDialog用于显示一个保存文件的对话框。 基本用法 使用SaveFileDialog需要首先在程序中引用命名空间: using System.Windows.Forms; 然后创建一个SaveFileDialog对象,设置其属性,最后使…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部