程式列舉系統所有裝置,找出類別為「Net」(網路介面卡)且裝置例項 ID 以「PCI」開頭的裝置,呼叫 SetupAPI 將其停用。適用於自動化部署、測試環境重置等場景。
SetupDiGetClassDevs:取得裝置資訊集合(DIGCF_PRESENT | DIGCF_ALLCLASSES)。SetupDiEnumDeviceInfo:逐一列舉裝置。SetupDiClassNameFromGuid:取得類別名稱,篩選 "Net"。SetupDiGetDeviceInstanceId:取得例項 ID,篩選 "PCI" 前綴。SetupDiSetClassInstallParams + SetupDiChangeState:設定 DICS_DISABLE 狀態變更並套用。#include <stdio.h>
#include <windows.h>
#include <Setupapi.h>
#include <objbase.h>
void EnumDevices(HDEVINFO hDevInfo) {
SP_DEVINFO_DATA DeviceInfoData = { sizeof(SP_DEVINFO_DATA) };
LPOLESTR guid;
char devName[128], instanceId[128];
for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++) {
StringFromCLSID(DeviceInfoData.ClassGuid, &guid);
SetupDiClassNameFromGuid(&DeviceInfoData.ClassGuid, devName, 128, NULL);
if (strcmp(devName, "Net") == 0) {
SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, instanceId, 128, NULL);
if (strncmp(instanceId, "PCI", 3) == 0) {
wprintf(L"%s\n", guid);
printf("%s\n", devName);
printf("%s\n", instanceId);
SP_PROPCHANGE_PARAMS params = { sizeof(SP_CLASSINSTALL_HEADER) };
params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
params.Scope = DICS_FLAG_CONFIGSPECIFIC;
params.StateChange = DICS_DISABLE;
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 = SetupDiGetClassDevs(NULL, NULL, NULL,
DIGCF_PRESENT | DIGCF_ALLCLASSES);
if (hDevInfo == INVALID_HANDLE_VALUE) return GetLastError();
EnumDevices(hDevInfo);
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
Setupapi.lib、Ole32.lib。HwProfile=0),重啟後恢復。INetCfg COM 介面實現更精細的網路組態管理(IP、綁定順序等)。DevCon.exe (Windows DDK 工具) 進行無程式碼操作對比驗證。| 現象 | 可能原因 | 解決 |
|---|---|---|
| SetupDiGetClassDevs 失敗 | 缺少 Setupapi.lib 連結 | 專案設定加入 Setupapi.lib |
| 存取被拒絕 | 非管理員執行 | 以系統管理員身分執行 |
| 未找到目標網卡 | 類別名非 "Net" 或 InstanceId 不以 PCI 開頭 | 輸出 devName/instanceId 確認實際值調整篩選 |
本範例展示了以 C 語言直接呼叫 Windows 系統級 API 管理硬體裝置的標準模式,可作為裝置管理工具開發的起點。