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
  • 转载请注明出处,谢谢!
查看全文
  • 相关阅读:
    二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
    思维题 HDOJ 5288 OO’s Sequence
    树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
    最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
    最大流增广路(KM算法) HDOJ 1533 Going Home
    最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱
    Complete the Word CodeForces
    Gadgets for dollars and pounds CodeForces
    Vasya and Basketball CodeForces
    Carries SCU
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/windowsICS20210123.html
  • Copyright © 2011-2022 走看看