wmi에서 가져온 메소드 실행 함수 실행시 나오는 반환값에 대하여 질문드립니다. Execmethod
글쓴이: ehaakdl / 작성시간: 화, 2016/06/07 - 5:21오후
msdn에서 지원하는 win32_volume class format method를 사용하는 도중 execmethod 반환값이 WBEM_E_INVALID_METHOD_PARAMETERS이것이 나와 질문 드립니다.
wmi에서 연결후 보시는바와 같이 메소드 실행 하엿는대 반환값이 WBEM_E_INVALID_METHOD_PARAMETERS 이렇게 나왔습니다. 찾아본 결과 execmethod로 넣어준 파라
미터가 유효하지 않거나 클래스가 정적으로 ?? 만들어져서?? 원인이 두가지 라는대 제가 보기엔 넘겨준 값들은 다 리턴값 체크해서 확인한 뒤 넣은건데 왜 이런
반환값이 나오는지 의문이 듭니다.
이건 에러값에 대한 정보입니다.
https://msdn.microsoft.com/ko-kr/library/aa392103(v=vs.85).aspx
int main(void)
{
HRESULT hresult = 0;
IWbemLocator *pLoc = 0;
IWbemServices *pSvc = 0;
IWbemClassObject *pObj = NULL;
BSTR ClassName = SysAllocString(L"Win32_Volume");
BSTR MethodName = SysAllocString(L"Format");
//초기화 com
hresult = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (FAILED(hresult))
{
return hresult;
}
hresult = CoInitializeSecurity(
NULL, // security descriptor
-1, // use this simple setting
NULL, // use this simple setting
NULL, // reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // authentication level
RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level
NULL, // use this simple setting
EOAC_NONE, // no special capabilities
NULL);
if (FAILED(hresult))
{
CoUninitialize();
wprintf(L"Failed to initialize security.");
//cout << "Failed to initialize security. Error code = 0x"
// << hex << hcomSecurityhr << endl;
return hresult;
}
hresult = CoCreateInstance(CLSID_WbemLocator, 0,
CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
if (FAILED(hresult))
{
wprintf(L"Failed to create IWbemLocator object. \n");
//cout << "Failed to create IWbemLocator object. Err code = 0x"
// << hex << hr << endl;
CoUninitialize();
return hresult; // Program has failed.
}
// Connect to the root\default namespace with the current user.
hresult = pLoc->ConnectServer(
BSTR(L"ROOT\\CIMV2"), //namespace
NULL, // User name
NULL, // User password
0, // Locale
NULL, // Security flags
0, // Authority
0, // Context object
&pSvc); // IWbemServices proxy
if (FAILED(hresult))
{
wprintf(L"Could not connect\n");
//cout << "Could not connect. Error code = 0x"
// << hex << hr << endl;
pLoc->Release();
CoUninitialize();
return hresult; // Program has failed.
}
wprintf(L"connect wmi succes\n");
//cout << "Connected to WMI" << endl;
// Step 5: --------------------------------------------------
// Set security levels for the proxy ------------------------
hresult = CoSetProxyBlanket(
pSvc, // Indicates the proxy to set
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // client identity
EOAC_NONE // proxy capabilities
);
if (FAILED(hresult))
{
wprintf(L"Could not set proxy blanket\n");
//cout << "Could not set proxy blanket. Error code = 0x"
// << hex << hresult << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
//get class
//The pWbemSvc pointer is of type IWbemServices*
//BSTR ClassName = SysAllocString(L"WINMGMTS:\\\\.\\ROOT\\CIMV2:Win32_Volume");
/*
TCHAR Drive[250];
TCHAR ClassDir[1024];
wprintf(L"드라이브 입력:");
wscanf_s(L"%s",Drive,sizeof(TCHAR)*250);
wsprintf(ClassDir,L"WINMGMTS:\\\\.\\ROOT\\CIMV2:Win32_Volume.Driveletter=%s",Drive);
BSTR ClassName = SysAllocString(ClassDir);
*/
//BSTR ClassName = SysAllocString(L"WINMGMTS:\\\\.\\ROOT\\CIMV2:Win32_Volume");
hresult = pSvc->GetObject(ClassName, 0, 0, &pObj, 0);
if (FAILED(hresult))
{
wprintf(L"Fail GetObject\n");
pSvc->Release();
CoUninitialize();
switch (hresult)
{
case WBEM_E_ACCESS_DENIED:
wprintf(L"WBEM_E_ACCESS_DENIED\n");
break;
case WBEM_E_FAILED:
wprintf(L"WBEM_E_FAILED\n");
break;
case WBEM_E_INVALID_CLASS:
wprintf(L"WBEM_E_INVALID_CLASS\n");
break;
case WBEM_E_INVALID_PARAMETER:
wprintf(L"WBEM_E_INVALID_PARAMETER\n");
break;
case WBEM_E_INVALID_OBJECT_PATH:
wprintf(L"WBEM_E_INVALID_OBJECT_PATH\n");
break;
case WBEM_E_NOT_FOUND:
wprintf(L"WBEM_E_NOT_FOUND\n");
break;
case WBEM_E_OUT_OF_MEMORY:
wprintf(L"WBEM_E_OUT_OF_MEMORY\n");
break;
case WBEM_E_SHUTTING_DOWN:
wprintf(L"WBEM_E_SHUTTING_DOWN\n");
break;
case WBEM_E_TRANSPORT_FAILURE:
wprintf(L"WBEM_E_TRANSPORT_FAILURE\n");
break;
case WBEM_S_NO_ERROR:
wprintf(L"WBEM_S_NO_ERROR\n");
default:
break;
}
return hresult;
}
wprintf(L"Class Succes\n");
VARIANT v_DriveLetter;
VariantInit(&v_DriveLetter);
V_VT(&v_DriveLetter) = VT_BSTR;
v_DriveLetter.bstrVal = L"D:";
hresult = pObj->Put(L"DriveLetter", 0, &v_DriveLetter, 0);
if (FAILED(hresult)) wprintf(L"var fail\n");
//get method
IWbemClassObject* pInParamsDefinition = NULL;
hresult = pObj->GetMethod(MethodName,0,&pInParamsDefinition, NULL);
if (FAILED(hresult))
{
wprintf(L"Method Fail\n");
pSvc->Release();
CoUninitialize();
return hresult;
}
wprintf(L"Method Succes\n");
//메소드 인스턴스화
IWbemClassObject *pInMethodInst = 0;
hresult = pInParamsDefinition->SpawnInstance(0, &pInMethodInst);
if (FAILED(hresult))
{
wprintf(L"Method inst FAILED\n");
}
//실질적인 매개변수 넘기는 곳
VARIANT v_FileSystem,v_QuickFormat;
VariantInit(&v_FileSystem);
v_FileSystem.vt = VT_BSTR;
v_FileSystem.bstrVal = L"NTFS";
hresult = pInMethodInst->Put(L"FileSystem",0,&v_FileSystem, 0);
if (FAILED(hresult)) wprintf(L"var fail\n");
VariantInit(&v_QuickFormat);
v_QuickFormat.vt = VT_BOOL;
v_QuickFormat.boolVal = VARIANT_TRUE;
hresult = pInMethodInst->Put(L"QuickFormat", 0, &v_QuickFormat,0);
if (FAILED(hresult)) wprintf(L"var fail\n");
//pOutParams 로 메소드의 리턴값 가져올수있음 get
IWbemClassObject *pOutParams = NULL;
hresult = pSvc->ExecMethod(ClassName,MethodName,0,NULL,pInMethodInst,&pOutParams,NULL);
if (FAILED(hresult))
{
switch (hresult)
{
case WBEM_E_FAILED:
wprintf(L"FAILED\n");
break;
case WBEM_E_INVALID_CLASS:
wprintf(L"class no\n");
break;
case WBEM_E_INVALID_PARAMETER:
wprintf(L"WBEM_E_INVALID_PARAMETER\n");
break;
case WBEM_E_METHOD_DISABLED:
wprintf(L"WBEM_E_METHOD_DISABLED\n");
break;
case WBEM_E_METHOD_NOT_IMPLEMENTED:
wprintf(L"WBEM_E_METHOD_NOT_IMPLEMENTED\n");
break;
case WBEM_E_NOT_FOUND:
wprintf(L"WBEM_E_NOT_FOUND\n");
break;
case WBEM_E_PROVIDER_NOT_CAPABLE:
wprintf(L"WBEM_E_PROVIDER_NOT_CAPABLE\n");
break;
case WBEM_E_OUT_OF_MEMORY:
wprintf(L"WBEM_E_OUT_OF_MEMORY\n");
break;
case WBEM_E_SHUTTING_DOWN:
wprintf(L"WBEM_E_SHUTTING_DOWN\n");
break;
case WBEM_E_TRANSPORT_FAILURE:
wprintf(L"WBEM_E_TRANSPORT_FAILURE\n");
break;
case WBEM_E_INVALID_METHOD:
wprintf(L"WBEM_E_INVALID_METHOD\n");
break;
case WBEM_E_ACCESS_DENIED:
wprintf(L"WBEM_E_ACCESS_DENIED\n");
break;
case WBEM_E_INVALID_METHOD_PARAMETERS:
wprintf(L"WBEM_E_INVALID_METHOD_PARAMETERS\n");
break;
case WBEM_S_NO_ERROR:
wprintf(L"WBEM_S_NO_ERROR\n");
break;
default:
break;
}
wprintf(L"Exec Fail\n");
pSvc->Release();
CoUninitialize();
return hresult;
}
CoUninitialize(); //com 해제
return 0;
}Forums:


댓글 달기