Informações do computador

Olá!!!

Sou novato em java e estou precisando de uma ajuda.
Um amigo me perguntou se é possível fazer um applet em java para colocar em um página na internet onde o usuário clicaria em um botão e o applet pegasse as informações do equipamento como marca e modelo da placa-mãe, marca e modelo do processador, marca/modelo/serial do HD e quantidade de memória RAM do equipamento do usuário e enviasse em forma de arquivo txt ou preenchesse uma caixa de texto localizada na página da internet com essas informações.
Eu acho que é possível, mas não sei nem por onde começar, já que nunca desenvolví nada nesse sentido.
Gostaria de saber qual classe utilizar e se alguém possui um exemplo que possa disponibilizar.

Grato pela atenção de todos.

Maurício

Sim, é possível, se for Linux a máquina a ser escaneada, o que poderia ser feito é ler um arquivo de texto da saída do comando dmidecode e lspci.

# dmidecode |more >> arquivo.txt
$ lspci >> arquivo.txt

Os arquivos serão salvos na Home do usuário, então a aplicação iria executar e ler o resultado desses comandos, pode ser feito via Web. Pode criar filtros e talz, para pegar a informação importante disso td.
Resta então implementar isso na aplicação.

[]s

[quote=Guevara]Sim, é possível, se for Linux a máquina a ser escaneada, o que poderia ser feito é ler um arquivo de texto da saída do comando dmidecode e lspci.

# dmidecode |more >> arquivo.txt
$ lspci >> arquivo.txt

Os arquivos serão salvos na Home do usuário, então a aplicação iria executar e ler o resultado desses comandos, pode ser feito via Web. Pode criar filtros e talz, para pegar a informação importante disso td.
Resta então implementar isso na aplicação.

[]s[/quote]

Não, não é possível. É possível executar o comando em Java usando Runtime.exec(), mas não é possível fazer isso em Applets (por questões de segurança). Além de tudo, mesmo que o arquivo já estivesse pronto, com todas as informações, por questões de segurança (de novo…) um Applet NÃO pode acessar o sistema de arquivos do usuário. Logo, usando Applet não é possível. Mas quem sabe uma aplicação desktop…

Eu não sei se ajuda, mas um usuário do GUJ uma vez postou uma classe que pega o serial do HD e do CPU
é esta.

[code]package Visão;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;

public class Teste {

public static String getHDSerial(String drive) {   
    String result = "";   
    try {   
        //File file = File.createTempFile("tmp",".vbs");   
        File file = File.createTempFile("tmp", ".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";     
        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();   
}   

public static String getCPUSerial() {   
    String result = "";   
    try {   
        File file = File.createTempFile("tmp", ".vbs");   
        file.deleteOnExit();   
        FileWriter fw = new java.io.FileWriter(file);   

        String vbs =   
            "On Error Resume Next \r\n\r\n" +   
            "strComputer = \".\"  \r\n" +   
            "Set objWMIService = GetObject(\"winmgmts:\" _ \r\n" +   
            "    & \"{impersonationLevel=impersonate}!\\\" & strComputer & \"\root\cimv2\") \r\n" +   
            "Set colItems = objWMIService.ExecQuery(\"Select * from Win32_Processor\")  \r\n " +   
            "For Each objItem in colItems\r\n " +   
            "    Wscript.Echo objItem.ProcessorId  \r\n " +   
            "    exit for  ' do the first cpu only! \r\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_CPU_ID";   
    }   
    return result.trim();   
}   

public static void main(String[] args) {   
    System.out.println("Serial do HD: " + getHDSerial("c"));   
    System.out.println("Serial da CPU: " + getCPUSerial());   
}   

}

[/code]
Espere que ajude, se der certo posta ai, eu estava precisando de alguma coisa que pegasse o IP da maquina do usuário que acessa um site.Vc já fez isto???

[quote=Daniel.F]# String vbs = “Set objFSO = CreateObject(“Scripting.FileSystemObject”)\n” + “Set colDrives = objFSO.Drives\n”

+ “Set objDrive = colDrives.item(”" + drive + “”)\n" + “Wscript.Echo objDrive.SerialNumber”;[/quote]

Aproveitando o post, fiz uns testes aqui alterando a letra da unidade e obtive valores diferentes. Não haveria um serial para o disco inteiro independente de partição?

Scripting Runtime Library - SerialNumber Property indica que o "serialNumber" é aquele cara que aparece quando você dá um "dir" nesse drive:

C:\jdk1.6.0\bin>dir
 O volume na unidade C não tem nome.
 O número de série do volume é 785E-5B38

Nesse caso, acho que o "serialNumber" retornado seria o valor 2019449656 (em hexadecimal, 0x785E5B38)

O que você quer é o número de série do fabricante, que nem numérico é, mas é bem mais complicado de obter. Uma coisa boa desse número do fabricante é que se mantém inalterado se o usuário resolver reformatar o disco.

E aí Mauricio, estou com dúvidas semelhantes as suas.
Preciso capturar o tamanho do disco, a quantidade de espaço livre em disco e a quantidade de memória RAM do computador.
Caso consiga descobrir será que poderia postar por favor?

Obrigado!

Bom dia,

As Applets nao fazem quaze nada,  por questões de segurança. Mas toda maneira utilise JavaWebStart   ....  JavaFX

O JAVA e JRE e JVM sao feitos par ser separados do OS e muito mais do hardware.

Mas as aplicações JAVA fazem todo o quaze todo, o problema : o codigo para cada Sistema (OS) deve ser diferente.

Existe o menos 3 tecnicas par obter informaçaos sobre : sistema java / sistema OS / harware :

1-a )  Informções  vistas por   java  JVM :
public class TestVarsJava {

  public static void main(String[] args)
  {
    java.util.Enumeration liste = System.getProperties().propertyNames();
    String cle;
    while( liste.hasMoreElements() ) {
        cle = (String)liste.nextElement();
        System.out.println( cle + " = " + System.getProperty(cle) );
    } 
  }
}

1-b ) Utilizaçao das API java :

exemplos : File , FileSystemView

import java.io.File;
import javax.swing.filechooser.FileSystemView;

 public class DriveTypeInfo 
 {  
	 public static void main (String [] args) 
     {  
         System.out.println("File system roots returned by FileSystemView.getFileSystemView():"); 
         FileSystemView fsv = FileSystemView.getFileSystemView();  
         File[] roots = fsv.getRoots(); 
		 
		 
         for (int i = 0; i < roots.length; i++) 
         { 
             System.out.println("Root: " + roots[i]); 
         } 

         System.out.println("Home directory: " + fsv.getHomeDirectory()); 
		 
         System.out.println("File system roots returned by File.listRoots():"); 
         File[] f = File.listRoots(); 
		 
         for (int i = 0; i < f.length; i++) 
         { 
             System.out.println("Drive: " + f[i]); 
			 System.out.println("Display name: " + fsv.getSystemDisplayName(f[i])); 
             System.out.println("Is drive: " + fsv.isDrive(f[i])); 
             System.out.println("Is floppy: " + fsv.isFloppyDrive(f[i])); 
             System.out.println("Readable: " + f[i].canRead());  
             System.out.println("Writable: " + f[i].canWrite());  
             System.out.println("Total space: " + f[i].getTotalSpace()); 
             System.out.println("Usable space: " + f[i].getUsableSpace()); 
         } 
     } 
 } 

Exemplo : InetAddress , NetworkInterface

import java.net.*;
import java.io.*;
import java.applet.*;
import java.util.*;
import static java.lang.System.out;

 public class GetClientIP
 {
   
   public static  void main(String[] args) {
      try {
         InetAddress Ip =InetAddress.getLocalHost();
		 System.out.println("IP: "+Ip.getHostAddress());
		 System.out.println("HostName: "+Ip.getCanonicalHostName());
		 System.out.println("---------------------------------------------");
		 System.out.println("Lists all the network interfaces and their addresses on a machine:");
		 getInfos();
      }
      catch(Exception e) {
         e.printStackTrace();
      }
   }
   
   static void getInfos()  throws SocketException
   {
         Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
            displayInterfaceInformation(netint);
   }
   
   static void displayInterfaceInformation(NetworkInterface netint) throws SocketException 
   {
        out.printf("Display name: %s\n", netint.getDisplayName());
        out.printf("Name: %s\n", netint.getName());
		byte[] mac = netint.getHardwareAddress();  // a byte array containing the address (usually MAC) or null
        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
        for (InetAddress inetAddress : Collections.list(inetAddresses)) {
            out.printf("InetAddress: %s\n", inetAddress);
        }
        out.printf("\n");
     }
}

Exemplo : nbr de Processors

int nbProc = Runtime.getRuntime().availableProcessors();

Exemplo : Méga Octets na carta grafica

public static  int getAvailableMemory(){
    //  graphique env
   GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
   // carta grafica
   GraphicsDevice device = environment.getDefaultScreenDevice(); 
   //  Méga Octets na carta grafica
   int bytes = device.getAvailableAcceleratedMemory();
   int mbytes = bytes /1048576; 
   return mbytes;
}
2- Utiliza commands :  Runtime.getRuntime().exec(....)
    
    Ver exemplo de Daniel.F

3- Utiliza  para as autras Informações :  JNI  

Abraços !

Cordialement !

Best regards !

Olá!!!

Agradeço a atenção de todos que responderam a minha dúvida.
Estou fazendo alguns testes com os códigos postados por Daniel.F e JxtaNode. Assim que eu obtiver as respostas posto aqui para que todos possam utilizar.

Daniel.F, sobre sua dúvida andei dando uma pesquisada e verifiquei que é possível fazer o que deseja utilizando JavaScript ou Cookies. Não testei o código, mas dê uma olhada em http://www.devarticles.com/c/a/JavaScript/Advanced-JavaScript-with-Internet-Explorer-Retrieving-Networking-Configuration-Information/1/

Mais uma vez obrigado a todos,