背景
因为需求需要涉及获取硬盘的SN参数,但是又不想要获取到U盘或移动硬盘设备的SN,所以就浅浅的研究了一下。
以下就是我目前发现的一些参数的作用,够我用了。。。
涉及框架及库
NuGet自己安装哈
System.Management
WMI查询小工具
为了方便我调试代码,这里花了几分钟麻了一个WMI查询结果输出的小公举
项目代码就不发了,就只有两个文件MainWindow.xaml.cs
和MainWindow.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 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> 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盘
InterfaceType
为USB
MediaType
为Removable Media
移动硬盘
InterfaceType
为SCSI
或其他MediaType
为External hard disk media
本机设备
InterfaceType
为SCSI
、IDE
或其他,具体怎么安装,走什么总线MediaType
为Fixed 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
以上就是C#使用WMI获取硬盘参数的实现方法的详细内容,更多关于C# WMI获取硬盘参数的资料请关注其它相关文章!