8

从各种线程中,我拼凑出如何以编程方式检查 BitLocker,如下所示:

private void TestBitLockerMenuItem_Click(object sender, RoutedEventArgs e) {
   var path=new ManagementPath(@"\ROOT\CIMV2\Security\MicrosoftVolumeEncryption")
               { ClassName="Win32_EncryptableVolume" };
   var scope=new ManagementScope(path);
   path.Server=Environment.MachineName;
   var objectSearcher=new ManagementClass(scope, path, new ObjectGetOptions());
   foreach (var item in objectSearcher.GetInstances()) {
      MessageBox.Show(item["DeviceID"].ToString()+" "+item["ProtectionStatus"].ToString());
   }
}

但它只有在进程具有管理员权限时才有效。

任何老 Windows 用户都可以转到资源管理器,右键单击驱动器,然后查看它是否已打开 BitLocker,这似乎很奇怪,但程序似乎无法完成此操作。有谁知道这样做的方法?

4

1 回答 1

11

Windows 通过使用 Win32 API 中的Windows 属性系统检查未记录的 shell 属性,在 shell 中显示这一点System.Volume.BitLockerProtection。您的程序还可以在没有海拔的情况下检查此属性。

如果此属性的值为 1、3 或 5,则在驱动器上启用 BitLocker。任何其他值都被视为关闭。

在寻找此问题的解决方案期间,我在HKEY_CLASSES_ROOT\Drive\shell\manage-bde\AppliesTo. 最终,这一发现将我引向了这个解决方案。

Windows 属性系统是一个低级 API,但您可以使用Windows API 代码包中提供的包装器。

包裹

Install-Package WindowsAPICodePack

使用

using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

代码

IShellProperty prop = ShellObject.FromParsingName("C:").Properties.GetProperty("System.Volume.BitLockerProtection");
int? bitLockerProtectionStatus = (prop as ShellProperty<int?>).Value;

if (bitLockerProtectionStatus.HasValue && (bitLockerProtectionStatus == 1 || bitLockerProtectionStatus == 3 || bitLockerProtectionStatus == 5))
   Console.WriteLine("ON");
else
   Console.WriteLine("OFF");
于 2016-12-24T03:42:14.457 回答