【问题标题】:Using ManagementObjectSearcher to get an exact BitLocker WMI value使用 ManagementObjectSearcher 获取准确的 BitLocker WMI 值
【发布时间】:2017-03-23 18:22:37
【问题描述】:

大家好, 我遇到了 ManagementObjectSearcher 的问题。我正在尝试查询我想要的确切值,但找不到对精确语法要求的任何引用,并且在尝试将代码完成为我需要的代码时,我不断收到错误消息。

出现问题的代码的特定部分是当我检查驱动器加密状态时(我知道我的磁盘在这台机器上没有加密,这就是为什么这是我唯一的值 if' d 目前)。在获取此代码以提取正确值方面的任何帮助将不胜感激。

我已经尝试了“=”方法和“LIKE”方法,但输出没有变化。

using Microsoft.Win32;
using System;
using System.Drawing;
using System.IO;
using System.Management;
using System.Windows.Forms;

    public Form1()
    {
        InitializeComponent();

        // Check for OS Version
        string OSVer = Convert.ToString(Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "ProductName", null));
        OSDialog.Text = OSVer;

        // Check Architecture
        if (Directory.Exists("C:\\Program Files (x86)"))
        {
            ArchitectureDialog.Text = "64 Bit";
        }
        else
        {
            ArchitectureDialog.Text = "32 Bit";
        }

        // Check Encryption
        ManagementObjectSearcher Collect = new ManagementObjectSearcher("SELECT ProtectionStatus FROM Win32_EncryptableVolume WHERE DriveLetter = 'C:'");

        string Encryption = Collect.ToString();

        if (Encryption == "0")
        {
            EncryptionDialog.Text = "Disk is not Encrypted";
            EncryptionDialog.ForeColor = Color.Green;
        }
    }

    private void Cancel_Click(object sender, EventArgs e)
    {
        Close();
    }

【问题讨论】:

  • 也许你应该检查你从Collect.ToString();得到的值
  • 您不应该在ManagementObjectSearcher 而不是ToString() 上拨打Get 吗? "Get ... 调用指定的 WMI 查询并返回结果集合。"
  • 不使用Collect.ToString(),由于它是“ManagementObject”,因此输出不会在 if 语句中起作用。我的想法是通过使用 SQLesque 语法来处理 WMI 对象,我应该直接从查询中提取我需要的值,但它需要转换为在 if 语句中工作。这只是我对此事的想法。甚至在转换之前添加几行 Get 也不会产生丰硕的结果。
  • 你是在使用调试器查看Collect.ToString();的结果吗?如果是这样,您会看到它返回 System.Management.ManagementObjectSearcher

标签: c# wmi bitlocker


【解决方案1】:

从 WMI 获取 BitLocker 信息需要提升权限。您的代码必须以管理员身份运行,并且您必须要求提升权限。所以,我不使用 ManagementObjectSearcher 来获取 BitLocker 信息。相反,我做了类似于以下的事情(根据您的场景进行了修改 - 但未进行测试,如图所示):

ManagementObject GetBitLockerManager( string driveLetter )
{
    var path = new ManagementPath( );
    path.Server = string.Empty;
    path.NamespacePath = @"\ROOT\CIMV2\Security\MicrosoftVolumeEncryption";
    path.ClassName = "Win32_EncryptableVolume";

    var options = new ConnectionOptions( );
    options.Impersonation = ImpersonationLevel.Impersonate;
    options.EnablePrivileges = true;
    options.Authentication = AuthenticationLevel.PacketPrivacy;

    var scope = new ManagementScope( path, options );
    var mgmt = new ManagementClass( scope, path, new ObjectGetOptions( ) );

    mgmt.Get( );
    return mgmt
      .GetInstances( )
      .Cast<ManagementObject>( )
      .FirstOrDefault
      ( vol => 
        string.Compare
        (
          vol[ "DriveLetter" ] as string, 
          driveLetter, 
          true
        ) == 0 
      );
}

【讨论】:

    【解决方案2】:

    好的,我想通了,感谢您提供的所有帮助。代码如下。

    ManagementObjectSearcher Encryption = new ManagementObjectSearcher(@"root\cimv2\Security\MicrosoftVolumeEncryption", "SELECT * FROM Win32_EncryptableVolume");
    
            foreach (ManagementObject QueryObj in Encryption.Get())
            {
                string EncryptionStatus = QueryObj.GetPropertyValue("ProtectionStatus").ToString();
    
                if (EncryptionStatus == "0")
                {
                    EncryptionDialog.Text = "Unencrypted";
                }
                else if (EncryptionStatus == "1")
                {
                    EncryptionDialog.Text = "Encrypted - SysPrep will not complete";
                }
                else if (EncryptionStatus == "2")
                {
                    EncryptionDialog.Text = "Cannot Determine Encryption";
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2011-06-12
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多