背景
因为需求需要涉及获取硬盘的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为usbmediatype为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获取硬盘参数的资料请关注代码网其它相关文章!
发表评论