275 lines
6.8 KiB
C++
275 lines
6.8 KiB
C++
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
|
|
// WBEMDiag.cpp : Defines the entry point for the console application.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#include <wbemcli.h>
|
|
#include <comdef.h>
|
|
|
|
bool ConnectNamespace(IWbemLocator* pLocator, char* szNamespace, IWbemServices** ppNamespace);
|
|
void ListProviders(IWbemServices* pNamespace, char* szNamespace);
|
|
void ListComputerSystem(IWbemServices* pNamespace);
|
|
void PostError(HRESULT hr, UINT uContext);
|
|
void PrintHelp();
|
|
void PrintStringEx(UINT uID, ...);
|
|
|
|
|
|
HINSTANCE hInst; // Global for LoadString() to use
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
try{
|
|
|
|
HRESULT hr;
|
|
char szNamespace[MAX_PATH];
|
|
bool bListProviders = false;
|
|
hInst = GetModuleHandle(NULL);
|
|
|
|
|
|
switch(argc)
|
|
{
|
|
/*#ifdef _DEBUG
|
|
case 4:
|
|
if (strcmp(argv[1], "-e") == 0)
|
|
{
|
|
HRESULT hr = strtoul(argv[2], NULL, 16);
|
|
UINT uContext = atoi(argv[3]);
|
|
PostError(hr, uContext);
|
|
break;
|
|
};
|
|
#endif
|
|
*/
|
|
case 3:
|
|
if (strcmp(argv[1],"-p") == 0)
|
|
{
|
|
bListProviders = true;
|
|
strcpy(szNamespace,argv[2]);
|
|
}
|
|
else
|
|
PrintHelp();
|
|
break;
|
|
case 2:
|
|
if (strcmp(argv[1],"-p") == 0)
|
|
bListProviders = true;
|
|
else if ((strcmp(argv[1], "/?") == 0) ||
|
|
(strcmp(argv[1], "-?") == 0) ||
|
|
(strcmp(argv[1], "/h") == 0) ||
|
|
(strcmp(argv[1], "-h") == 0))
|
|
PrintHelp();
|
|
else
|
|
{
|
|
strcpy(szNamespace,"\\\\");
|
|
strcat(szNamespace, argv[1]);
|
|
strcat(szNamespace, "\\root\\cimv2");
|
|
break;
|
|
};
|
|
default:
|
|
strcpy(szNamespace,"root\\cimv2");
|
|
};
|
|
|
|
// Initialize COM.
|
|
if ((hr = CoInitialize(NULL)) == S_OK)
|
|
{
|
|
IWbemLocator* pLocator;
|
|
// Create an instance of the WbemLocator interface
|
|
PrintStringEx(IDS_FINDINGLOCATOR);
|
|
if ((hr = CoCreateInstance(CLSID_WbemLocator,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IWbemLocator,
|
|
(LPVOID *) &pLocator)) == S_OK)
|
|
{
|
|
IWbemServices* pNamespace = NULL;
|
|
if (ConnectNamespace(pLocator, szNamespace, &pNamespace))
|
|
{
|
|
if (bListProviders)
|
|
ListProviders(pNamespace, szNamespace);
|
|
else
|
|
ListComputerSystem(pNamespace);
|
|
pNamespace->Release();
|
|
};
|
|
pLocator->Release();
|
|
}
|
|
else
|
|
PostError(hr, IDS_WBEMINIT);
|
|
}
|
|
else
|
|
PostError(hr, IDS_COMINIT);
|
|
|
|
PrintStringEx(IDS_TRYHELP);
|
|
return 0;
|
|
|
|
}
|
|
catch(...)
|
|
{
|
|
printf("\n\nThis program encounted an unrecoverable error.\n");
|
|
return -1;
|
|
};
|
|
}
|
|
bool ConnectNamespace(IWbemLocator* pLocator, char* szNamespace,
|
|
IWbemServices** ppNamespace)
|
|
{
|
|
PrintStringEx(IDS_NSCONNECTING, szNamespace);
|
|
HRESULT hr;
|
|
hr = pLocator->ConnectServer(_bstr_t(szNamespace), NULL, NULL,
|
|
NULL, 0L, NULL, NULL, ppNamespace);
|
|
|
|
if (FAILED(hr))
|
|
PostError(hr, IDS_NSCONNECT);
|
|
else
|
|
PrintStringEx(IDS_CONNECTSUCCESS);
|
|
return (hr == S_OK);
|
|
};
|
|
|
|
|
|
void ListProviders(IWbemServices* pNamespace, char* szNamespace)
|
|
{
|
|
IEnumWbemClassObject* pEnum;
|
|
HRESULT hr = pNamespace->CreateInstanceEnum(_bstr_t("__Win32Provider"),
|
|
WBEM_FLAG_DEEP, 0, &pEnum);
|
|
if (FAILED(hr))
|
|
PostError(hr, IDS_PROVIDERLIST);
|
|
|
|
|
|
ULONG ulReturned;
|
|
IWbemClassObject* pProvider;
|
|
|
|
PrintStringEx(IDS_NSPROVIDERS, szNamespace);
|
|
while(SUCCEEDED(hr = pEnum->Next(INFINITE, 1, &pProvider, &ulReturned)))
|
|
{
|
|
if (ulReturned == 1) try {
|
|
|
|
_variant_t vProviderName;
|
|
_variant_t vProviderCLSID;
|
|
|
|
hr = pProvider->Get(_bstr_t("Name"), 0, &vProviderName, NULL, NULL);
|
|
hr = pProvider->Get(_bstr_t("CLSID"), 0, &vProviderCLSID, NULL, NULL);
|
|
|
|
printf("%s\t: ", (char*)(_bstr_t)vProviderCLSID);
|
|
printf("%s\n", (char*)(_bstr_t)vProviderName);
|
|
|
|
pProvider->Release();
|
|
}
|
|
catch(_com_error err)
|
|
{
|
|
PostError(err.Error(), IDS_PROVIDERGET);
|
|
}
|
|
else
|
|
break;
|
|
};
|
|
|
|
pEnum->Release();
|
|
|
|
if (FAILED(hr))
|
|
PostError(hr, IDS_PROVIDERENUM);
|
|
|
|
};
|
|
|
|
void ListComputerSystem(IWbemServices* pNamespace)
|
|
{
|
|
IEnumWbemClassObject* pEnum;
|
|
HRESULT hr = pNamespace->CreateInstanceEnum(_bstr_t("Win32_ComputerSystem"),
|
|
WBEM_FLAG_DEEP, 0, &pEnum);
|
|
if (FAILED(hr))
|
|
PostError(hr, IDS_COMPUTERGET);
|
|
|
|
ULONG ulReturned;
|
|
IWbemClassObject* pProvider;
|
|
|
|
while(SUCCEEDED(hr = pEnum->Next(INFINITE, 1, &pProvider, &ulReturned)))
|
|
{
|
|
if (ulReturned == 1) try {
|
|
|
|
PrintStringEx(IDS_COMPUTERDETAILS);
|
|
|
|
_variant_t vBootupState, vCaption, vCreationClassName, vDescription,
|
|
vDomain, vName, vPrimaryOwnerName, vSystemType, vUserName;
|
|
|
|
pProvider->Get(_bstr_t("BootupState"), 0, &vBootupState, NULL, NULL);
|
|
pProvider->Get(_bstr_t("Caption"), 0, &vCaption, NULL, NULL);
|
|
pProvider->Get(_bstr_t("CreationClassName"), 0, &vCreationClassName, NULL, NULL);
|
|
pProvider->Get(_bstr_t("Description"), 0, &vDescription, NULL, NULL);
|
|
pProvider->Get(_bstr_t("Domain"), 0, &vDomain, NULL, NULL);
|
|
pProvider->Get(_bstr_t("Name"), 0, &vName, NULL, NULL);
|
|
pProvider->Get(_bstr_t("PrimaryOwnerName"), 0, &vPrimaryOwnerName, NULL, NULL);
|
|
pProvider->Get(_bstr_t("SystemType"), 0, &vSystemType, NULL, NULL);
|
|
pProvider->Get(_bstr_t("UserName"), 0, &vUserName, NULL, NULL);
|
|
|
|
printf("BootupState:\t\t\t%s\n", (char*)(_bstr_t)vBootupState );
|
|
printf("Caption:\t\t\t%s\n", (char*)(_bstr_t)vCaption );
|
|
printf("CreationClassName:\t\t%s\n", (char*)(_bstr_t)vCreationClassName );
|
|
printf("Description:\t\t\t%s\n", (char*)(_bstr_t)vDescription );
|
|
printf("Domain:\t\t\t\t%s\n", (char*)(_bstr_t)vDomain );
|
|
printf("Name:\t\t\t\t%s\n", (char*)(_bstr_t)vName );
|
|
printf("PrimaryOwnerName:\t\t%s\n", (char*)(_bstr_t)vPrimaryOwnerName );
|
|
printf("SystemType:\t\t\t%s\n", (char*)(_bstr_t)vSystemType );
|
|
printf("UserName:\t\t\t%s\n", (char*)(_bstr_t)vUserName );
|
|
|
|
pProvider->Release();
|
|
}
|
|
catch(_com_error err)
|
|
{
|
|
PostError(err.Error(), IDS_COMPUTERLIST);
|
|
}
|
|
else
|
|
break;
|
|
};
|
|
|
|
pEnum->Release();
|
|
if (FAILED(hr))
|
|
PostError(hr, IDS_COMPUTERENUM);
|
|
|
|
};
|
|
|
|
void PostError(HRESULT hr, UINT uContext)
|
|
{
|
|
char szAdvice[1024];
|
|
|
|
switch(hr)
|
|
{
|
|
case 0x80040154:
|
|
switch(uContext)
|
|
{
|
|
case IDS_COMPUTERLIST:
|
|
LoadString(hInst, ERR_80040154_A, szAdvice, 1024);
|
|
break;
|
|
case IDS_WBEMINIT:
|
|
LoadString(hInst, ERR_80040154_B, szAdvice, 1024);
|
|
break;
|
|
default:
|
|
LoadString(hInst, hr, szAdvice, 1024);
|
|
};
|
|
break;
|
|
case 0x80080005:
|
|
LoadString(hInst, ERR_80080005, szAdvice, 1024);
|
|
break;
|
|
default:
|
|
if (LoadString(hInst, hr, szAdvice, 1024) == 0)
|
|
LoadString(hInst, IDS_NO_ADVICE, szAdvice, 1024);
|
|
};
|
|
|
|
char szContext[70];
|
|
LoadString(hInst, uContext, szContext, 70);
|
|
|
|
PrintStringEx(IDS_ERROR, szContext, hr, szAdvice);
|
|
|
|
exit(1);
|
|
};
|
|
|
|
void PrintHelp()
|
|
{
|
|
PrintStringEx(IDS_HELP);
|
|
exit(0);
|
|
};
|
|
|
|
void PrintStringEx(UINT uID, ...)
|
|
{
|
|
char szString[1024];
|
|
va_list params;
|
|
va_start(params, uID);
|
|
|
|
LoadString(hInst, uID, szString, 1024);
|
|
vprintf(szString, params);
|
|
va_end(params);
|
|
}; |