如何用WMI获取硬盘ID?

ssdjmcj8048 2004-02-26 12:13:39
如何用WMI获取硬盘ID?好像用Win32_DiskDrive类是不行,csdn的一篇文章中讲到用这个类的Model属性,但Model不是diskID,而是型号,那位大侠知?
...全文
349 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluesx 2004-07-11
  • 打赏
  • 举报
回复
mark
Bob 2004-03-16
  • 打赏
  • 举报
回复
楼主,我介绍你一个好东西吧:
Management (WMI) Extensions for Visual Studio .NET 2003 Server Explorer
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=62d91a63-1253-4ea6-8599-68fb3ef77de1

安装后在VS.NET的“服务器资源管理器”里面多了两个东西,“管理类”和“管理事件”,通过它你可以很快的生成你要的WMI功能,比如关机功能。

步骤如下:
1,展开“管理类”,右击“操作系统”,然后选择“生成管理的类”,就可以得到所有有关操作系统的WMI功能了。你要的关机功能在:OperatingSystem.Win32Shutdown
xujialong 2004-03-15
  • 打赏
  • 举报
回复
各位高手:
我想当你们到这种地步的时候头已经大了吧!!!
呵呵,我给你们说个好的方法,也有助你们学习,最新我校用个这软件开发出几个管理软件来供大家参观。
IT高手网站 ——www.topit.tk
豫信软件公司网站——www.zzyxsoft.com
学校网站——www.haetc.com
可以去论坛发贴或者发E-mail:
topIT@126.com
bashiba 2004-03-15
  • 打赏
  • 举报
回复
using System.Text;

private System.ComponentModel.Container components = null;
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
internal struct IDSECTOR
{
public ushort wGenConfig;
public ushort wNumCyls;
public ushort wReserved;
public ushort wNumHeads;
public ushort wBytesPerTrack;
public ushort wBytesPerSector;
public ushort wSectorsPerTrack;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=3)]
public ushort [] wVendorUnique;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=20)]
public string sSerialNumber;
public ushort wBufferType;
public ushort wBufferSize;
public ushort wECCSize;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=8)]
public string sFirmwareRev;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=40)]
public string sModelNumber;
public ushort wMoreVendorUnique;
public ushort wDoubleWordIO;
public ushort wCapabilities;
public ushort wReserved1;
public ushort wPIOTiming;
public ushort wDMATiming;
public ushort wBS;
public ushort wNumCurrentCyls;
public ushort wNumCurrentHeads;
public ushort wNumCurrentSectorsPerTrack;
public uint ulCurrentSectorCapacity;
public ushort wMultSectorStuff;
public uint ulTotalAddressableSectors;
public ushort wSingleWordDMA;
public ushort wMultiWordDMA;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=128 )]
public byte [] bReserved;

}

[StructLayout(LayoutKind.Sequential)]
internal struct DRIVERSTATUS
{
public byte bDriverError;
public byte bIDEStatus;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=2 )]
public byte [] bReserved;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=2 )]
public uint [] dwReserved;
}

[StructLayout(LayoutKind.Sequential)]
internal struct SENDCMDOUTPARAMS
{
public uint cBufferSize;
public DRIVERSTATUS DriverStatus;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=513 )]
public byte [] bBuffer;
}

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
internal struct SRB_IO_CONTROL
{
public uint HeaderLength;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=8 )]
public string Signature;
public uint Timeout;
public uint ControlCode;
public uint ReturnCode;
public uint Length;
}

[StructLayout(LayoutKind.Sequential)]
internal struct IDEREGS
{
public byte bFeaturesReg;
public byte bSectorCountReg;
public byte bSectorNumberReg;
public byte bCylLowReg;
public byte bCylHighReg;
public byte bDriveHeadReg;
public byte bCommandReg;
public byte bReserved;
}

[StructLayout(LayoutKind.Sequential)]
internal struct SENDCMDINPARAMS
{
public uint cBufferSize;
public IDEREGS irDriveRegs;
public byte bDriveNumber;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )]
public byte [] bReserved;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=4 )]
public uint [] dwReserved;
public byte bBuffer;
}

[StructLayout(LayoutKind.Sequential)]
internal struct GETVERSIONOUTPARAMS
{
public byte bVersion;
public byte bRevision;
public byte bReserved;
public byte bIDEDeviceMap;
public uint fCapabilities;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=4 )]
public uint [] dwReserved; // For future use.
}

[DllImport("kernel32.dll")]
private static extern int CloseHandle(uint hObject);

[DllImport("kernel32.dll")]
private static extern int DeviceIoControl(uint hDevice,
uint dwIoControlCode,
ref SENDCMDINPARAMS lpInBuffer,
int nInBufferSize,
ref SENDCMDOUTPARAMS lpOutBuffer,
int nOutBufferSize,
ref uint lpbytesReturned,
int lpOverlapped);

[DllImport("kernel32.dll")]
private static extern int DeviceIoControl(uint hDevice,
uint dwIoControlCode,
int lpInBuffer,
int nInBufferSize,
ref GETVERSIONOUTPARAMS lpOutBuffer,
int nOutBufferSize,
ref uint lpbytesReturned,
int lpOverlapped);

[DllImport("kernel32.dll")]
private static extern uint CreateFile(string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
int lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
int hTemplateFile);

private const uint GENERIC_READ = 0x80000000;
private const uint GENERIC_WRITE = 0x40000000;
private const uint FILE_SHARE_READ = 0x00000001;
private const uint FILE_SHARE_WRITE = 0x00000002;
private const uint OPEN_EXISTING = 3;
private const uint INVALID_HANDLE_VALUE = 0xffffffff;
private const uint DFP_GET_VERSION = 0x00074080;
private const int IDE_ATAPI_IDENTIFY = 0xA1; // Returns ID sector for ATAPI.
private const int IDE_ATA_IDENTIFY = 0xEC; // Returns ID sector for ATA.
private const int IDENTIFY_BUFFER_SIZE = 512;

private const uint DFP_RECEIVE_DRIVE_DATA = 0x0007c088;
//获取硬盘ID
public static string Read(byte drive)
{
OperatingSystem os = Environment.OSVersion;
if (os.Platform != PlatformID.Win32NT) throw new NotSupportedException("仅支持WindowsNT/2000/XP");

//if (os.Version.Major < 5) throw new NotSupportedException("仅支持WindowsNT/2000/XP");

string driveName = "\\\\.\\PhysicalDrive" + drive.ToString();
uint device = CreateFile(driveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
0, OPEN_EXISTING, 0, 0);
if (device == INVALID_HANDLE_VALUE) return "";
GETVERSIONOUTPARAMS verPara = new GETVERSIONOUTPARAMS();
uint bytRv = 0;

if (0 != DeviceIoControl(device, DFP_GET_VERSION,
0, 0, ref verPara, Marshal.SizeOf(verPara),
ref bytRv, 0))
{
if (verPara.bIDEDeviceMap > 0)
{
byte bIDCmd = (byte)(((verPara.bIDEDeviceMap >> drive & 0x10) != 0) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY);
SENDCMDINPARAMS scip = new SENDCMDINPARAMS();
SENDCMDOUTPARAMS scop = new SENDCMDOUTPARAMS();

scip.cBufferSize = IDENTIFY_BUFFER_SIZE;
scip.irDriveRegs.bFeaturesReg = 0;
scip.irDriveRegs.bSectorCountReg = 1;
scip.irDriveRegs.bCylLowReg = 0;
scip.irDriveRegs.bCylHighReg = 0;
scip.irDriveRegs.bDriveHeadReg = (byte)(0xA0 | ((drive & 1) << 4));
scip.irDriveRegs.bCommandReg = bIDCmd;
scip.bDriveNumber = drive;

if (0 != DeviceIoControl(device, DFP_RECEIVE_DRIVE_DATA,
ref scip, Marshal.SizeOf(scip), ref scop,
Marshal.SizeOf(scop), ref bytRv, 0))
{
StringBuilder s = new StringBuilder();
for (int i = 20; i < 40; i += 2)
{
s.Append((char)(scop.bBuffer[i+1]));
s.Append((char)scop.bBuffer[i]);
}
CloseHandle(device);
return s.ToString().Trim();

}
}
}
CloseHandle(device);
return "";
}
marvelstack 2004-03-15
  • 打赏
  • 举报
回复
应该就是使用WMI。
huangsuipeng 2004-03-15
  • 打赏
  • 举报
回复
楼上们都讲了呢
turnmissile 2004-03-15
  • 打赏
  • 举报
回复
polarlm的可用,学习
polarlm 2004-03-15
  • 打赏
  • 举报
回复
利用WMI获取硬盘信息

Imports System.Management



Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim disk As ManagementBaseObject

Dim strResult As String

Dim diskClass = New ManagementClass("Win32_LogicalDisk")

Dim disks As ManagementObjectCollection

disks = diskClass.GetInstances()

For Each disk In disks

strResult = ""

strResult += "设备ID:" & disk("DeviceID") & vbCrLf

strResult += "磁盘名称:" & disk("Name") & vbCrLf

strResult += "磁盘卷标:" & disk("VolumeName") & vbCrLf

If disk("FileSystem") <> "" Then strResult += "文件系统:" & disk("FileSystem") & vbCrLf

strResult += "磁盘描述:" & disk("Description") & vbCrLf

If System.Convert.ToInt64(disk("Size")) > 0 Then

strResult += "磁盘大小:" & System.Convert.ToInt64(disk("Size").ToString()) & vbCrLf

strResult += "磁盘类型:" & System.Convert.ToInt16(disk("DriveType").ToString())

End If

MsgBox(strResult)

Next

End Sub
polarlm 2004-03-15
  • 打赏
  • 举报
回复
http://www.csdn.net/develop/Read_Article.asp?id=25438
polarlm 2004-03-15
  • 打赏
  • 举报
回复
http://www.csdn.net/develop/Read_Article.asp?Id=24025

获取硬盘大小
hertcloud 2004-03-15
  • 打赏
  • 举报
回复
http://www.pconline.com.cn/pcedu/empolder/net/0402/306662.html
chen99yjeyotech 2004-03-15
  • 打赏
  • 举报
回复
String HDid;
ManagementClass cimobject = new ManagementClass("Win32_DiskDrive");
ManagementObjectCollection moc = cimobject.GetInstances();
foreach(ManagementObject mo in moc)
{
HDid = (string)mo.Properties["Model"].value;
MessageBox.Show(HDid );
}
chen99yjeyotech 2004-03-15
  • 打赏
  • 举报
回复
这是获得硬盘的相关信息,你可以读取其中的属性
System.Management.ManagementObjectSearcher mdisk=new ManagementObjectSearcher("Select * From Win32_DiskDrive");
foreach(System.Management.ManagementObject mshare in mdisk.Get())
{
Response.Write(mshare.GetText(TextFormat.Mof));

}

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧