Solução para pegar o Serial do HD e o Serial da CPU

Também testei e tive como retorno um número negativo, alguém sabe explicar se está correto?

Tb tive retorno de número negativo, oque fiz foi converter para Hexa, me trouxe o valor certinho do volume do hd

    DiskUtils utilConnection = new DiskUtils("C");       
    int valor = utilConnection.getSerialNumber();
    String serial =  Integer.toHexString(valor);

Para aqueles que como eu pegaram um retorno errado no serial do HD

public static String getHDSerial(String drive) {  
        String result = "";  
        try {  
            File file = File.createTempFile("tmp", ".vbs");  
            file.deleteOnExit();  
            FileWriter fw = new java.io.FileWriter(file);  
  
            String vbs = "strComputer = \".\"\n"+
					"Set objWMIService = GetObject(\"winmgmts:{impersonationLevel=impersonate}!\\\\\" & strComputer & \"\\root\\cimv2\")\n"+
					"str = \"\"\n"+
					"disk = \"" + drive.toUpperCase() + ":\"\n"+
					"Set colItems = objWMIService.ExecQuery(\"SELECT * FROM Win32_LogicalDisk\")\n"+
					"For Each objItem In colItems\n"+
					   "If objItem.Name = disk Then\n"+
					       "Wscript.Echo objItem.VolumeSerialNumber\n"+
					   "End If\n"+
					"Next"; 
            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) {  
  
        }  
        if (result.trim().length() < 1  || result == null) {  
            result = "NO_DISK_ID";  
  
        }  
  
        return result.trim();  
    } 

isto é para windows, gostaria de ver isto multiplataforma…
Who can do it???

Sei que o Post e antigo mas pode ajudar alguém,
eu tinha esse metodo no meu projeto mas ele demorar muito pra retornar o id do processador então criei este que e mais rápido.
ele gasta em torno de 100 milesimos enquanto da outra forma gasta mais de 1000

 try {
            Process pid = Runtime.getRuntime().exec("wmic cpu get processorId");
            BufferedReader in = new BufferedReader(new InputStreamReader(pid.getInputStream()));
            String line = "";
            while (in.read() > 0) {
                line += in.readLine();
            }
            line = line.substring(line.indexOf(" "), line.length());
            line =line.replaceAll(" ", "");
            System.out.println(line);
        } catch (IOException ex) {
            Logger.getLogger(LacamentoContasControler.class.getName()).log(Level.SEVERE, null, ex);
        }