zoukankan      html  css  js  c++  java
  • 通过程序自动设置网卡的“internet共享”选项

    操作系统 : Windows 10_x64 [版本 10.0.19042.685]

    Windows下可以通过网卡共享进行上网,但是需要在网卡的属性里面进行设置,需要在视窗界面进行操作,不能实现自动化。

    查了下资料,可以通过INetSharingManager来实现,原理很简单: 模拟手工的动作自动化操作。

    示例代码如下:

    HRESULT shareNet(INetSharingManager* pNSM, const char* srcName, const char* dstName)
    {
        INetConnection * pNC = NULL;
        INetSharingConfiguration * pNSC = NULL;
        IEnumVARIANT * pEV = NULL;
        IUnknown * pUnk = NULL;
        INetSharingEveryConnectionCollection * pNSECC = NULL;
    
        HRESULT hr = pNSM->get_EnumEveryConnection(&pNSECC);
        VARIANT v;
        VariantInit(&v);
    
        if (!pNSECC)
        {
            wprintf(L"failed to get EveryConnectionCollection!
    ");
            return NULL;
        }
    
        hr = pNSECC->get__NewEnum(&pUnk);
        if (pUnk)
        {
            hr = pUnk->QueryInterface(__uuidof(IEnumVARIANT), (void**)&pEV);
            pUnk->Release();
        }
    
    
        wprintf(L"----------------------------------------------------------
    ");
        while (S_OK == pEV->Next(1, &v, NULL))
        {
            if (V_VT(&v) == VT_UNKNOWN)
            {
                V_UNKNOWN(&v)->QueryInterface(__uuidof(INetConnection), (void**)&pNC);
                if (pNC)
                {
                    NETCON_PROPERTIES* pNP = NULL;
                    pNC->GetProperties(&pNP);
                    setlocale(LC_ALL, "chs");
    
                    wprintf(L"pszwName--%s
    ", pNP->pszwName);
                    wprintf(L"pszwDeviceName--%s
    ", pNP->pszwDeviceName);
                    wprintf(L"Status--%d
    ", pNP->Status);
                    wprintf(L"
    ");
    
                    //continue;
                    if (pNP->Status != NCS_CONNECTED) continue;
                    std::string tmpName = CW2A(pNP->pszwName);
                    //printf("###### |%s| : |%s|
    ", tmpName.c_str(),(char*)nicName);
    
                    hr = pNSM->get_INetSharingConfigurationForINetConnection(pNC, &pNSC);
                    if (!strcmp(tmpName.c_str(), (char*)srcName))
                    {
                        printf("**************find nic srcName : %s
    ", (char*)srcName);
                        hr = pNSC->DisableSharing();
                        Sleep(500);
                        //getchar();
                        hr = pNSC->EnableSharing(ICSSHARINGTYPE_PUBLIC);
                    }
                    pNSC->Release();
    
                    hr = pNSM->get_INetSharingConfigurationForINetConnection(pNC, &pNSC);
                    if (!strcmp(tmpName.c_str(), (char*)dstName))
                    {
                        printf("**************find nic dstName : %s
    ", (char*)dstName);
                        hr = pNSC->DisableSharing();
                        Sleep(500);
                        hr = pNSC->EnableSharing(ICSSHARINGTYPE_PRIVATE);
                    }
                    pNSC->Release();
                }
            }
        }
        return hr;
    }

    添加相关代码并使用VS2015编译:

     需要管理员权限运行,Release目录有可执行程序

    使用方法:

    ConsoleApplication1.exe 能上网的网卡名称 需要上网的网卡名称

    比如:

    ConsoleApplication1.exe WLAN "以太网 4"

    当然也可以使用批处理文件,但需要注意下文件编码使用GBK 编码。

     本文涉代码及预编译程序下载地址:https://pan.baidu.com/s/1sRKwYDP_gFMegeK5rTP3rg

    可关注微信公众号(聊聊博文)后回复 2021012301 获取提取码。

    微信公众号:

  • E-Mail : Mike_Zhang@live.com
  • 转载请注明出处,谢谢!
查看全文
  • 相关阅读:
    定位服务器的性能
    关于tcp的keepalive
    写给future的话
    声音评测专用术语
    高效能人士必知铁律--note
    《如何高效学习》读书笔记
    如何快速接手一个系统?
    几个基础函数及特性
    最大的矩形(测试全对,为什么只有20分??)
    输入字符串(由0,1组成),编程计算其中连续0,1出现的最大次数
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/windowsICS20210123.html
  • Copyright © 2011-2022 走看看