如何使用WMI格式化磁盘卷 [英] how do I use WMI to format a disk volume

查看:89
本文介绍了如何使用WMI格式化磁盘卷的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我使用的代码,但总是失败,错误0x8004101e(wbemErrIllegalOperation引用 WbemErrorEnum(Windows) [ ^ ])致电

the following is the code I used, but alway failed with error 0x8004101e(wbemErrIllegalOperation reference here WbemErrorEnum (Windows)[^]) when call

hr = pclsObj->GetMethod(bstrMethod, 0, &pInParamsDefinition, &pOutParamsDefinition);





,我真的不知道为什么,任何建议都表示赞赏。提前谢谢。





,I really don't know why, any suggestions is appreciated. thanks in advance.

	HRESULT WMI_FormatVolume(BYTE volumeLetter, eFileSystem fs, const WCHAR* szLabel, bool bQuickFormat, UINT clusterSize, bool bEnableCompression)
	{
		HRESULT hr = S_OK;

		hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED ); 
		if( FAILED(hr) )
			return hr;

		IWbemLocator *pLocator = NULL;
		IWbemServices *pSvc = NULL;
		do 
		{
			hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
			if( !SUCCEEDED(hr) )
				break;

			hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID*>(&pLocator)); 
			if( !SUCCEEDED(hr) )
				break;

			hr = pLocator->ConnectServer(_bstr_t( L"ROOT\\CIMV2" ), NULL, NULL, NULL, 0, NULL, NULL, &pSvc);    
			if( !SUCCEEDED(hr) )
				break;

			hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
			if( !SUCCEEDED(hr) )
				break;

			_bstr_t bstrMethod(L"Format");
			_bstr_t bstrClassName(L"Win32_Volume");

// 			IWbemClassObject* pClass = NULL;
// 			hr = pSvc->GetObject(bstrClassName, 0, NULL, &pClass, NULL);
// 			if( !SUCCEEDED(hr) )
// 				break;
// 			
// 			IWbemClassObject* pInParamsDefinition = NULL;
// 			hr = pClass->GetMethod(bstrMethod, 0, &pInParamsDefinition, NULL);
// 			if( !SUCCEEDED(hr) )
// 				break;
// 
// 			IWbemClassObject* pClassInstance = NULL;
// 			hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
// 			if( !SUCCEEDED(hr) )
// 				break;

			// execute QWL to query volume info
			IEnumWbemClassObject* pEnumerator = NULL;
			WCHAR szWQL[128] = L""; swprintf_s(szWQL, L"SELECT * FROM Win32_Volume WHERE DriveLetter = '%c:'", volumeLetter);
			hr = pSvc->ExecQuery(_bstr_t(L"WQL"), _bstr_t(szWQL), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
			if( !SUCCEEDED(hr) )
				break;

			while ( pEnumerator )
			{
				ULONG uReturn = 0;
				IWbemClassObject *pclsObj = NULL;
				hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
				if( !SUCCEEDED(hr) )
					break;

				IWbemClassObject* pInParamsDefinition = NULL;
				IWbemClassObject* pOutParamsDefinition = NULL;
				hr = pclsObj->GetMethod(bstrMethod, 0, &pInParamsDefinition, &pOutParamsDefinition);
				if( !SUCCEEDED(hr) )
					break;

				IWbemClassObject* pClassInstance = NULL;
				hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
				if( !SUCCEEDED(hr) )
					break;

				_variant_t varFileSystem(GetFileSystemStr(fs));
				_variant_t varQuickFormat(bQuickFormat);
				_variant_t varClusterSize(clusterSize);
				_variant_t varLabel(szLabel);
				_variant_t varEnableCompression(bEnableCompression);
				hr = pClassInstance->Put(L"FileSystem", 0,	&varFileSystem, 0);
				hr = pClassInstance->Put(L"QuickFormat", 0, &varQuickFormat, 0);
				hr = pClassInstance->Put(L"ClusterSize", 0,	&varClusterSize, 0);
				hr = pClassInstance->Put(L"Label", 0, &varLabel, 0);
				hr = pClassInstance->Put(L"EnableCompression", 0, &varEnableCompression, 0);

				IWbemClassObject* pOutParams = NULL;
				hr = pSvc->ExecMethod(bstrClassName, bstrMethod, 0, NULL, pClassInstance, &pOutParams, NULL);
				if( !SUCCEEDED(hr) )
					break;
			}

		} while ( 0 );

		if ( NULL != pLocator )
			pLocator->Release();

		if ( NULL != pSvc )
			pSvc->Release();

		CoUninitialize();

		return hr;
	}

推荐答案

这里是调用Format使用WMI的正确方法。参考网站如下。

如何通过C ++格式化Windows中的RAW磁盘wreckor [ ^ ]

blog.aaronballman.com/2011/07/calling-instance-methods-in-wmi /#comment-48687



here is the right way to call Format use WMI. reference websites are as follow.
How to format a RAW disk in windows by C++ | wreckor[^]
blog.aaronballman.com/2011/07/calling-instance-methods-in-wmi/#comment-48687

namespace Utility
{
	const WCHAR* GetFileSystemStr(eFileSystem fs)
	{
		switch ( fs )
		{
		case FS_FAT32:
			return L"FAT32";
		case FS_FAT:
			return L"FAT";
		case FS_NTFS:
		default:
			return L"NTFS";
		}
	}

	HRESULT WMI_FormatVolume(BYTE volumeLetter, const TCHAR* szLabel, int* pErrorCode, eFileSystem fs, bool bQuickFormat, LONG clusterSize, bool bEnableCompression)
	{
		HRESULT hr = S_OK;

		hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 
		if( S_OK != hr )
			return hr;

		IWbemLocator *pLocator = NULL;
		IWbemServices *pService = NULL;
		IWbemClassObject* pClass = NULL;
		IWbemClassObject* pInParamsDefinition = NULL;
		IWbemClassObject* pClassInstance = NULL;
		IEnumWbemClassObject* pEnumerator = NULL;
		
		do
		{
			hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
			if( S_OK != hr )
				break;

			hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<lpvoid*>(&pLocator)); 
			if( S_OK != hr )
				break;

			hr = pLocator->ConnectServer(_bstr_t( L"ROOT\\CIMV2" ), NULL, NULL, NULL, 0, NULL, NULL, &pService);    
			if( S_OK != hr )
				break;

			hr = CoSetProxyBlanket(pService, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
			if( S_OK != hr )
				break;

			_bstr_t bstrMethod(L"Format");
			_bstr_t bstrClassName(L"Win32_Volume");

                        // get class and method here
			hr = pService->GetObject(bstrClassName, 0, NULL, &pClass, NULL);
			if( S_OK != hr )
				break;
			
			hr = pClass->GetMethod(bstrMethod, 0, &pInParamsDefinition, NULL);
			if( S_OK != hr )
				break;

			hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
			if( S_OK != hr )
				break;

			// execute QWL to query volume info
			WCHAR szWQL[128] = L""; swprintf_s(szWQL, L"SELECT * FROM Win32_Volume WHERE DriveLetter = '%c:'", volumeLetter);
			hr = pService->ExecQuery(_bstr_t(L"WQL"), _bstr_t(szWQL), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
			if( S_OK != hr )
				break;

			while ( pEnumerator )
			{
				ULONG uReturn = 0;
				IWbemClassObject* pVolumeObj = NULL;
				hr = pEnumerator->Next(WBEM_INFINITE, 1, &pVolumeObj, &uReturn);
				if ( 0 == uReturn )
					break;

				// set format param
				_variant_t varFileSystem(GetFileSystemStr(fs));
				_variant_t varQuickFormat(bQuickFormat);
				_variant_t varClusterSize(clusterSize);
				_variant_t varLabel(szLabel);
				_variant_t varEnableCompression(bEnableCompression);
				hr = pClassInstance->Put(L"FileSystem", 0,	&varFileSystem, 0);
				hr = pClassInstance->Put(L"QuickFormat", 0, &varQuickFormat, 0);
				hr = pClassInstance->Put(L"ClusterSize", 0,	&varClusterSize, 0);
				hr = pClassInstance->Put(L"Label", 0, &varLabel, 0);
				hr = pClassInstance->Put(L"EnableCompression", 0, &varEnableCompression, 0);

				// key!!! get class object 
				_variant_t var;
				hr = pVolumeObj->Get(L"__PATH", 0, &var, NULL, NULL);
				pVolumeObj->Release();

				if( S_OK != hr )
					break;

				IWbemClassObject* pOutParams = NULL;
				hr = pService->ExecMethod(var.bstrVal, bstrMethod, 0, NULL, pClassInstance, &pOutParams, NULL);
				if( S_OK != hr )
					break;

				_variant_t varReturnValue;
				pOutParams->Get(L"ReturnValue", 0, &varReturnValue, NULL, 0);
				pOutParams->Release();

				int formatResult = varReturnValue.intVal;
				if ( 0 != formatResult )
					hr = S_FALSE;

				if ( NULL != pErrorCode )
					*pErrorCode = formatResult;
			}

		} while( 0 );

		if ( NULL != pLocator )
			pLocator->Release();

		if ( NULL != pService )
			pService->Release();

		if ( NULL != pClass )
			pClass->Release();

		if ( NULL != pInParamsDefinition )
			pInParamsDefinition->Release();

		if ( NULL != pClassInstance )
			pClassInstance->Release();

		if ( NULL != pEnumerator )
			pEnumerator->Release();

		CoUninitialize();

		return hr;
	}

}


这篇关于如何使用WMI格式化磁盘卷的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆