PDA

View Full Version : Làm sao để đọc ID của CPU?



levanduyet
19-05-08, 11:18 PM
Bạn có thể lập trình trong Excel bằng cách dùng ngôn ngữ VBA (Visual Basic for Application).

Bản thân các lệnh của VBA cũng như các hàm sẵn có của VBA không có khả năng truy xuất được các thông tin phần cứng cấp thấp của máy như CPU ID... Tuy nhiên Microsoft có cung cấp công nghệ “Windows Management Instrumentation” (WMI) để giúp ta truy xuất các thông tin phần cứng của máy rất dễ dàng, ngắn gọn và an toàn. Thí dụ sau đây là macro GetCPUID với chức năng là đọc và hiển thị CPU ID của máy lên màn hình. Bạn có thể tạo macro GetCPUID trong Word, Excel như sau:


Sub GetCPUID()
‘tạo đối tượng dịch vụ WMI
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
‘tìm các CPU đang chạy của máy
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
‘lặp hiển thị ID của từng CPU
For Each objItem In colItems
MsgBox "Processor Id: " & objItem.ProcessorId
Next
End Sub


Lưu ý rằng trên các máy PC bình thường, chỉ có 1 CPU nên vòng lặp hiển thị thông tin sẽ chỉ chạy 1 lần và hiển thị ID của CPU duy nhất của máy.

Ngoài ra để truy xuất các thông tin của 1 thiết bị I/O nào đó, thí dụ như "serial number" của đĩa cứng, bạn có thể gọi hàm API Windows có tên là DeviceIoControl(). Bạn có thể liên hệ với TGVT để copy Project VB 6.0 có tên là VB DispDiskInfo để biết chi tiết về việc gọi hàm DeviceIoControl() để truy xuất các thông tin vật lý của đĩa cứng.
TGVT
Đã có đọc Serial của HDD ở đây (http://www.giaiphapexcel.com/forum/showthread.php?t=2918)

levanduyet
20-05-08, 09:06 AM
Như đã có đề cập ở một số bài viết, việc áp dụng hàm này để đọc ID của CPU, từ đó cung cấp licence cho người sử dụng trong trường hợp bạn bán một ứng dụng nào đó.
Ví dụ:
_ Người mua mua ứng dụng của bạn, hàm này đọc ID của CPU và gởi cho bạn.
_ Sau đó bạn dùng một thuật toán nhằm chuyển ID sang một mã (Licence) cung cấp cho người dùng.

Như vậy sẽ bảo đảm không có việc cấp licence cho nhiều máy cùng dùng chung một ứng dụng của bạn.

Lê Văn Duyệt

phongvanvu
21-05-08, 08:01 AM
Xin lưu ý chỉ có thể sử dụng từ phiên bản Windows XP trở lên. Các Windows trước sẽ không chạy được.

HideBoy
22-01-09, 06:29 PM
("winmgmts:\\.\root\cimv2") .... not defined
Vậy là sao hả anh LVD, AT?

ndu96081631
22-01-09, 07:14 PM
("winmgmts:\\.\root\cimv2") .... not defined
Vậy là sao hả anh LVD, AT?
Trong của sổ viết code của bạn, có thể có dòng Option Explicit ở trên cùng ---> Bạn thử xóa dòng này xem

ongtrungducmx25
23-01-09, 08:22 AM
Như đã có đề cập ở một số bài viết, việc áp dụng hàm này để đọc ID của CPU, từ đó cung cấp licence cho người sử dụng trong trường hợp bạn bán một ứng dụng nào đó.
Ví dụ:
_ Người mua mua ứng dụng của bạn, hàm này đọc ID của CPU và gởi cho bạn.
_ Sau đó bạn dùng một thuật toán nhằm chuyển ID sang một mã (Licence) cung cấp cho người dùng.

Như vậy sẽ bảo đảm không có việc cấp licence cho nhiều máy cùng dùng chung một ứng dụng của bạn.

Lê Văn Duyệt

Còn cái vụ này thì em không biết người ta làm như thế nào nhỉ!
Nó đọc được số ID được từ đó cung cấp licence cho người sử dụng trong trường hợp bạn bán một ứng dụng nào đó.
Ví dụ:
_ Người mua mua ứng dụng của bạn, hàm này đọc ID của CPU và gởi cho bạn.
_ Sau đó bạn dùng một thuật toán nhằm chuyển ID sang một mã (Licence) cung cấp cho người dùng.
http://www.giaiphapexcel.com/forum/attachment.php?attachmentid=21593&stc=1&d=1232673706

hai2hai
23-01-09, 09:31 AM
"Windows Management Instrumentation” (WMI)

Dở 1 cái là nó dùng thêm 1 reference object chỉ để làm mỗi việc đó. Trong khi phần mềm thì phải hạn chế những dependency files. Anh Duyệt thấy không, khi viết ứng dụng là phải tính toán kỹ là dùng cái gì, ko dùng cái gì để tránh ứng dụng to vật.

Cái món WMI này trên PSC nó có cả sample lấy đủ thứ của máy tính, viết khá chuẩn. Nhưng nếu ko phải là API mà dùng thêm 1 thư viện thì hai2hai sẽ ko dùng. (nhất là dùng cái đó chỉ để lấy mỗi UniqueID của máy)

Trên PSC có rất nhiều code về software protection được viết CỰC KỲ CHUYÊN NGHIỆP. Tuy nhiên, tìm đỏ mắt không có cái nào GetMACAddress (lấy địa chỉ card mạng) mà lấy đúng cái primary MACAddress cả (trường hợp máy có nhiều card mạng ảo)


Tóm lại: Khi viết ứng dụng thì ko nên dùng WMI vì ... cảm giác ko chuyên nghiệp.

PhanTuHuong
23-01-09, 11:00 AM
Dở 1 cái là nó dùng thêm 1 reference object chỉ để làm mỗi việc đó. Trong khi phần mềm thì phải hạn chế những dependency files. Anh Duyệt thấy không, khi viết ứng dụng là phải tính toán kỹ là dùng cái gì, ko dùng cái gì để tránh ứng dụng to vật.

Cái món WMI này trên PSC nó có cả sample lấy đủ thứ của máy tính, viết khá chuẩn. Nhưng nếu ko phải là API mà dùng thêm 1 thư viện thì hai2hai sẽ ko dùng. (nhất là dùng cái đó chỉ để lấy mỗi UniqueID của máy)

Trên PSC có rất nhiều code về software protection được viết CỰC KỲ CHUYÊN NGHIỆP. Tuy nhiên, tìm đỏ mắt không có cái nào GetMACAddress (lấy địa chỉ card mạng) mà lấy đúng cái primary MACAddress cả (trường hợp máy có nhiều card mạng ảo)


Tóm lại: Khi viết ứng dụng thì ko nên dùng WMI vì ... cảm giác ko chuyên nghiệp.


Nhìn chung, code trên chỉ để tham khảo vì khó khai thác và sử dụng thông tin.

PhanTuHuong
09-04-09, 11:02 PM
Bản thân các lệnh của VBA cũng như các hàm sẵn có của VBA không có khả năng truy xuất được các thông tin phần cứng cấp thấp của máy như CPU ID... Tuy nhiên Microsoft có cung cấp công nghệ “Windows Management Instrumentation” (WMI) để giúp ta truy xuất các thông tin phần cứng của máy rất dễ dàng, ngắn gọn và an toàn. Thí dụ sau đây là macro GetCPUID với chức năng là đọc và hiển thị CPU ID của máy lên màn hình. Bạn có thể tạo macro GetCPUID trong Word, Excel như sau:


Sub GetCPUID()
‘tạo đối tượng dịch vụ WMI
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
‘tìm các CPU đang chạy của máy
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
‘lặp hiển thị ID của từng CPU
For Each objItem In colItems
MsgBox "Processor Id: " & objItem.ProcessorId
Next
End Sub


Lưu ý rằng trên các máy PC bình thường, chỉ có 1 CPU nên vòng lặp hiển thị thông tin sẽ chỉ chạy 1 lần và hiển thị ID của CPU duy nhất của máy.

Ngoài ra để truy xuất các thông tin của 1 thiết bị I/O nào đó, thí dụ như "serial number" của đĩa cứng, bạn có thể gọi hàm API Windows có tên là DeviceIoControl(). Bạn có thể liên hệ với TGVT để copy Project VB 6.0 có tên là VB DispDiskInfo để biết chi tiết về việc gọi hàm DeviceIoControl() để truy xuất các thông tin vật lý của đĩa cứng.
TGVT
Đã có đọc Serial của HDD ở đây (http://www.giaiphapexcel.com/forum/showthread.php?t=2918)

Có bác nào test thử khi format ổ đĩa, hàm trên có trả chính xác không?

xuanhoa7604
12-04-09, 10:58 PM
Mình thấy cách này cũng được nhưng mà nghe vẻ nó chạy hơi nặng. Bạn có cách nào khác không?

dht
25-09-09, 09:01 AM
Như đã có đề cập ở một số bài viết, việc áp dụng hàm này để đọc ID của CPU, từ đó cung cấp licence cho người sử dụng trong trường hợp bạn bán một ứng dụng nào đó.
Ví dụ:
_ Người mua mua ứng dụng của bạn, hàm này đọc ID của CPU và gởi cho bạn.
_ Sau đó bạn dùng một thuật toán nhằm chuyển ID sang một mã (Licence) cung cấp cho người dùng.

Như vậy sẽ bảo đảm không có việc cấp licence cho nhiều máy cùng dùng chung một ứng dụng của bạn.

Lê Văn Duyệt

Nếu máy của người dùng bị hỏng CPU phải thay thì sao? Cấp bản quyền cho User hay là cho CPU? Nếu đã cấp bản quyền cho người sử dụng thì phải cho phép người ta sử dụng ứng dụng với các máy khác nhau chứ, ví dụ đến cơ quan thì dùng máy cơ quan, về nhà thì dùng máy gia đình, đi công tác thì dùng laptop...

hai2hai
25-09-09, 09:37 AM
Nếu máy của người dùng bị hỏng CPU phải thay thì sao? Cấp bản quyền cho User hay là cho CPU? Nếu đã cấp bản quyền cho người sử dụng thì phải cho phép người ta sử dụng ứng dụng với các máy khác nhau chứ, ví dụ đến cơ quan thì dùng máy cơ quan, về nhà thì dùng máy gia đình, đi công tác thì dùng laptop...

Chính xác là như bạn nói. Cấp quyền cho người sử dụng (cấp theo số concurrent users) nhưng vẫn phải cho 1 máy chủ (và vì thế vẫn cần phải xác định UniqueKey của máy chủ). Nghĩa là việc xác định quyền là cho số lượng người cùng truy cập vào máy chủ. Ví dụ, kể cả khi đi du lịch trên thế giới, người chủ có thể login vào CSDL của công ty mà ko bị chạy ở chế độ trial KHI VÀ CHỈ KHI số người cùng truy cập vào máy chủ đó < số licenses được cấp.

Đối với 1 số loại hình sản phẩm khác (như ActiveX Control, Developer tools,...) thì lại phần lớn là cung cấp theo máy chứ ko theo người dùng.

khatcai
06-04-10, 11:19 AM
Tôi muốn có một hàm để đọc số Seri cua MainBoard bất kì, bạn có thể giúp tôi được không? Cảm ơn bạn nhiều!

trai_xu_lanh
17-06-10, 02:40 PM
chào các bác ,
em mới bập bẹ tìm hiểu về lập trình , các bác viết mẫu giúp em làm cách nào để làm được như hình bên dưới
Phần mềm sẽ có đoạn code nhận số seria của mainboard , kết hợp với tên đăng kí để tạo thành 1 số đăng ký tạo ẩn trong máy,Người sử dụng gửi số mainboard cho mình để nhận số đăng ký và điền vào khung dưới , so sánh 2 số nếu trùng nhau sẽ cho sử dụng ( chi lần đầu tiên sau khi cài đặt )

tuantlg
17-05-11, 05:15 PM
Tôi gà mờ vụ này lắm. Bạn có thể hướng dẫn cụ thể từng bước tạo loại marco không?