Trang 1 trên 1

Hỏi về Serialnumber của ổ cứng?

Đã gửi: T.Ba 05/04/2011 8:33 am
gửi bởi redsea_tq
Em chào các bác, em dùng đoạn mã sau để tìm Serialnumber của ổ cứng, nhưng có máy tìm được có máy không tìm được. Em không hiểu tại sao lại như vậy mong các bác chỉ giúp vì đoạn mã này em cũng chỉ tham khảo trên mạng và ứng dụng nên cũng không hiểu sâu về nó nhiều lắm.
  1. Private Sub cm_Pass_Click()
  2.     Dim ObjetoWMI As Object
  3.     Dim Disco As Object
  4.     Dim Discos As Object
  5.     Dim abc
  6.     Set ObjetoWMI = GetObject("WINMGMTS:")
  7.     Set Discos = ObjetoWMI.InstancesOf("Win32_PhysicalMedia")
  8.     abc = ""
  9.     For Each Disco In Discos
  10.         abc = Disco.SerialNumber
  11.         If Len(Trim(abc)) > 0 Then
  12.             Exit For
  13.         End If
  14.     Next
  15.     tb_Thongtin.Text = Trim(abc)
  16. End Sub
  17.  

Re: Hỏi về Serialnumber của ổ cứng?

Đã gửi: T.Ba 05/04/2011 10:08 am
gửi bởi truongphu
Với VB6 cổ điển, việc tìm hard disk number rất khó, phải dùng các hàm API phức tạp lòng thòng
trên XP trở đi, MS cho thêm WMI để thao tác với toàn bộ quản lý và hoạt động của máy tính,
nhờ thế, việc dùng code WMI trên VB6 đơn giản hơn nhiều
redsea_tq đã viết:

Mã: Chọn hết

    Set ObjetoWMI = GetObject("WINMGMTS:")
    Set Discos = ObjetoWMI.InstancesOf("Win32_PhysicalMedia")

** 2 câu code trên là gọi WMI: system32\wbem\winmgmt.exe
redsea_tq đã viết:nhưng có máy tìm được có máy không tìm được.

- có thể các máy khác chạy khác HĐH
- quyền quản trị không cho user chạy WMI
- câu code khá đầy đủ sẽ là:

Mã: Chọn hết

 strComputer = "."  ' hoac dùng tên máy tính, vd "redsea_tq001"
    Set ObjetoWMI = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
    Set Discos = ObjetoWMI.ExecQuery("SELECT * FROM Win32_PhysicalMedia")

- Tôi test code của bạn trên máy của tôi, tốt, thu gọn như sau:

Mã: Chọn hết

Private Sub Command1_Click()
    Set Discos = GetObject("WINMGMTS:").InstancesOf("Win32_PhysicalMedia")
    For Each Disco In Discos
        abc = Disco.SerialNumber
        If Len(Trim(abc)) > 0 Then Exit For
    Next
    MsgBox Trim(abc)
End Sub

(code script không cần Dim... As)
Bạn thử các biện pháp trên, nếu không được trên một số máy, thử dùng API

Re: Hỏi về Serialnumber của ổ cứng?

Đã gửi: T.Ba 05/04/2011 10:29 pm
gửi bởi redsea_tq
Em cám ơn bác TruongPhu rất nhiều, có lẽ em phải dùng API thôi mà API thì đúng là lòng thòng thật. em đã thử theo cách của bác mà vẫn không được, biến abc trả về null có nghĩa là nó không tìm được một Disco nào cả. em cũng không hiểu tại sao nữa, tất cả các máy đều dùng win xp. Nhưng vẫn cảm ơn bác rất nhiều, bác đúng là sư phụ về vb!

Re: Hỏi về Serialnumber của ổ cứng?

Đã gửi: T.Tư 06/04/2011 7:43 am
gửi bởi truongphu
Tôi chợt nhớ một số đĩa cứng mới có chuẩn khác với chuẩn truyền thống IDE/ATA, không biết liệu như thế có tác dụng làm code nhận không ra chăng (biến abc trả về null)

Sau đây là project của tiền bối nào đó viết trên API kèm 1 dll, chạy khá tốt

Re: Hỏi về Serialnumber của ổ cứng?

Đã gửi: T.Tư 06/04/2011 5:41 pm
gửi bởi redsea_tq
Em cám ơn bác nhiều, để em chạy thử xem sao!

Re: Hỏi về Serialnumber của ổ cứng?

Đã gửi: T.Năm 29/06/2017 6:12 pm
gửi bởi hxuyenlqd
Khi đưa chương trình thành hàm đọc SerialNumHDD và khai báo biến như sau thi bị báo lỗi tại dòng 5:
For Each Disco In Discos
Bạn nào biết cách khai báo biến Disco giúp mình với
Dim Discos As Object
Dim abc As String
Public Function SerialNumHDD() As String
Set Discos = GetObject("WINMGMTS:").InstancesOf("Win32_PhysicalMedia")
For Each Disco In Discos
abc = Trim$(Disco.SerialNumber)
If Len(Trim(abc)) > 0 Then Exit For
Next
SerialNumHDD = abc
End Function