文章目录
- 背景
- 涉及框架及库
- WMI查询小工具
- 参数解释
- U盘
- 移动硬盘
- 本机设备
- 总结
背景
因为需求需要涉及获取硬盘的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