Alamin Dawan
Alamin Dawan

Reputation: 119

how to get motherboard serial number on GUI (in java)

I did like to show a motherboard serial number in text field (GUI panel). I created a text field and action button. I wrote this code in action button. What mistake did i make in this code?

try {
        Process p = Runtime.getRuntime().exec("wmic baseboard get serialnumber");
        BufferedReader inn = new BufferedReader(new InputStreamReader(p.getInputStream()));

        while (true) {

            String line = inn.readLine();
            if (line == null) {
                break;
            }
            motherboard.setText(line);
        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(this, "Sorry could not found motherboard serial!");
    }

Upvotes: 6

Views: 12446

Answers (5)

Hakan ÇELİK
Hakan ÇELİK

Reputation: 39

    getBufferReader("wmic logicaldisk get volumeserialnumber");
    getBufferReader("wmic csproduct get UUID");
    getBufferReader("wmic csproduct get name");
    getBufferReader("wmic CPU get ProcessorId");
    getBufferReader("wmic CPU get Architecture");
    getBufferReader("wmic CPU get NumberOfCores");
    getBufferReader("wmic CPU get ProcessorType");
    getBufferReader("wmic CPU get Revision");
    getBufferReader("wmic CPU get Family");
    getBufferReader("wmic CPU get Level");
    getBufferReader("wmic CPU get Name");
    getBufferReader("wmic CPU get SerialNumber");
    getBufferReader("wmic bios get Manufacturer");
    getBufferReader("wmic bios get Version");
    getBufferReader("wmic bios get SMBIOSBIOSVersion");
    getBufferReader("wmic bios get SMBIOSMajorVersion");
    getBufferReader("wmic bios get SMBIOSMinorVersion");
    getBufferReader("wmic bios get ReleaseDate");
    getBufferReader("wmic bios get serialnumber");
    getBufferReader("wmic baseboard get serialnumber");
    getBufferReader("wmic DISKDRIVE get SerialNumber");
    getBufferReader("wmic useraccount get name,sid");


    public static String getBufferReader(String getCode) throws IOException, Exception {
        StringBuilder output = new StringBuilder();
        Process processRun = Runtime.getRuntime().exec(getCode);
        BufferedReader processBuf = new BufferedReader(new InputStreamReader(processRun.getInputStream()));
        String line;
        while ((line = processBuf.readLine()) != null) {
            output.append(line).append("\n");
        }
        return output.toString().substring(output.indexOf("\n"), output.length()).trim().replace("-", "");
    }

Upvotes: 2

Victor Irechukwu
Victor Irechukwu

Reputation: 81

private void serial(){
    // wmic command for diskdrive id: wmic DISKDRIVE GET SerialNumber
    // wmic command for cpu id : wmic cpu get ProcessorId
    Process process = null;
    try {
        process = Runtime.getRuntime().exec(new String[] { "wmic", "bios", "get", "SerialNumber" });
        //process = Runtime.getRuntime().exec(new String[] { "wmic", "DISKDRIVE", "get", "SerialNumber" });
       // process = Runtime.getRuntime().exec(new String[] { "wmic", "cpu", "get", "ProcessorId" });
       //process = Runtime.getRuntime().exec(new String[] { "wmic", "baseboard", "get", "SerialNumber" });
        process.getOutputStream().close();
    } catch (IOException ex) {
        Logger.getLogger(Activate.class.getName()).log(Level.SEVERE, null, ex);
    }
    Scanner sc = new Scanner(process.getInputStream());
    String property = sc.next();
    String serial = sc.next();
    System.out.println(property + ": " + serial);
    this.serial.setText(property + ": " + serial);
}

Upvotes: 1

SubOptimal
SubOptimal

Reputation: 22973

The problem is that you read a multi-line output

while (true) {
    String line = inn.readLine();
    if (line == null) {
            break;
        }
...

but you store always only the line which was current read in the textfield. Means previous output is overwritten.

...
        motherboard.setText(line);
}

As the last line of the output is an empty line your text field shows this empty line (means you don't see any output).

edit Below is added only for completeness.

A small method which could be used as String serialNumber = getSerialNumber(). It filter out the header line and the empty lines.

static String getSerialNumber() throws IOException, InterruptedException {
    ProcessBuilder pb = new ProcessBuilder("wmic", "baseboard", 
            "get", "serialnumber");
    Process process = pb.start();
    process.waitFor();
    String serialNumber = "";
    try (BufferedReader br = new BufferedReader(new InputStreamReader(
            process.getInputStream()))) {
        for (String line = br.readLine(); line != null; line = br.readLine()) {
            if (line.length() < 1 || line.startsWith("SerialNumber")) {
                continue;
            }
            serialNumber = line;
            break;
        }
    }
    return serialNumber;
}

Another way could be to do the filtering already on the wmic command and read only the first line from the output.

Either with commandlline tools provided by Windows

wmic baseboard get serialnumber | findstr /r /v "^$" | findstr /v "SerialNumber"

or using a custom XSL to control the output of wmic.

Save it as simple.xsl

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="/"><xsl:apply-templates select="COMMAND/RESULTS"/>
</xsl:template>
</xsl:stylesheet>

and run the command as

wmic baseboard get serialnumber /Format:.\simple

Upvotes: 1

Aqeel Haider
Aqeel Haider

Reputation: 633

 try
    {
        String result = null;
        Process p = Runtime.getRuntime().exec("wmic baseboard get serialnumber");
        BufferedReader input
                = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = input.readLine()) != null)
        {
            result += line;
        }
        if (result.equalsIgnoreCase(" ")) {
            System.out.println("Result is empty");
        } else
        {
            motherboard.setText(result);
        }
        input.close();
    } catch (IOException ex)
    {
        Exceptions.printStackTrace(ex);
    }

Upvotes: 3

Xvolks
Xvolks

Reputation: 2155

You should use an other form of Runtime.exec :

        String[] command = {"wmic", "baseboard", "get", "serial number"};
        Process p = Runtime.getRuntime().exec(command);

Upvotes: 0

Related Questions