wmi에서 가져온 메소드 실행 함수 실행시 나오는 반환값에 대하여 질문드립니다. Execmethod

ehaakdl의 이미지

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_DO​​WN\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_DO​​WN\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;
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.