后台:我为我们单位的帮助台创建了一个应用程序,用于抓取资产数据库的计算机信息。最近有人做库存说用户连接了USB外置硬盘,我的应用程序将其包含在整个硬盘空间中。
如何在忽略外部/ USB设备的情况下使用Win32 ManagementObjects获取总硬盘大小?
我愿意使用其他Win32ManagementObjects
项,例如Win32_PhysicalMedia
,Win32_LogicalDisk
或Win32_DiskPartition
,但是:
这就是我所拥有的:
long totalSize = 0;
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32ManagementObjects.Win32_DiskDrive");
// there may be multiple hard drives, so loop through them all
foreach (ManagementObject mo in searcher.Get())
{
/*
* I assume this is where the problem is. I check that the drive type
* includes "FIXED HARD DISK" (see reference link below)
*/
mediaType = mo.Properties["MediaType"].Value.ToString().ToUpper();
if (mediaType.IndexOf("FIXED HARD DISK") >= 0)
{
totalSize += Convert.ToInt64(mo.Properties["Size"].Value.ToString());
}
}
这个特定的USB驱动器是否只是向操作系统报告错误信息?那可能吗?由于用户的计算机不在现场,我基本上不可能进行调试。
参考:https://msdn.microsoft.com/en-us/library/aa394132(v=vs.85).aspx
答案 0 :(得分:2)
我可以获得固定磁盘的总数,不包括使用此代码通过USB连接的磁盘
long totalSize = 0;
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
// there may be multiple hard drives, so loop through them all
foreach (ManagementObject mo in searcher.Get())
{
if (mo.Properties["InterfaceType"].Value.ToString() != "USB")
{
totalSize += Convert.ToInt64(mo.Properties["Size"].Value.ToString());
}
}
尝试代码我在读取属性MediaType.ToString()的值时收到了NullReferenceException,因此,我认为并不总是设置此属性。在检查“FIXED HARD DISK”之前,您可能会尝试在NullReference中添加string.IsNullOrEmpty
,但我不确定此属性在固定磁盘上永远不会为空。
顺便说一句,使用Win32ManagementObjects.Win32_DiskDrive
给我一个ManagementException InvalidQuery
我必须删除Win32ManagementObjects
字符串,只留下Win32_DiskDrive
答案 1 :(得分:-2)
您可以使用经典的Win32函数GetDriveType()
并检查DRIVE_REMOVABLE
和DRIVE_FIXED
。