磁盘去只读属性也是有两种方法,一种是diskpart工具的 ATTRIBUTES DISK CLEAR READONLY 命令,还有一种是执行WMI的带参数方法。
关于如何写C++ 调用diskpart工具和C++ WMI在前面两篇文章:C++实现磁盘联机 和 C++实现磁盘初始化中都提及到了。
直接附上代码:
1. diskpart方法:
核心代码只有一行:
ret = WriteFile(hChildStdinWr, "ATTRIBUTES DISK CLEAR READONLY",sizeof("ATTRIBUTES DISK CLEAR READONLY"), &dwWritten, NULL);
2. WMI方法
核心代码如下:
wchar_t msftDiskObjectID[256]; GetWMIMSFTDiskObjectId(msftDiskObjectID, index); CComPtr< IWbemClassObject > pClass = NULL; BSTR MethodName = SysAllocString(L"SetAttributes"); BSTR ClassName = SysAllocString(L"MSFT_Disk"); hr = service->GetObject(ClassName, 0, NULL, &pClass, NULL); if (FAILED(hr)) { SysFreeString(ClassName); SysFreeString(MethodName); return -1; } CComPtr< IWbemClassObject > pInParams = NULL; hr = pClass->GetMethod(MethodName, 0, &pInParams, NULL); if (FAILED(hr)) { SysFreeString(ClassName); SysFreeString(MethodName); return -1; } CComPtr< IWbemClassObject > pClassInstance = NULL; hr = pInParams->SpawnInstance(0, &pClassInstance); if (FAILED(hr)) { SysFreeString(ClassName); SysFreeString(MethodName); return -1; } VARIANT varCommand; varCommand.vt = VT_BOOL; varCommand.ulVal = FALSE; hr = pClassInstance->Put(L"IsReadOnly", 0, &varCommand, 0); if (FAILED(hr)) { SysFreeString(ClassName); SysFreeString(MethodName); return -1; } CComPtr< IWbemClassObject > pOutParams = NULL; hr = service->ExecMethod(msftDiskObjectID, MethodName, 0, NULL, pClassInstance, &pOutParams, NULL); if (FAILED(hr)) { SysFreeString(ClassName); SysFreeString(MethodName); return -1; } SysFreeString(ClassName); SysFreeString(MethodName); return 0;