Hola,

el siguiente código es para obtener datos del WMI (Windows Management Instrument).

Código:

Código: Seleccionar todo

public static String getData(String from, String get) {
        String r = "";
        String T = "";
        try {
            Process p = Runtime.getRuntime().exec(new String[]{"wmic", "path", from, "get", get});
            p.waitFor();
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "Cp850"));
            while ((br.ready())) {
                T = br.readLine();
                if (T.isEmpty()) {
                    continue;
                }
                r = T;
            }
        } catch (Exception e) {
            System.out.println("[getData] Hubo un error: "+e.getMessage());
        }
        return r.replace(get, "").trim();
    }
Ejemplo:

Código: Seleccionar todo

System.out.println("# Motherboard:");
        String[] motherBoardData = new String[]{"Manufacturer", "Product", "SerialNumber"};
        for (String data : motherBoardData) {
            System.out.println("\t- " + data + ": " + getData("Win32_BaseBoard", data));
        }

        System.out.println("# Processor:");
        String[] processorData = new String[]{"Description", "CurrentClockSpeed", "CurrentVoltage", "MaxClockSpeed", "Name", "NumberOfCores", "NumberOfLogicalProcessors", "ProcessorId", "Revision", "Version"};
        for (String data : processorData) {
            System.out.println("\t- " + data + ": " + getData("Win32_Processor", data));
        }

        System.out.println("# BIOS:");
        String[] biosData = new String[]{"Version", "Manufacturer", "SerialNumber"};
        for (String data : biosData) {
            System.out.println("\t- " + data + ": " + getData("Win32_Bios", data));
        }

        System.out.println("# VideoController:");
        String[] videoControllerData = new String[]{"Caption", "CurrentBitsPerPixel", "CurrentNumberOfColors", "CurrentRefreshDate", "DriverVersion"};
        for (String data : videoControllerData) {
            System.out.println("\t- " + data + ": " + getData("Win32_VideoController", data));
        }

        System.out.println("# OS:");
        String[] osData = new String[]{"Caption",
            "BuildNumber",
            "Version",
            "CSDVersion",
            "CSName",
            "CurrentTimeZone",
            "Manufacturer",
            "OSArchitecture",
            "RegisteredUser",
            "SerialNumber"
        };
        for (String data : osData) {
            System.out.println("\t- " + data + ": " + getData("Win32_OperatingSystem", data));
        }
Imagen:
Imagen
Por cierto, se me olvidó mencionar que código original es de adwind, sólo lo modifiqué para mi necesidad.

Aquí dejo algunos métodos alternativos:
getData con cláusula 'where':

Código: Seleccionar todo

public static String getData(String from, String get, String where, String value) {
        String r = "";
        String T = "";
        try {
            Process p = Runtime.getRuntime().exec(new String[]{"wmic", "path", from, "where", "\""+where+"='"+value+"'\"", "get", get});
            p.waitFor();
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "Cp850"));
            while ((br.ready())) {
                T = br.readLine();
                if (T.isEmpty()) {
                    continue;
                }
                r = T;
            }
        } catch (Exception e) {
            System.out.prinln("[getData] Hubo un error: "+e.getMessage());
        }
        return r.replace(get, "").trim();
    }
getData con ArrayList de retorno (por si hay más de un valor)

Código: Seleccionar todo

public static ArrayList<String> getDataList(String from, String get) {
        ArrayList<String> r = new ArrayList<>();
        try {
            Process p = Runtime.getRuntime().exec(new String[]{"wmic", "path", from, "get", get});

            String T;
            p.waitFor();
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "Cp850"));
            while ((br.ready())) {
                T = br.readLine().replace(get, "").trim();
                if (T.isEmpty()) {
                    continue;
                }
                r.add(T);
            }
        } catch (Exception ex) {
            System.out.prinln("[getDataList] Hubo un error: "+e.getMessage());
        }
        return r;
    }
El mismo de antes pero con 'where':

Código: Seleccionar todo

public static ArrayList<String> getDataList(String from, String get, String where, String value) {
        ArrayList<String> r = new ArrayList<>();
        try {
            Process p = Runtime.getRuntime().exec(new String[]{"wmic", "path", "where \""+where+"='"+value+"'\"", from, "get", get});

            String T;
            p.waitFor();
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "Cp850"));
            while ((br.ready())) {
                T = br.readLine().replace(get, "").trim();
                if (T.isEmpty()) {
                    continue;
                }
                r.add(T);
            }
        } catch (Exception ex) {
            System.out.prinln("[getDataList] Hubo un error: "+e.getMessage());
        }
        return r;
    }
Mios no son ><.

Por cierto que en algunas PC el WMIC viene desabilitado

Como dato extra en windows XP el br.ready() en ciertos casos se congela por lo que hay que usar br.readLine() y evaluar si es diferente a null en el while.
adwind escribió:Mios no son ><.

Por cierto que en algunas PC el WMIC viene desabilitado

Como dato extra en windows XP el br.ready() en ciertos casos se congela por lo que hay que usar br.readLine() y evaluar si es diferente a null en el while.
Lo saqué de unos métodos que tenía guardados de obtener el AV y el firewall, y ponía '@author adwind' así que sumé dos mas dos

Sabía que el WMIC viene deshabilitado en algunos PCs pero creo que sólo son unos pocos, y lo del br.ready no tenía ni idea, muchas gracias.
Responder

Volver a “Fuentes”