您的位置:首页 > 其它

wmi 获取当前登录用户名

2013-05-02 11:27 204 查看
int GetUserName(char* szUserName)

{

#ifdef _DEBUG

CHAR szEchoStr[256];

#endif

DWORD nCount = 0;

HRESULT hres;

// Initialize COM.

hres = CoInitialize(NULL);

if (FAILED(hres))

{

#ifdef _DEBUG

sprintf(szEchoStr, "CoInitiaLize: %x", hres);

OutputDebugString(szEchoStr);

#endif

return 1; // Program has failed.

}

// Initialize

hres = CoInitializeSecurity(

NULL,

-1, // COM negotiates service

NULL, // Authentication services

NULL, // Reserved

RPC_C_AUTHN_LEVEL_DEFAULT, // authentication

RPC_C_IMP_LEVEL_IMPERSONATE, // Impersonation

NULL, // Authentication info

EOAC_NONE, // Additional capabilities

NULL // Reserved

);

if (FAILED(hres))

{

if(hres != RPC_E_TOO_LATE)

{

#ifdef _DEBUG

sprintf(szEchoStr, "CoInitializeSecurity: %x", hres);

OutputDebugString(szEchoStr);

#endif

CoUninitialize();

return 1;

}

}

// Obtain the initial locator to Windows Management

// on a particular host computer.

IWbemLocator *pLoc = 0;

hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);

if (FAILED(hres))

{

#ifdef _DEBUG

sprintf(szEchoStr, "CoCreateInstance: %x", hres);

OutputDebugString(szEchoStr);

#endif

CoUninitialize();

return 1; // Program has failed.

}

IWbemServices *pSvc = 0;

hres = pLoc->ConnectServer(

_bstr_t(L"ROOT\\CIMV2"), // WMI namespace

NULL, // User name

NULL, // User password

0, // Locale

NULL, // Security flags

0, // Authority

0, // Context object

&pSvc // IWbemServices proxy

);

if (FAILED(hres))

{

#ifdef _DEBUG

sprintf(szEchoStr, "ConnectServer: %x", hres);

OutputDebugString(szEchoStr);

#endif

pLoc->Release();

CoUninitialize();

return 1; // Program has failed.

}

// Set the IWbemServices proxy so that impersonation

// of the user (client) occurs.

hres = CoSetProxyBlanket(

pSvc, // the proxy to set

RPC_C_AUTHN_WINNT, // authentication service

RPC_C_AUTHZ_NONE, // authorization service

NULL, // Server principal name

RPC_C_AUTHN_LEVEL_CALL, // authentication level

RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level

NULL, // client identity

EOAC_NONE // proxy capabilities

);

if (FAILED(hres))

{

#ifdef _DEBUG

sprintf(szEchoStr, "CoSetProxyBlanket: %x", hres);

OutputDebugString(szEchoStr);

#endif

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1; // Program has failed.

}

//

IEnumWbemClassObject* pEnumerator = NULL;

hres = pSvc->ExecQuery(

bstr_t("WQL"),

bstr_t("SELECT * FROM Win32_ComputerSystem"),

WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,

NULL,

&pEnumerator);

if (FAILED(hres))

{

#ifdef _DEBUG

sprintf(szEchoStr, "ExecQuery: %x", hres);

OutputDebugString(szEchoStr);

#endif

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1; // Program has failed.

}

else

{

IWbemClassObject *pclsObj;

ULONG uReturn = 0;

char *pstrResult = NULL;

while (pEnumerator)

{

HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,

&pclsObj, &uReturn);

if(0 == uReturn)

{

break;

}

VARIANT vtUserName;

// Get the value of the Name property

hres = pclsObj->Get(L"UserName",
0, &vtUserName, 0, 0);

if(SUCCEEDED(hres))

{

if(vtUserName.vt != VT_NULL)

{

pstrResult = _com_util::ConvertBSTRToString(vtUserName.bstrVal);

if(pstrResult)

{

strncpy(szUserName, pstrResult, sizeof(UserIdentifyInfo.szUserName));

free(pstrResult);

}

}

}

VariantClear(&vtUserName);

pclsObj->Release();

}

}

pSvc->Release();

pLoc->Release();

pEnumerator->Release();

CoUninitialize();

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: