openplanning

Lấy thông tin phần cứng máy tính trong ứng dụng Java

  1. Java API để lấy thông tin phần cứng máy tính?
  2. Lấy thông tin phần cứng sử dụng file vbscript
  3. Sử dụng Java lấy thông tin phần cứng máy tính

1. Java API để lấy thông tin phần cứng máy tính?

Đôi khi bạn có nhu cầu sử dụng Java để lấy thông tin phần cứng máy tính, bao gồm Serial Number của bản mạch (Mainboard), serial của ổ cứng, CPU,...

Thật đáng tiếc là Java không có API nào như vậy, hoặc có thể là có nhưng nó không được phát hành miễn phí cho các lập trình viên. Tuy nhiên trên Windows bạn có thể lấy được các thông tin này bằng cách thực thi các kịch bản VB(VB Script).

2. Lấy thông tin phần cứng sử dụng file vbscript

OK, để đơn giản, bạn có thể tạo một file myscript.vbs với nội dung:
myscript.vbs
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

Set colItems = objWMIService.ExecQuery _
("Select Name,UUID,Vendor,Version from Win32_ComputerSystemProduct")

For Each objItem in colItems  

    Wscript.Echo objItem.Name
    Wscript.Echo objItem.UUID
    Wscript.Echo objItem.Vendor
    Wscript.Echo objItem.Version
    
Next
Trên Windows click vào file để chạy nó.
Trong đó Win32_ComputerSystemProduct là một class của Visual Basic, các thuộc tính của class này:
Các thuộc tính
string Caption
string Description
string IdentifyingNumber
string Name
string SKUNumber
string UUID
string Vendor
string Version
Bạn có thể chạy một file kịch bản đầy đủ hơn:
Win32_ComputerSystemProduct.vbs
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

Set colItems = objWMIService.ExecQuery _
("Select * from Win32_ComputerSystemProduct")

For Each objItem in colItems 

    Wscript.Echo objItem.Caption
    Wscript.Echo objItem.Description
    Wscript.Echo objItem.IdentifyingNumber
    Wscript.Echo objItem.Name
    Wscript.Echo objItem.SKUNumber
    Wscript.Echo objItem.UUID
    Wscript.Echo objItem.Vendor
    Wscript.Echo objItem.Version

Next
Các giá trị nhận được (Ứng với máy tính của tôi):
Các thuộc tính
Giá trị (Ứng với máy tính của tôi)
Caption
Computer System Product
Description
Computer System Product
IdentifyingNumber
3F027935U
Name
Salellite S75B
SKUNumber
null
UUID
B09366C5-F0C7-E411-98E4-008CFA8C26DF
Vendor
TOSHIBA
Version
PSPPJU-07U051
Một số lớp Visual Basic khác có thể bạn quan tâm:

3. Sử dụng Java lấy thông tin phần cứng máy tính

OK, ở phần trên bạn đã biết cách sử dụng vb script để lấy ra thông tin phần cứng máy tính. Bây giờ bạn cần sử dụng Java thực thi các file vb script và nhận giá trị trả về.
MyUtility.java
package org.o7planning.hardwareinfo;

public class MyUtility {

    public static String makeVbScript(String vbClassName, String[] propNames) {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < propNames.length; i++) {
            if (i < propNames.length - 1) {
                sb.append(propNames[i]).append(",");
            } else {
                sb.append(propNames[i]);
            }
        }
        String colNameString = sb.toString();
        sb.setLength(0);

        sb.append("Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")").append("\n");
        sb.append("Set colItems = objWMIService.ExecQuery _ ").append("\n");
        sb.append("(\"Select ").append(colNameString).append(" from ").append(vbClassName).append("\") ").append("\n");
        sb.append("For Each objItem in colItems ").append("\n");
        for (String propName : propNames) {
            sb.append("    Wscript.Echo objItem.").append(propName).append("\n");
        }
        sb.append("Next ").append("\n");
        return sb.toString();
    }

}
GetHardwareInfo.java
package org.o7planning.hardwareinfo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class GetHardwareInfo {

   public static void printComputerSystemProductInfo() {

       String vbClassName = "Win32_ComputerSystemProduct";
       String[] propNames = new String[] { "Name", "UUID", "Vendor", "Version" };

       String vbScript = MyUtility.makeVbScript(vbClassName, propNames);

       System.out.println("----------------------------------------");
       System.out.println(vbScript);
       System.out.println("----------------------------------------");

       try {
           // Tạo một file tạm.
           File file = File.createTempFile("vbsfile", ".vbs");
           System.out.println("Create File: " + file.getAbsolutePath());
           System.out.println("------");
 
           // Ghi nội dung script vào file tạm.
           FileWriter fw = new FileWriter(file);
           fw.write(vbScript);
           fw.close();
 
           // Thực thi file.
           Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
 
           // Tạo một luồng đọc dữ liệu trả về sau khi thực thi file vb script.
           BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

           Map<String, String> map = new HashMap<String, String>();
           String line;
           int i = 0;
           while ((line = input.readLine()) != null) {
               if (i >= propNames.length) {
                   break;
               }
               String key = propNames[i];
               map.put(key, line);
               i++;
           }
           input.close();
           //
           for (String propName : propNames) {
               System.out.println(propName + " : " + map.get(propName));
           }

       } catch (Exception e) {
           e.printStackTrace();
       }
   }

   public static void main(String[] args) {
       printComputerSystemProductInfo();
   }
 
}
Chạy ví dụ: