Win32_SystemDriver禁用设备驱动程序

时间:2015-03-25 09:59:16

标签: c++ driver wmi

试图找到我的问题的答案:https://stackoverflow.com/questions/29181012/c-control-usb-drives-connected-to-my-system,我使用SetupDiXxx Classes找出答案。但问题是,一旦禁用/启用它,它就能够从设备管理器启用/禁用该设备。所以任何用户都可以轻松克服禁令。

在进一步研究中,我看到Win32_SystemDriver WMIStopService有一个C++方法可用于禁用设备的驱动程序。但我不确定如何编写相同的代码。任何人都可以帮助我在MSVS 2010编码。我在{{1}}。

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并按照说明操作,直到您阻止设备安装。