试图找到我的问题的答案:https://stackoverflow.com/questions/29181012/c-control-usb-drives-connected-to-my-system,我使用SetupDiXxx Classes
找出答案。但问题是,一旦禁用/启用它,它就能够从设备管理器启用/禁用该设备。所以任何用户都可以轻松克服禁令。
在进一步研究中,我看到Win32_SystemDriver
WMI
类StopService
有一个C++
方法可用于禁用设备的驱动程序。但我不确定如何编写相同的代码。任何人都可以帮助我在MSVS 2010
编码。我在{{1}}。
答案 0 :(得分:1)
您可以使用以下方法访问C ++中的WMI类: https://msdn.microsoft.com/en-us/library/aa392109(v=vs.85).aspx 但这似乎非常hacky并不容易。如果你这样做,这是我能找到的最短的例子:https://msdn.microsoft.com/en-us/library/aa390421(v=vs.85).aspx。我已经更新它以匹配你正在做的事情:
#define _WIN32_DCOM
#include <windows.h>
#include <Wbemidl.h>
#include <comdef.h>
# pragma comment(lib, "wbemuuid.lib")
void main()
{
BSTR MethodName = SysAllocString(L"StopService");
BSTR ClassName = SysAllocString(L"WINMGMTS:\\\\.\\ROOT\\CIMV2\\ms_409:Win32_SystemDriver");
IWbemServices *pSvc = NULL;
HRESULT hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
return;
}
hres = CoInitializeSecurity(
NULL,
-1, // COM negotiates service
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres))
{
CoUninitialize();
return;
}
IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *)&pLoc);
if (FAILED(hres))
{
CoUninitialize();
return;
}
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"),
NULL,
NULL,
0,
NULL,
0,
0,
&pSvc
);
IWbemClassObject* pClass = NULL;
hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);
if (FAILED(hres))
{
CoUninitialize();
return;
}
IWbemClassObject* pInParamsDefinition = NULL;
hres = pClass->GetMethod(MethodName, 0,
&pInParamsDefinition, NULL);
// Execute Method
IWbemClassObject* pOutParams = NULL;
hres = pSvc->ExecMethod(ClassName, MethodName, 0, NULL, NULL, &pOutParams, NULL);
CoUninitialize();
}
您可以将类名替换为指向您的驱动程序。如果不这样做,则WBEM_E_INVALID_OBJECT_PATH将失败。要找到它,您需要枚举您的wmi对象,以便您可以查看/选择。这在powershell中绝对是最简单的,只需打开powershell并运行Get-WmiObject -class Win32_SystemDriver
。虽然你应该从powershell做到这一切,但要想一想。
听起来您可能会考虑学习如何利用Windows安全策略来限制可以使用的设备: https://msdn.microsoft.com/en-us/library/bb530324.aspx。您将首先启动gpedit并按照说明操作,直到您阻止设备安装。