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:
댓글 달기