1. 程式人生 > >獲取PC硬體資訊方法一:利用Java Applet

獲取PC硬體資訊方法一:利用Java Applet



Java Applet可以執行在網頁上面,實現功能是通過呼叫Java來獲取本地硬碟資訊,前提是本機必須安裝Java環境才能執行,不然會提示你安裝。

下面是程式碼:

package com.test;

import java.applet.Applet;
import java.awt.Graphics;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;

public class HardWareUtils extends Applet{

	public HardWareUtils(){
	}
	private static final long serialVersionUID = 1L;

	@Override
	public void paint(Graphics paint) {
		super.paint(paint);
		paint.drawString("獲取硬體資訊", 10, 10);
		paint.drawString("CPU  SN:" + HardWareUtils.getCPUSerial(), 10, 30);
		paint.drawString("主機板  SN:" + HardWareUtils.getMotherboardSN(), 10, 50);
		paint.drawString("C盤   SN:" + HardWareUtils.getHardDiskSN("c"), 10, 70);
		paint.drawString("MAC  SN:" + HardWareUtils.getMac(), 10, 90);
	}

	/**
	 * 獲取主機板序列號
	 * 
	 * @return
	 */
	public static String getMotherboardSN() {
		String result = "";
		try {
			File file = File.createTempFile("realhowto", ".vbs");
			file.deleteOnExit();
			FileWriter fw = new java.io.FileWriter(file);
			String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
					+ "Set colItems = objWMIService.ExecQuery _ \n"
					+ "   (\"Select * from Win32_BaseBoard\") \n"
					+ "For Each objItem in colItems \n"
					+ "    Wscript.Echo objItem.SerialNumber \n"
					+ "    exit for  ' do the first cpu only! \n" + "Next \n";

			fw.write(vbs);
			fw.close();
			Process p = Runtime.getRuntime().exec(
					"cscript //NoLogo " + file.getPath());
			BufferedReader input = new BufferedReader(new InputStreamReader(p
					.getInputStream()));
			String line;
			while ((line = input.readLine()) != null) {
				result += line;
			}
			input.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result.trim();
	}

	/**
	 * 獲取硬碟序列號
	 * 
	 * @param drive
	 *            碟符
	 * @return
	 */
	public static String getHardDiskSN(String drive) {
		String result = "";
		try {
			File file = File.createTempFile("realhowto", ".vbs");
			file.deleteOnExit();
			FileWriter fw = new java.io.FileWriter(file);

			String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"
					+ "Set colDrives = objFSO.Drives\n"
					+ "Set objDrive = colDrives.item(\""
					+ drive
					+ "\")\n"
					+ "Wscript.Echo objDrive.SerialNumber"; // see note
			fw.write(vbs);
			fw.close();
			Process p = Runtime.getRuntime().exec(
					"cscript //NoLogo " + file.getPath());
			BufferedReader input = new BufferedReader(new InputStreamReader(p
					.getInputStream()));
			String line;
			while ((line = input.readLine()) != null) {
				result += line;
			}
			input.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result.trim();
	}

	/**
	 * 獲取CPU序列號
	 * 
	 * @return
	 */
	public static String getCPUSerial() {
		String result = "";
		try {
			File file = File.createTempFile("tmp", ".vbs");
			file.deleteOnExit();
			FileWriter fw = new java.io.FileWriter(file);
			String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
					+ "Set colItems = objWMIService.ExecQuery _ \n"
					+ "   (\"Select * from Win32_Processor\") \n"
					+ "For Each objItem in colItems \n"
					+ "    Wscript.Echo objItem.ProcessorId \n"
					+ "    exit for  ' do the first cpu only! \n" + "Next \n";
			fw.write(vbs);
			fw.close();
			Process p = Runtime.getRuntime().exec(
					"cscript //NoLogo " + file.getPath());
			BufferedReader input = new BufferedReader(new InputStreamReader(p
					.getInputStream()));
			String line;
			while ((line = input.readLine()) != null) {
				result += line;
			}
			input.close();
			file.delete();
		} catch (Exception e) {
			e.fillInStackTrace();
		}
		if (result.trim().length() < 1 || result == null) {
			result = "無CPU_ID被讀取";
		}
		return result.trim();
	}

	/**
	 * 獲取MAC地址
	 */
	public static String getMac() {
		try {
			byte[] mac = NetworkInterface.getByInetAddress(InetAddress.getLocalHost()).getHardwareAddress();
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < mac.length; i++) {
				if (i != 0) {
					sb.append("-");
				}
				String s = Integer.toHexString(mac[i] & 0xFF);
				sb.append(s.length() == 1 ? 0 + s : s);
			}
			return sb.toString().toUpperCase();
		} catch (Exception e) {
			return "";
		}

	}
}

執行效果如下:

注意:如果直接在Eclipse裡面執行正常,如果嵌入到網頁中想要正常獲取必須進行簽名。

對Java Applet進行簽名的方法如下:

怎樣對java小程式簽名受到很多人的關注,網上也有這些方面可供參考的文件,但都不是完整,在這裡我給出一份可具體操作的文件,希望能給大家一些幫助。 場景:test.jar:內含待簽名的java小程式 結果:簽名後,客戶端能自動下載java小程式,且java小程式能訪問客戶端的任何資源

步驟:

(1)將java小程式打包
  jar cvf test.jar test.class

(2)生成名為chinani.store的金鑰庫,別名為chinani
  keytool -genkey -keystore chinani.store -alias chinani
密碼:123456 (根據需要自己輸入) 以下根據需要輸入,最後確認:y

(3)匯出chinani.cer數字證書
  keytool -export -keystore chinani.store -alias chinani -file chinani.cer
密碼:123456 (根據需要自己輸入)

(4)對test.jar檔案進行簽名
  jarsigner -keystore chinani.store  test.jar chinani
密碼:123456 (根據需要自己輸入)

  最後寫一個html檔案,執行此檔案即可自動下載安裝執行java小程式HTML檔案內容如下:

<applet code=Test
archive="Test.jar"
width=320 height=300>
</applet>