C# 使用管理员身份运行CMD,修改当前的适配器的IP

C# 使用管理员身份运行CMD,修改当前的适配器的IP

这个页面仅供我自己记录,是查找各个博客得来的结果,如果大神发现错误,欢迎指正。(原地址已经记不清了,如果侵权,请联系我删文)

//使用管理员身份打开cmd,据说这个方法某些环境不管用,不知什么原因

  public  void ExecuteCommandAsAdmin()
    {
        System.Diagnostics.Process process = new System.Diagnostics.Process();
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        //startInfo.FileName是要打开的程序
        startInfo.FileName = "cmd.exe";
        //startInfo.Arguments是要执行的命令
        string cmd = "netsh interface ip set address " + activeAdapter.Name + " static 192.168.0.188 255.255.255.0";
        startInfo.Arguments = "/C "+cmd;
        print(startInfo.Arguments);
        startInfo.Verb = "runas";
        process.StartInfo = startInfo;
        process.Start();
        process.WaitForExit();
        process.Close();
    }

直接打开从cmd,且输入命令行,不是管理员身份
ProcessCommand() 这个方法不能直接调用,需要新开一个线程

void Start()
 {
        Thread cmd = new Thread(CmdCtr);
        cmd.Start();
 }        

    //传入的命令行指令
    private void CmdCtr()
    {
        //打开控制面板
        string cmd = "netsh interface ip set address "+ activeAdapter.Name + " static 192.168.0.188 255.255.255.0";
        print(cmd);
        //string cmd = "control";
        //ProcessCommand("cmd.exe", cmd);
        print("修改");
    }

 /// <summary>
    /// 打开cmd
    /// </summary>
    /// <param name="command">打开的程序</param>
    /// <param name="argument">要输入的命令</param>
    //string cmd = "control";
    //ProcessCommand("cmd.exe", cmd);
    public static void ProcessCommand(string command, string argument)
    {
        //UnityEngine.Debug.Log(argument);
        ProcessStartInfo info = new ProcessStartInfo(command);
        //启动应用程序时要使用的一组命令行参数。
        //但是对于cmd来说好像是无效的,可能是因为UseShellExecute的值设置为false了
        //但是对于svn的程序TortoiseProc.exe是可以使用的一个参数
        //info.Arguments = argument;
        //是否弹窗
        info.CreateNoWindow = true;
        //获取或设置指示不能启动进程时是否向用户显示错误对话框的值。
        info.ErrorDialog = true;
        //获取或设置指示是否使用操作系统 shell 启动进程的值。
        info.UseShellExecute = false;

        if (info.UseShellExecute)
        {
            info.RedirectStandardOutput = false;
            info.RedirectStandardError = false;
            info.RedirectStandardInput = false;
        }
        else
        {
            info.RedirectStandardOutput = true; //获取或设置指示是否将应用程序的错误输出写入 StandardError 流中的值。
            info.RedirectStandardError = true; //获取或设置指示是否将应用程序的错误输出写入 StandardError 流中的值。
            info.RedirectStandardInput = true;//获取或设置指示应用程序的输入是否从 StandardInput 流中读取的值。
            info.StandardOutputEncoding = System.Text.Encoding.UTF8;
            info.StandardErrorEncoding = System.Text.Encoding.UTF8;
        }
        //启动(或重用)此 Process 组件的 StartInfo 属性指定的进程资源,并将其与该组件关联。
        Process process = Process.Start(info);
        //StandardInput:获取用于写入应用程序输入的流。
        //将字符数组写入文本流,后跟行终止符。
        process.StandardInput.WriteLine(argument);
        //获取或设置一个值,该值指示 StreamWriter 在每次调用 Write(Char) 之后是否都将其缓冲区刷新到基础流。
        process.StandardInput.AutoFlush = true;

        if (!info.UseShellExecute)
        {
            UnityEngine.Debug.Log(process.StandardOutput);
            UnityEngine.Debug.Log(process.StandardError);
        }
        //关闭
        process.Close();
    }

遍历当前所有的网络适配器名称

//NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
        //foreach (NetworkInterface adapter in adapters)
        //{
        //    print(adapter.Name);
        //}

查找当前所使用的网络适配器名称

        //NetworkInterfaceType.Ethernet 是以太网  NetworkInterfaceType.Wireless80211 是无线网卡
        NetworkInterface[] networks = NetworkInterface.GetAllNetworkInterfaces();
        activeAdapter = networks.First(x => x.NetworkInterfaceType != NetworkInterfaceType.Loopback
                           && x.NetworkInterfaceType != NetworkInterfaceType.Tunnel
                           && x.OperationalStatus == OperationalStatus.Up
                           && x.Name.StartsWith("vEthernet") == false);
        print(activeAdapter.Name);
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要以管理员权限修改网络适配器属性,可以使用以下方法: 1. 首先,需要添加一个引用 System.Management.dll。在 Visual Studio 中,右键单击项目,选择“添加引用”,然后选择“System.Management”。 2. 在代码中,创建一个 `ManagementObject` 对象,该对象代表了要修改的网络适配器。 ```csharp ManagementObject networkAdapter = new ManagementObject("Win32_NetworkAdapterConfiguration.Index=1"); ``` 在这里,我们使用 `Win32_NetworkAdapterConfiguration` 类来表示网络适配器配置,可以根据需要修改 `Index` 属性的值来选择要修改适配器。 3. 接下来,需要使用 `ManagementBaseObject` 对象来设置适配器的属性。以下是一个设置 DNS 服务器地址的示例: ```csharp ManagementBaseObject setDNS = networkAdapter.GetMethodParameters("SetDNSServerSearchOrder"); string[] dnsServers = new string[] { "8.8.8.8", "8.8.4.4" }; setDNS["DNSServerSearchOrder"] = dnsServers; ManagementBaseObject setDNSResult = networkAdapter.InvokeMethod("SetDNSServerSearchOrder", setDNS, null); ``` 在这个示例中,我们首先获取了 `SetDNSServerSearchOrder` 方法的参数,然后设置了 DNS 服务器地址,最后调用了 `InvokeMethod` 方法来设置 DNS 服务器地址。 4. 最后,需要在应用程序中使用管理员权限运行这段代码。可以使用 `runas` 命令来以管理员身份运行应用程序。 以上是以管理员权限修改网络适配器属性的基本方法,您可以根据需要自行调整代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值