发现WMI查询错误转义

问题描述 投票:0回答:3

我在某个地方对 wmi 查询进行了错误的转义,有人可以帮助修复它吗?因为它显示无效查询

string deviceid = "Disk #0, Partition #0";
        string antecedent = @"\\" + Environment.MachineName + "\\root\\cimv2:Win32_DiskPartition.DeviceID=\"" + deviceid + "\"";
        ManagementObjectSearcher assosiaciation_query2 = new ManagementObjectSearcher("select Dependent from Win32_LogicalDiskToPartition where Antecedent = \"" + antecedent + "\"");
        foreach (ManagementObject assosiaciation_query_data2 in assosiaciation_query2.Get())
        {
            Console.WriteLine("Dependent: " + assosiaciation_query_data2["Dependent"]);
        }

谢谢你。

c# wmi-query
3个回答
0
投票

好吧,因为在mysql中你可以使用LIKE来查找类似的表,我也读到这是可能的https://msdn.microsoft.com/en-us/library/aa392263%28v=vs.85%29.aspx?f =255&MSPPError=-2147217396在wmi查询中使用LIKE

string deviceid = "Disk #0, Partition #0"; ManagementObjectSearcher assosiaciation_query2 = new ManagementObjectSearcher("select Dependent from Win32_LogicalDiskToPartition where Antecedent LIKE '%" + deviceid + "%'");

所以仍然显示查询无效


0
投票

您将 2 个双引号放入另外 2 个双引号中,这破坏了您的代码。您应该在先行字符串中使用 WMI 转义代码:

string antecedent = @"\\" + Environment.MachineName + "\\root\\cimv2:Win32_DiskPartition.DeviceID=\\\"" + deviceid + "\\\"";

当 WMI 收到命令时,应该是这样的:

\“您的设备ID\”

插入 2 个顶点应该可以正常工作:) 示例:

Mycommand"myOtherCommand\"myvalue\""

编辑: 我完全误解了你的目标,抱歉,你的查询中有一个错误,因为“#”是 MySQL 通配符,它会扰乱你的查询(是 MySql 内联注释), 不,即使我使用像'aaa'这样的where Ascendent,它也不起作用,我不知道为什么你的where条件搞乱了代码:/.

如果您使用以下代码,它就可以工作:

    string query = "select * from Win32_LogicalDiskToPartition";
    string antecedent = @"\\" + Environment.MachineName + "\\root\\cimv2:Win32_DiskPartition.DeviceID=\"" + deviceid + "\"";
        ManagementObjectSearcher moSearch = new ManagementObjectSearcher(query);
        ManagementObjectCollection moCollection = moSearch.Get();

        foreach (ManagementObject mo in moCollection)
        {
            if (string.Equals(mo["Antecedent"].ToString(), antecedent))
                Console.WriteLine("Dependent: " + mo["Dependent"]);
        }

0
投票
    public static string Mtd_GetDriveLetterWithLabel(string DriveLabel)
    {
        ManagementObjectSearcher DriveLabelQuery = new ManagementObjectSearcher(" SELECT * FROM Win32_Volume WHERE Label = '" + DriveLabel + "' ");

        string DriveLetter = "";
        foreach (ManagementObject DriveLabels in DriveLabelQuery.Get())
        {
            DriveLetter = DriveLabels["DriveLetter"].ToString();
        }
        return DriveLetter;
    }




   public static int Mtd_GetDiskNumberWithLetter(string DriveLetter)
    {
        ManagementObjectSearcher DriveLetterGeneralQuery = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition");
        ManagementObjectCollection DriveLetterCollection = DriveLetterGeneralQuery.Get();

        string Dependent = @"\\" + Environment.MachineName + "\\root\\cimv2:Win32_LogicalDisk.DeviceID=\"" + DriveLetter + "\"";
        String DiskNumberTxt = "";
        foreach (ManagementObject DiskNumbers in DriveLetterCollection)
        {
            if ((DiskNumbers["Dependent"].ToString()) == Dependent)
            {
                DiskNumberTxt = DiskNumbers["Antecedent"].ToString();
            }
        }

        int From = DiskNumberTxt.IndexOf("Disk #") + "Disk #".Length;
        int To = DiskNumberTxt.IndexOf(",");
        String DiskNumberTrim = DiskNumberTxt.Substring(From, To - From);

        int DiskNumber = Int32.Parse(DiskNumberTrim);
        return DiskNumber;
    }




  public static string Mtd_GetSerialNumberWithDiskNumber(int DiskNumber)
    {
        ManagementObjectSearcher SerialNumberQuery = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
        ManagementObjectCollection SerialNumberCollection = SerialNumberQuery.Get();

        string Tag = @"\\.\PHYSICALDRIVE" + DiskNumber;
        String SerialNumberTxt = "";

        foreach (ManagementObject SerialNumbers in SerialNumberCollection)
        {
            if ((SerialNumbers["Tag"].ToString()) == Tag)
            {
                SerialNumberTxt = SerialNumbers["SerialNumber"].ToString();
            }
        }
        return SerialNumberTxt;
    }

使用------------------------------------------------ --------------------

字符串 DriveLabel = "DATA";

字符串 DriveLetter = Mtd_GetDriveLetterWithLabel(DriveLabel); Console.WriteLine(DriveLetter);

int DiskNumber = Mtd_GetDiskNumberWithLetter(DriveLetter); Console.WriteLine(磁盘编号);

string DiskSerialNumber = Mtd_GetSerialNumberWithDiskNumber(DiskNumber); Console.WriteLine(磁盘序列号);

© www.soinside.com 2019 - 2024. All rights reserved.