1.重啟windows網卡命令
rem 禁用網卡
netsh interface set interface 本地連接 disabled
rem 啟用網卡
netsh interface set interface 本地連接 enabled
2.根據相關信息作出如下修改
rem 禁用網卡
netsh interface set interface 以太網 disabled
rem 啟用網卡
netsh interface set interface 以太網 enabled
三、以下是網上找到的C++代碼,
調試OK,需要管理員模式,requireAdministrator (/level='requireAdministrator'),不知道原文地址了,着時尷尬
方法一,VS2015 ANSI
- // lan2.cpp : 定義控制台應用程序的入口點。
- //
- #include "stdafx.h"
- #include <stdio.h>
- #include <windows.h>
- #include <Setupapi.h>
- #include <objbase.h>
- #pragma comment(lib, "Setupapi.lib")
- void EnumDevices(HDEVINFO hDevInfo)
- {
- SP_DEVINFO_DATA DeviceInfoData = { sizeof(SP_DEVINFO_DATA) };
- LPOLESTR guid;
- char devName[128];
- char instanceId[128];
- for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
- {
- StringFromCLSID(DeviceInfoData.ClassGuid, &guid);
- SetupDiClassNameFromGuid(&DeviceInfoData.ClassGuid, devName, 128, NULL);
- //printf("%s\n", devName);
- ; if (!strcmp(devName, "Net"))
- {
- SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, instanceId, 128, NULL);
- //printf("instanceId1:%s\n", instanceId);
- if (!strncmp(instanceId, "PCI", 3))
- {
- //wprintf(L"guid:%s\n", guid);
- // printf("devName:%s\n", devName);
- // printf("instanceId2:%s\n", instanceId);
- SP_PROPCHANGE_PARAMS params = { sizeof(SP_CLASSINSTALL_HEADER) };
- params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
- params.Scope = DICS_FLAG_CONFIGSPECIFIC;
- <span style="color:#ff0000;"> params.StateChange = DICS_DISABLE;
- </span><span style="color:#33ff33;"> //params.StateChange = DICS_ENABLE;
- </span> params.HwProfile = 0;
- SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER*)¶ms, sizeof(SP_PROPCHANGE_PARAMS));
- SetupDiChangeState(hDevInfo, &DeviceInfoData);
- }
- }
- CoTaskMemFree(guid);
- }
- }
- int main(int argc, char* argv[])
- {
- HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
- hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES);
- if (INVALID_HANDLE_VALUE == hDevInfo)
- return GetLastError();
- EnumDevices(hDevInfo);
- SetupDiDestroyDeviceInfoList(hDevInfo);
- return 0;
- }
UNICODE mode
- // lan2.cpp : 定義控制台應用程序的入口點。
- //
- #include "stdafx.h"
- #include <stdio.h>
- #include <windows.h>
- #include <Setupapi.h>
- #include <objbase.h>
- #pragma comment(lib, "Setupapi.lib")
- int main(int argc, char* argv[])
- {
- HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
- hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES);
- if (INVALID_HANDLE_VALUE == hDevInfo)
- return GetLastError();
- //EnumDevices(hDevInfo);
- SP_DEVINFO_DATA DeviceInfoData = { sizeof(SP_DEVINFO_DATA) };
- LPOLESTR guid;
- wchar_t devName[128];
- wchar_t instanceId[128];
- for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
- {
- StringFromCLSID(DeviceInfoData.ClassGuid, &guid);
- SetupDiClassNameFromGuid(&DeviceInfoData.ClassGuid, devName, 128, NULL);
- // printf("%s\n", devName);
- if (!wcscmp(devName, _T("Net")))
- {
- SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, instanceId, 128, NULL);
- //printf("instanceId1:%s\n", instanceId);
- if (!wcsncmp(instanceId, _T("PCI"), 3))
- {
- //wprintf(L"guid:%s\n", guid);
- // printf("devName:%s\n", devName);
- // printf("instanceId2:%s\n", instanceId);
- SP_PROPCHANGE_PARAMS params = { sizeof(SP_CLASSINSTALL_HEADER) };
- params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
- params.Scope = DICS_FLAG_CONFIGSPECIFIC;
- <span style="color:#ff0000;"> // params.StateChange = DICS_DISABLE;
- </span><span style="color:#009900;"> params.StateChange = DICS_ENABLE;
- </span> params.HwProfile = 0;
- SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER*)¶ms, sizeof(SP_PROPCHANGE_PARAMS));
- SetupDiChangeState(hDevInfo, &DeviceInfoData);
- }
- }
- CoTaskMemFree(guid);
- }
- SetupDiDestroyDeviceInfoList(hDevInfo);
- return 0;
- }
方法二.VS2015 UNICODE
SetupDiCallClassInstaller函數需要編譯64位程序運行64位系統
- // LAN.cpp : 定義控制台應用程序的入口點。
- //
- #include "stdafx.h"
- #include <windows.h>
- #include <SetupAPI.h>
- #include <stdio.h>
- #include <tchar.h>
- #define ERROR_IN_WOW64 (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x235)
- #pragma comment(lib,"setupapi.lib")
- DWORD CtrlNetcard(BOOL bStatus);
- void _tmain(int arg, TCHAR** argv)
- {
- BOOL b = FALSE;
- DWORD err = 0;
- if (2 == arg)
- {
- argv++;
- if (!_tcsicmp(TEXT("enable"), *argv))
- {
- b = TRUE;
- err = CtrlNetcard(TRUE);
- }
- else if (!_tcsicmp(TEXT("disable"), *argv))
- {
- b = FALSE;
- err = CtrlNetcard(FALSE);
- }
- else
- {
- goto main_end;
- }
- _tprintf(_T("\n%s NetAdapter %s !\n"),
- b ? TEXT("Enable") : TEXT("Disable"),
- err ? TEXT("fail") : TEXT("success"));
- return;
- }
- main_end:
- _tprintf(TEXT("\nenable NetCard: enable"));
- _tprintf(TEXT("\ndisable NetCard: disable\n"));
- }
- DWORD CtrlNetcard(BOOL bStatus)
- {
- LPCTSTR HardwareId = TEXT("{4D36E972-E325-11CE-BFC1-08002BE10318}");
- GUID g = { 0X4D36E972, 0XE325, 0X11CE,{ 0XBF, 0XC1, 0X08, 0X00, 0X2B, 0XE1, 0X03, 0X18 } };
- DWORD NewState = 0;
- //調用ddk函數,來禁用網卡
- DWORD i = 0, err = 0;
- HDEVINFO hDevInfo = NULL;
- SP_DEVINFO_DATA spDevInfoData = { 0 };
- NewState = bStatus ? DICS_ENABLE : DICS_DISABLE;
- //訪問系統的硬件庫
- hDevInfo = SetupDiGetClassDevs(NULL, TEXT("PCI"), NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
- if (INVALID_HANDLE_VALUE == hDevInfo)
- {
- _tprintf(TEXT("訪問系統硬件出錯!"));
- return GetLastError();
- }
- //枚舉硬件,獲得需要的接口
- spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
- memcmp(&(spDevInfoData.ClassGuid), &g, sizeof(GUID));
- for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)
- {
- PBYTE PropertyBuffer = NULL;
- DWORD PropertyBufferSize = 0;
- //獲得硬件的屬性值
- while (!SetupDiGetDeviceRegistryProperty(
- hDevInfo,
- &spDevInfoData,
- SPDRP_CLASSGUID,
- NULL,
- PropertyBuffer,
- PropertyBufferSize,
- &PropertyBufferSize))
- {
- if (ERROR_INSUFFICIENT_BUFFER == GetLastError())
- {
- if (PropertyBuffer)
- {
- free(PropertyBuffer);
- }
- PropertyBuffer = (PBYTE)malloc(PropertyBufferSize);
- }
- else
- {
- break;
- }
- }
- if (!PropertyBuffer)
- {
- continue;
- }
- //MessageBox(NULL, (LPCTSTR)PropertyBuffer, L"提示", MB_OK);
- if (!_tcsicmp(HardwareId, (LPTSTR)PropertyBuffer))
- {
- SP_PROPCHANGE_PARAMS spPropChangeParams;
- //printf("PropertyBuffer ok\n");
- free(PropertyBuffer);
- spPropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
- spPropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
- spPropChangeParams.Scope = DICS_FLAG_GLOBAL;
- spPropChangeParams.StateChange = NewState;
- if (!SetupDiSetClassInstallParams(hDevInfo, &spDevInfoData, (SP_CLASSINSTALL_HEADER*)&spPropChangeParams, sizeof(spPropChangeParams)))
- {
- err = GetLastError();
- printf("SetupDiSetClassInstallParams:%d\n", GetLastError());
- goto cleanup_DeviceInfo;
- }
- if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &spDevInfoData))
- {
- err = GetLastError();
- printf("SetupDiCallClassInstaller:%x\n", GetLastError());
- goto cleanup_DeviceInfo;
- }
- }
- else
- {
- //printf("PropertyBuffer error\n");
- free(PropertyBuffer);
- }
- }
- cleanup_DeviceInfo:
- SetupDiDestroyDeviceInfoList(hDevInfo);
- return err;
- }
方法三.網上相關:http://blog.csdn.net/buyicn/article/details/6438635
此前,提到為了實現修改IP(一網卡對應多個IP,不重啟電腦讓修改立即生效),我嘗試在VC6.0上調試采用WMI實現的修改IP的程序,編譯不過的情況屢屢出現,在網上搜索了很久就是沒有找到徹底的解決方法,最后只好放棄通過WMI來設置IP了!
那么,另一個思路(修改注冊表中IP項,然后重啟網卡)是否能行呢?於是,繼續尋求重啟網卡的方法,沒想到居然找到了一些不錯的資料。現整理如下,供日后參考。
(1)《vc++ 修改IP地址DNS 附帶源碼》實例代碼,來自csdn下載頻道,我下載下來調試過了,貌似和我上面提及的思路一致:通過重啟網卡來讓設置的IP立即生效。
(2)《程序禁用啟用網絡/網卡》是一個封裝好的函數,我復制到本地並適當修改之后,就調試通過了!正好是我想要的:)關於函數中的配置文件ConfigInfo.ini,其內容貌似如下所示:
- [NETCARD]
- TYPE=PCI
- NAME=NVIDIA nForce Networking Controller
(3)《實戰DeviceIoControl 之五:列舉已安裝的存儲設備》這篇文章詳細地介紹了如何訪問設備,有代碼有注釋(作者另外的幾篇《實戰DeviceIoControl 》也很不錯),是很好的入門教材!
(4)《Windows下不重啟機器程序修改IP的三種方法》一篇總結性的文章,對幾種實現方法做了簡介,讓我們有一個全局的認識。
網上應該還有好資料,等以后遇到了再整理!
http://blog.csdn.net/greless/article/details/70236969