我有一个旧的 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 ®isteredUser, 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/