• C#实现WMI获取硬盘参数


    背景

    因为需求需要涉及获取硬盘的SN参数,但是又不想要获取到U盘或移动硬盘设备的SN,所以就浅浅的研究了一下。
    以下就是我目前发现的一些参数的作用,够我用了。。。

    涉及框架及库

    NuGet自己安装哈

    • System.Management

    WMI查询小工具

    为了方便我调试代码,这里花了几分钟麻了一个WMI查询结果输出的小公举
    项目代码就不发了,就只有两个文件MainWindow.xaml.csMainWindow.xaml,从如此LOW的界面也能看出来,没有其它代码了😐

    前端代码:

    <Window x:Class="WMIQuery.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WMIQuery"
            mc:Ignorable="d" WindowStartupLocation="CenterScreen"
            Title="WMIQuery" Height="450" Width="800">
        <Grid Margin="5 5 5 5">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto">RowDefinition>
                <RowDefinition Height="Auto">RowDefinition>
                <RowDefinition Height="Auto">RowDefinition>
                <RowDefinition Height="Auto">RowDefinition>
                <RowDefinition Height="*">RowDefinition>
                <RowDefinition Height="Auto">RowDefinition>
                <RowDefinition Height="Auto">RowDefinition>
            Grid.RowDefinitions>
            <TextBlock Grid.Row="0" Text="Query:">TextBlock>
            <TextBox Grid.Row="1" x:Name="txt_query" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" Height="60">TextBox>
            <StackPanel Grid.Row="2" Margin="0 5 0 5" Orientation="Horizontal">
                <Button Content="执行" x:Name="btn_start" Click="btn_start_Click">Button>
            StackPanel>
            <TextBlock Grid.Row="3" Text="Out:">TextBlock>
            <TextBox Grid.Row="4" x:Name="txt_out">TextBox>
        Grid>
    Window>
    

    后端代码:

    using System;
    using System.Text;
    using System.Windows;
    using System.Management;
    
    namespace WMIQuery
    {
        /// 
        /// MainWindow.xaml 的交互逻辑
        /// 
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void btn_start_Click(object sender, RoutedEventArgs e)
            {
                var query = txt_query.Text;
                if (string.IsNullOrEmpty(query) || string.IsNullOrWhiteSpace(query))
                {
                    MessageBox.Show("查询语句不能为空!", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
                var outBuilder = new StringBuilder();
                try
                {
                    var searcher = new ManagementObjectSearcher(query);
                    int i = 0;
                    foreach (var drive in searcher.Get())
                    {
                        outBuilder.AppendLine($"===>Index:{i++}<===");
                        foreach (var item in drive.Properties)
                        {
                            outBuilder.AppendLine(item.Name + ": " + item.Value);
                        }
                        outBuilder.AppendLine();
                    }
                    txt_out.Text = outBuilder.ToString();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }
    }
    

    在Query框填写我们的查询语句,点击执行
    在这里插入图片描述

    也可以只查询我们想要的数据,反正使用就像SQL一样简单
    在这里插入图片描述

    参数解释

    在这里插入图片描述

    在这里插入图片描述

    U盘

    • InterfaceTypeUSB
    • MediaTypeRemovable Media

    移动硬盘

    • InterfaceTypeSCSI或其他
    • MediaTypeExternal hard disk media

    本机设备

    • InterfaceTypeSCSIIDE或其他,具体怎么安装,走什么总线
    • MediaTypeFixed hard disk media

    总结

    • 移动固态硬盘走的是SCSI也就是NVMe的总线,或者是IDE,也就是传统的走线
    • 本地如果是NVMe的硬盘,走的应该也是SCSI总线,如果是普通SATA接口的,应该是IDE

    不是所有的M.2硬盘都是NVMe协议

    在这里插入图片描述

    • InterfaceType的值,主要是看设备走什么总线去判断的
    • 如果只是需要判断移动设备还是本机设备,直接在MediaType判断就行,比如获取本机固定的硬盘,不想包含U盘或移动硬盘,只需要添加执行下面的语句:
    SELECT * FROM Win32_DiskDrive WHERE MediaType = 'Fixed hard disk media'
    
    • 和SQL还是有区别的,语句后面不能有分号,字段不能用AS映射成有好名称,能用LIKE

    在这里插入图片描述

  • 相关阅读:
    nodejs出现 require is not defined in ES module scope, you can use import instead
    《北京市住房租赁条例》
    磁钢的居里温度和工作温度
    PHP基于thinkphp的旅游见闻管理系统#毕业设计
    保研计网复习笔记:数据链路层
    还在担心漏测吗?快来使用jacoco统计下代码覆盖率
    SpringBoot 根据不同环境切换不同文件路径
    辞掉一个月3700的工资,自学python靠谱吗?
    Redis笔记 Redis主从同步
    【机器学习】梯度下降算法原理和实现
  • 原文地址:https://blog.csdn.net/weixin_44448313/article/details/139630387