通過程序自動設置網卡的“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!\r\n");
        return NULL;
    }

    hr = pNSECC->get__NewEnum(&pUnk);
    if (pUnk)
    {
        hr = pUnk->QueryInterface(__uuidof(IEnumVARIANT), (void**)&pEV);
        pUnk->Release();
    }


    wprintf(L"----------------------------------------------------------\n");
    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\n", pNP->pszwName);
                wprintf(L"pszwDeviceName--%s\n", pNP->pszwDeviceName);
                wprintf(L"Status--%d\n", pNP->Status);
                wprintf(L"\n");

                //continue;
                if (pNP->Status != NCS_CONNECTED) continue;
                std::string tmpName = CW2A(pNP->pszwName);
                //printf("###### |%s| : |%s|\r\n", tmpName.c_str(),(char*)nicName);

                hr = pNSM->get_INetSharingConfigurationForINetConnection(pNC, &pNSC);
                if (!strcmp(tmpName.c_str(), (char*)srcName))
                {
                    printf("**************find nic srcName : %s\r\n", (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\r\n", (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 獲取提取碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章