0

如何确定映射驱动器的详细信息,例如其实际路径、FreeSize 等?因此,如果我在名为“MP”的机器上有一个映射驱动器,我如何使用 C++/Win32 或 Qt 确定映射文件夹的机器和路径以及其他实用细节?

我想从远程机器文件系统中提取信息。我可以与远程计算机建立 SMB 连接并访问共享驱动器,但我想从其文件系统中枚举所有信息。我怎样才能做到这一点?

Powershell中有一个命令,我们可以使用它来枚举此类信息,例如以下命令:

get-WmiObject win32_logicaldisk -Computername remotecomputer

但是,我想通过在我的应用程序中编写一些代码来获取此类信息,并以用户友好的格式向用户显示这些信息。

4

1 回答 1

0

您可以在 C++ 中使用 WMI 类win32_logicaldisk,示例如下:

#include <stdio.h>
#define _WIN32_DCOM
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
#include <iostream>
using namespace std;
#include <comdef.h>

void PrintDriveDetails(wstring drive)
{
    HRESULT hr;

    IWbemLocator* pWbemLocator = NULL;
    IWbemServices* pServices = NULL;
    IWbemClassObject* pDrive = NULL;
    hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
        RPC_C_AUTHN_LEVEL_DEFAULT,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL, EOAC_NONE, 0);

    if (FAILED(hr))
    {
        CoUninitialize();
        cout << "Failed to initialize security. Error code = 0x" << hex << hr << endl;
        return;
    }

    hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**)&pWbemLocator);
    if (FAILED(hr))
    {
        CoUninitialize();
        cout << "Failed to CoCreateInstance. Error code = 0x" << hex << hr << endl;
        return;
    }

    _bstr_t bstrNamespace = L"root\\cimv2";

    hr = pWbemLocator->ConnectServer(bstrNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pServices);
    if (FAILED(hr))
    {
        pWbemLocator->Release();
        CoUninitialize();
        cout << "Failed to Connect to the Server. Error code = 0x" << hex << hr << endl;
        return;
    }
    pWbemLocator->Release();
    printf("Successfully connected to namespace.\n");

    hr = CoSetProxyBlanket(
        pServices,
        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))
    {
        pServices->Release();
        cout << "Could not set proxy blanket. Error code = 0x" << hex << hr << endl;
        CoUninitialize();
        return;               // Program has failed.
    }

    wstring bstrPath = L"Win32_LogicalDisk.DeviceID=\"" + drive + L"\"";

    // *******************************************************//
    // Perform a full-instance retrieval. 
    // *******************************************************//
    hr = pServices->GetObject(BSTR(bstrPath.c_str()),
        0, 0, &pDrive, 0);
    if (FAILED(hr))
    {
        pServices->Release();
        CoUninitialize();
        cout << "failed GetObject. Error code = 0x" << hex << hr << endl;
        return;
    }
    // Display the object
    BSTR  bstrDriveObj;
    hr = pDrive->GetObjectText(0, &bstrDriveObj);
    if (FAILED(hr))
    {
        pServices->Release();
        CoUninitialize();
        cout << "failed GetObjectText. Error code = 0x" << hex << hr << endl;
        return;
    }
    printf("%S\n\n", bstrDriveObj);

    VARIANT freesize, totlesize;
    hr = pDrive->Get(L"FreeSpace", 0, &freesize, 0, NULL);
    if (FAILED(hr))
    {
        pServices->Release();
        CoUninitialize();
        cout << "failed Get FreeSpace. Error code = 0x" << hex << hr << endl;
        return;
    }
    printf("freesize %S\n", freesize.bstrVal);

    hr = pDrive->Get(L"Size", 0, &totlesize, 0, NULL);
    if (FAILED(hr))
    {
        pServices->Release();
        CoUninitialize();
        cout << "failed Get Size. Error code = 0x" << hex << hr << endl;
        return;
    }
    printf("totlesize : %S\n", totlesize.bstrVal);

    VariantClear(&freesize);
    VariantClear(&totlesize);
    pDrive->Release();
    pServices->Release();
    pServices = NULL;
}

void main(void)
{
    HRESULT hr = S_OK;
    hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);

    PrintDriveDetails(L"Z:");
    CoUninitialize();

    return;
};
于 2020-07-16T08:56:54.933 回答