VC++ 修改 Windows 操作系统网卡设备显示名称(修改网卡名)需要管理员权限

158 篇文章 1 订阅

源代码:(一)


            bool SetInterfaceName(int interface_index, const std::string& interface_name) noexcept
            {
                if (interface_index < 0 || interface_name.empty())
                {
                    return false;
                }

                SYSTEM_WINDOWS_COM_INITIALIZED WINDOWS_COM_INITIALIZED;
                _bstr_t bstr_interface_name = interface_name.data();
                return RenameAdapterByIndexWMI(interface_index, bstr_interface_name.GetBSTR());
            }

源代码:(二)

            /* https://devops-collective-inc.gitbook.io/windows-powershell-networking-guide/renaming-the-network-adapter */
            static bool RenameAdapterByIndexWMI(DWORD dwIndex, LPCWSTR lpNewName) noexcept
            {
                HRESULT hr = S_OK;

                // 创建 WMI 服务
                IWbemLocator* pLoc = NULL;
                hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
                if (FAILED(hr))
                {
                    return false;
                }

                IWbemServices* pSvc = NULL;
                hr = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
                if (FAILED(hr))
                {
                    pLoc->Release();
                    return false;
                }

                // 设置 WMI 服务安全级别
                hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
                if (FAILED(hr))
                {
                    pSvc->Release();
                    pLoc->Release();
                    return false;
                }

                // 构建 WQL 查询语句
                WCHAR wszQuery[512];
                swprintf_s(wszQuery, _countof(wszQuery), L"SELECT * FROM Win32_NetworkAdapter WHERE InterfaceIndex='%u'", dwIndex);

                // 查询符合条件的网卡对象
                IEnumWbemClassObject* pEnumerator = NULL;
                hr = pSvc->ExecQuery(_bstr_t(L"WQL"), _bstr_t(wszQuery), WBEM_FLAG_FORWARD_ONLY, NULL, &pEnumerator);
                if (FAILED(hr) || NULL == pEnumerator)
                {
                    pSvc->Release();
                    pLoc->Release();
                    return false;
                }

                // 获取匹配的第一个网卡对象
                IWbemClassObject* pNetAdapter = NULL;
                ULONG uReturned = 0;
                hr = pEnumerator->Next(WBEM_INFINITE, 1, &pNetAdapter, &uReturned);
                if (FAILED(hr) || NULL == pNetAdapter || uReturned == 0)
                {
                    pEnumerator->Release();
                    pSvc->Release();
                    pLoc->Release();
                    return false;
                }

                VARIANT vtName;
                memset(&vtName, 0, sizeof(vtName));

                // 将新的网卡名称转换为可写字符串,并设置 Name 属性
                WCHAR* pName = _wcsdup(lpNewName);
                vtName.vt = VT_BSTR;
                vtName.bstrVal = SysAllocString(pName);
                if (NULL != pName)
                {
                    free(pName);
                }

                hr = pNetAdapter->Put(L"NetConnectionID", 0, &vtName, CIM_STRING);
                if (FAILED(hr))
                {
                    VariantClear(&vtName);
                    pEnumerator->Release();
                    pNetAdapter->Release();
                    pSvc->Release();
                    pLoc->Release();
                    return false;
                }

                // 更新网卡对象
                hr = pSvc->PutInstance(pNetAdapter, WBEM_FLAG_UPDATE_ONLY, NULL, NULL);
                if (FAILED(hr))
                {
                    VariantClear(&vtName);
                    pEnumerator->Release();
                    pNetAdapter->Release();
                    pSvc->Release();
                    pLoc->Release();
                    return false;
                }

                // 释放资源
                VariantClear(&vtName);
                pEnumerator->Release();
                pNetAdapter->Release();
                pSvc->Release();
                pLoc->Release();
                return true;
            }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值