Tôi có một số mã để tìm nạp số sêri ổ cứng từ WMI.Số sê-ri WMI HDD Transposed
SelectQuery selectQuery = new SelectQuery("Win32_PhysicalMedia");
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(selectQuery);
foreach (ManagementObject wmi_PM in searcher.Get())
{
string str = wmi_PM["SerialNumber"];
}
Lúc đầu, tôi nghĩ rằng nó đang hoạt động và truy xuất đúng số sê-ri. Sau khi cố gắng sử dụng nó với một so sánh mặc dù, tôi phát hiện ra số lượng các báo cáo WMI là không chính xác chính xác. Số sê-ri WMI được đệm với một loạt các khoảng trống cũng như các ký tự được chuyển đổi.
Các ổ đĩa thực tế số serial in trên nhãn dán và trả về bởi một số công cụ (có thể sử dụng DeviceIoControl) là "3RH8B1BG", WMI tuy nhiên trả về " R38H1BGB" .
Bất Serial #: 3RH8B1BG
WMI Serial #: R38H1BGB
Một số công cụ như SiSoftware Sandra, trở về con số này đệm và hoán, số serial không thực tế của nó mặc dù. Giá trị WMI là số sê-ri nếu bạn chuyển đổi mọi vị trí khác. Điều này có bình thường không? Tôi có nên viết mã để chuyển nó đến đúng giá trị không?
Tôi cố gắng tránh sử dụng WMI nhưng có vẻ như bất kỳ tìm kiếm nào về cách thực hiện điều gì đó trên mạng hiện nay đều mang lại các ví dụ WMI.
Số sê-ri giá trị WMI cho 2 ổ cứng khác nhau của các nhà sản xuất khác nhau đều được chuyển đổi sao cho nó không phải là một đĩa đơn.
Cập nhật: tìm thấy một số mã sử dụng DeviceIoControl
http://addressof.com/blog/archive/2004/02/14/392.aspx
Đáng ngạc nhiên, DeviceIoControl trả về một số sê-ri hoán là tốt. Trong mã bằng cách CorySmith trên nó có một SwapChars hoạt
Private Shared Function SwapChars(ByVal chars() As Char) As String
For i As Integer = 0 To chars.Length - 2 Step 2
chars.Reverse(chars, i, 2)
Next
Return New String(chars).Trim
End Function
Các mã C++ ông đề cập đến có lật tới:
// function to decode the serial numbers of IDE hard drives
// using the IOCTL_STORAGE_QUERY_PROPERTY command
char * flipAndCodeBytes (const char * str,
int pos,
int flip,
char * buf)
{
...
}
đoán đó là tiêu chuẩn cho DeviceIoControl và WMI, không thể tin bất kỳ khác giải pháp hoặc ví dụ tôi chạy qua không có điều này.
Ồ, có vẻ như bạn đang chạy trên [PDP-11] (http://en.wikipedia.org/wiki/Endianness#Middle-endian)! – sarnold
Thực ra anh ta đang chạy trên một máy tính có cùng thứ tự byte nhỏ như PDP-11. Vì vậy, tôi và nếu bạn đang chạy Windows (không phải Windows CE và không phải Windows Phone), bạn cũng vậy. Giải pháp làm việc duy nhất là gọi DeviceIoControl và tự lật các byte, như áp phích ban đầu được tìm thấy. Nếu bạn gọi WMI thì bạn không biết liệu WMI có bật các byte cho bạn hay không. –