Win32_EncryptableVolume class 的 ProtectKeyWithTPM 方法导致异常
ProtectKeyWithTPM method of the Win32_EncryptableVolume class causes exception
我想尝试使用 Win32_EncryptableVolume class. Before I use this method, I have to create a key to protect this volume and for this I have several options, but if I want to encrypt the logical disk volume containing the OS's installation I have to use the ProtectKeyWithTPM 方法的加密方法加密包含 OS 安装的逻辑磁盘卷。
问题发生在我尝试调用 ProtectKeyWithTPM
方法时,它 returns 对我来说是以下堆栈跟踪:
System.Runtime.InteropServices.COMException (0x800706BE)
em System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
em System.Management.ManagementObject.InvokeMethod(String methodName, ManagementBaseObject inParameters, InvokeMethodOptions options)
em ListDrivers.BitLocker.callMethod(String method, ManagementObject privateLateBoundObject, ManagementBaseObject inParams) na C:\Users\admin\documents\visual studio 2015\Projects\BitlockerTeste\BitlockerTeste\BitLocker.cs:linha 221
em ListDrivers.BitLocker.defineTPM(String id, ArrayList drivers) na C:\Users\admin\documents\visual studio 2015\Projects\BitlockerTeste\BitlockerTeste\BitLocker.cs:linha 149
em ListDrivers.Program.<TPMProtection>d__8.MoveNext() na C:\Users\admin\documents\visual studio 2015\Projects\BitlockerTeste\BitlockerTeste\Program.cs:linha 275
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
em ListDrivers.Program.<encryptMenu>d__7.MoveNext() na C:\Users\admin\documents\visual studio 2015\Projects\BitlockerTeste\BitlockerTeste\Program.cs:linha 241
这个错误只发生在这个方法上,所有其他 Win32_EncryptableVolume
方法都正常工作,我在很多网站上搜索了解决这个问题的方法,但没有找到任何帮助。
我的问题是,为什么当我尝试使用 TPM 保护卷时会发生这种情况。为什么所有其他不使用 TPM 的保护方法都能正常工作。
编辑:
defineTPM
方法:
public static UInt32 defineTPM(string id, ArrayList drivers)
{
String deviceId = findByDriverLetter(id, drivers);
if (deviceId != null)
{
ManagementObject privateLateBoundObject = returnManagementObjectForDevice(deviceId);
ManagementBaseObject inParams = null;
return callMethod("ProtectKeyWithTPMandStartupKey", privateLateBoundObject, inParams);
}
return Convert.ToUInt32(2147942487);
}
callMethod
方法:
private static UInt32 callMethod(String method, ManagementObject privateLateBoundObject, ManagementBaseObject inParams)
{
ManagementBaseObject outParams = privateLateBoundObject.InvokeMethod(method, inParams, null);
return Convert.ToUInt32(outParams.Properties["ReturnValue"].Value);
}
如您问题的评论所述,您 必须 显式声明 inParams
,即使您没有传递任何值。
ManagementBaseObject inParams;
inParams = PrivateLateBoundObject.GetMethodParameters("ProtectKeyWithTPM");
有关 Win32_EncryptableVolume
class 的完整映射,请查看 https://github.com/Internet2/incert/blob/baf2ab60299df1dcd93192da7600342dda2497ad/Windows/Engine/NativeCode/Wmi/EncryptableVolume.cs
我想尝试使用 Win32_EncryptableVolume class. Before I use this method, I have to create a key to protect this volume and for this I have several options, but if I want to encrypt the logical disk volume containing the OS's installation I have to use the ProtectKeyWithTPM 方法的加密方法加密包含 OS 安装的逻辑磁盘卷。
问题发生在我尝试调用 ProtectKeyWithTPM
方法时,它 returns 对我来说是以下堆栈跟踪:
System.Runtime.InteropServices.COMException (0x800706BE)
em System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
em System.Management.ManagementObject.InvokeMethod(String methodName, ManagementBaseObject inParameters, InvokeMethodOptions options)
em ListDrivers.BitLocker.callMethod(String method, ManagementObject privateLateBoundObject, ManagementBaseObject inParams) na C:\Users\admin\documents\visual studio 2015\Projects\BitlockerTeste\BitlockerTeste\BitLocker.cs:linha 221
em ListDrivers.BitLocker.defineTPM(String id, ArrayList drivers) na C:\Users\admin\documents\visual studio 2015\Projects\BitlockerTeste\BitlockerTeste\BitLocker.cs:linha 149
em ListDrivers.Program.<TPMProtection>d__8.MoveNext() na C:\Users\admin\documents\visual studio 2015\Projects\BitlockerTeste\BitlockerTeste\Program.cs:linha 275
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
em ListDrivers.Program.<encryptMenu>d__7.MoveNext() na C:\Users\admin\documents\visual studio 2015\Projects\BitlockerTeste\BitlockerTeste\Program.cs:linha 241
这个错误只发生在这个方法上,所有其他 Win32_EncryptableVolume
方法都正常工作,我在很多网站上搜索了解决这个问题的方法,但没有找到任何帮助。
我的问题是,为什么当我尝试使用 TPM 保护卷时会发生这种情况。为什么所有其他不使用 TPM 的保护方法都能正常工作。
编辑:
defineTPM
方法:
public static UInt32 defineTPM(string id, ArrayList drivers)
{
String deviceId = findByDriverLetter(id, drivers);
if (deviceId != null)
{
ManagementObject privateLateBoundObject = returnManagementObjectForDevice(deviceId);
ManagementBaseObject inParams = null;
return callMethod("ProtectKeyWithTPMandStartupKey", privateLateBoundObject, inParams);
}
return Convert.ToUInt32(2147942487);
}
callMethod
方法:
private static UInt32 callMethod(String method, ManagementObject privateLateBoundObject, ManagementBaseObject inParams)
{
ManagementBaseObject outParams = privateLateBoundObject.InvokeMethod(method, inParams, null);
return Convert.ToUInt32(outParams.Properties["ReturnValue"].Value);
}
如您问题的评论所述,您 必须 显式声明 inParams
,即使您没有传递任何值。
ManagementBaseObject inParams;
inParams = PrivateLateBoundObject.GetMethodParameters("ProtectKeyWithTPM");
有关 Win32_EncryptableVolume
class 的完整映射,请查看 https://github.com/Internet2/incert/blob/baf2ab60299df1dcd93192da7600342dda2497ad/Windows/Engine/NativeCode/Wmi/EncryptableVolume.cs