c++ - 在 Windows 中获取当前注册的组织名称(公司名称)

标签 c++ windows winapi

我有一个旧的 MFC 应用程序需要重建。

它包含一些读取当前用户名和公司的代码。它通过直接从注册表中读取来完成此操作。

我真的不认为这是一种非常可靠的方法,因为 future 版本的 Windows 可能会改变某些信息的存储方式和位置。所以我更愿意为此找到一个 API 调用。

我设法找到了 GetUserName function获取用户的姓名。

但是有没有API可以获取注册用户的公司名称呢?

最佳答案

以下函数基于我在 MSDN 文章“示例:从本地计算机获取 WMI 数据”中找到的代码,该文章位于 http://msdn.microsoft.com/en-us/library/aa390423%28v=vs.85%29.aspx。 .

bool GetRegisteredUserInformation(std::wstring &registeredUser, std::wstring &organization)
{
    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------
    HRESULT hResult = ::CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hResult))
    {
        return false;
    }
    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
    hResult = CoInitializeSecurity(
        nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_DEFAULT,
        RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE, nullptr);
    if (FAILED(hResult))
    {
        ::CoUninitialize();
        return false;
    }
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------
    IWbemLocator *pLoc = nullptr;
    hResult = CoCreateInstance(
        CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID *)&pLoc);
    if (FAILED(hResult))
    {
        ::CoUninitialize();
        return false;
    }
    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method
    IWbemServices *pSvc = nullptr;
    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hResult = pLoc->ConnectServer(
        _bstr_t(L"ROOT\\CIMV2"), nullptr, nullptr, 0, 0, 0, 0, &pSvc);
    if (FAILED(hResult))
    {
        pLoc->Release();
        ::CoUninitialize();
        return false;
    }
    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------
    hResult = CoSetProxyBlanket(
        pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr,
        RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE);
    if (FAILED(hResult))
    {
        pSvc->Release();
        pLoc->Release();
        ::CoUninitialize();
        return false;
    }
    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----
    // For example, get the name of the operating system
    IEnumWbemClassObject *pEnumerator = nullptr;
    hResult = pSvc->ExecQuery(
        bstr_t("WQL"), bstr_t("SELECT * FROM Win32_OperatingSystem"),
        WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
        nullptr, &pEnumerator);
    if (FAILED(hResult))
    {
        pSvc->Release();
        pLoc->Release();
        ::CoUninitialize();
        return false;
    }
    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
    IWbemClassObject *pclsObj;
    ULONG uReturn = 0;
    while (pEnumerator)
    {
        hResult = pEnumerator->Next(
            WBEM_INFINITE, 1, &pclsObj, &uReturn);
        if (0 == uReturn)
        {
            break;
        }
        VARIANT vtProp;
        hResult = pclsObj->Get(L"RegisteredUser", 0, &vtProp, 0, 0);
        if (SUCCEEDED(hResult) && VT_BSTR == vtProp.vt)
        {
            registeredUser = vtProp.bstrVal;
        }
        VariantClear(&vtProp);
        hResult = pclsObj->Get(L"Organization", 0, &vtProp, 0, 0);
        if (SUCCEEDED(hResult) && VT_BSTR == vtProp.vt)
        {
            organization = vtProp.bstrVal;
        }
        VariantClear(&vtProp);
        pclsObj->Release();
    }
    // Cleanup
    // ========
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    ::CoUninitialize();
    if (!registeredUser.empty() || !organization.empty())
    {
        return true;
    }
    return false;
}

关于c++ - 在 Windows 中获取当前注册的组织名称(公司名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24478162/

相关文章:

C + WinAPI : Creating A "Static" Like Class Which Allows Me To Update Caption

c++ - 为什么基于 C++ 范围的 for 循环在每次迭代时调用析构函数?

具有 2 个要求的 C++ 快速排序

c++ - 将正在运行的线程中的函数移动到新线程?

c++ - 使用 WinSock 监听任意 ICMP 超时 (TTL = 0) 数据包

c++ - 线程本地单例

python - Swig C++ 到 python : compiling a bunch of . cpp 和 .h 文件

c# - 如何刷新挂起的 FileSystemWatcher 事件?

c - 如何处理 Windows 的 ReadDirectoryChangesW() 及其混合的长/短文件名输出?

c - PE 文件部分 - SizeOfRawData 或 VirtualSize