Problemas com o Endereço Mac(Resolvido)

Ola pessoal, estou a desenvolver um sistema, porem gostaria de barrar este sistema para qeu so algumas maquinas tivessem acesso. Minha logica é a seguinte: Tenho um software especifico para cada cliente. Quando o cliente compra o software eu pego alguma informaçao unica da maquina dele (No caso, pensei no endereço mac) e gravo dentro do software. O software destinado ao servidor so podera ser instalado na maquina em que eu obtive aquela informaçao unica, no caso o endereço mac. Em qualquer outra maquina, o endereço mac é diferente, entao nao podera ser instalado a versao do software de servidor. Nas outras maquina que o usuario quiser instalar o software, ele podera com uma restriçao, as maquina nao terao a versao de servidor, e sim a versao de cliente, mesmo assim eu pego o endereço mac da maquina cliente e guardo no banco de dados do sevidor, para quando a maquina cliente se conectar de novo ao servidor eu carregar todas as informaçoes que diz respeito aquela maquina. Ate que a logica deu tudo certo, porem descobri agora pouco uma enorme falha:
Caso eu a maquina, independente de ser servidor ou nao tenha mais de uma placa de rede, essa minha logica fura; Caso a maquina servidor nao esteja na rede, ou seja, nao pega um ip alem do localhost, minha logica fura tambem, pois eu nao consigo obter o endereço mac dela; Ou ainda se qualquer maquina estiver com a rede wireless desligada ou qualquer despositivo de rede desligado, eu tambem nao consigo pegar o endereço mac dela.

Realmente nao sei mais o que fazer, pois acabaram as ideias. Caso alguem tenha uma outra soluçao para o meu problema, por favor postem; Obrigado

E tem mais uma, é fácil de clonar o mac de outra placa.

Eu tenho dois códigos:

Um para retornar o serial do hd:

	/**
	 * Retorna o serial do HD.
	 * 
	 * @param drive
	 * @return
	 */
	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();
	}

E esse para retornar o serial da cpu:

	/**
	 * Retorna o serial da 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 = "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();
	}

Ambos são únicos porém tem como clonar também(não sei como). O problema é que esses códigos só funcionam no windows e podem falhar às vezes, mas é muito mais seguro que com o MAC.

É mais ou menos isso. Em java é praticamente impossível fazer coisas assim pois seu código pode ser fácilmente descompilado. O certo é fazer em C++ e chamar no java via JNI.

Abrçs e boa sorte!

Encontrei uma soluçao enquanto fazia a prova do enem, kkkkkkkk. Vo fazer o seguinte, a cada solicitaçao do sistema por um cliente, eu colocarei um serial diferente dentro da propria linguagem, um serial que so o cliente vai saber, no momento da instalaçao o sistem vai pedir o serial e o cliente fornecera. Porem isso tem uma falha, ja que é apenas um serial, o cliente pode seder o software e o serial para outros, porem a minha logica é a seguinte: Ha dois tipos de instalaçao (uma instalaçao para o servidor onde fica o banco, e uma para o cliente que acessa o servidor), vo fazer o seguinte, nas maquinas clientes eu coloca a instalaçao para pedir apenas um serial do cliente, ja no servidor, alem de pedir o serial do cliente, ele pede uma senha que so eu (tecnico ou responsavel pelo programa) vou ter, quando ele precisar trocar o servidor de maquina tera que solicitar a nossa ajuda para isso, com isso, caso ele ceda o serial dele e o instalador, ele ainda vai precisar da minha senha para funcionar. No caso do endereço mac, nao usarei mais ele no servidor, apenas nos computadores clientes, pois o software para a versao de cliente pode ser instalado em quantas maquinas ele quiser, apenas o servidor que se limita a apenas uma maquina. Obrigado pela ajuda

É legal porém tem esse problema de uma pessoa passar para a outra com o serial junto.
Daria para você fazer com o serial do CPU desde que todos os PCs sejam windows. Daí na hora que alguem for fazer a rede e instalar os programas nos computadores, ele intala um programa de keygen no pc de cada um que possui a mesma lógica para pegar o serial do cpu e inserir no sistema.
Acho que seria mais seguro porém não multiplataforma.

Espero que funcione e que tenha ido bem no ENEM haha…

vlw esdras_63, com a logica que eu consegui aqui da certinho, (Bom, pelo menos ate quebrarem ne, kkkkk), mas o meu software nao é tao procurado assim, no maximo vao ser vendidos so 30 versoes, pq é um software de leilao, e aqui em brasilia so tem 25 leiloeiros registrados entende, essa soluçao atende perfeitamente aos requisitos, enquanto ao numero do hd e da cpu, sem problemas, a unica dificuldade é que vo ter que instalar em linux tambem, ai o mac funciona certinho, vlw mais uma vez.

Vo postar o codigo aqui para pegar o ip e o mac tanto no linux e no windows, ainda nao descobri falhas, se alguem descobrir, por favor postem.

package utilitarios;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

import static javax.swing.JOptionPane.*;

public class PesquisaParametrosSistema 
{
	public InetAddress valorIp;
	public String nomeSistema,enderecoIp = "",enderecoMac = "";
	
	public PesquisaParametrosSistema()
	{
		nomeSistema = System.getProperty("os.name");
		showMessageDialog(null, "Seu Sistema é "+nomeSistema, "INformações do Sistema", INFORMATION_MESSAGE);
	}
	
	public String getIp()
	{
		int i = 1;
		
		if(nomeSistema.startsWith("Windows"))
		{
			try
			{
				valorIp = InetAddress.getLocalHost();
				enderecoIp = valorIp.getHostAddress();
			}
			catch(Exception erro)
			{
				erro.printStackTrace();
			}
		}
		
		if(nomeSistema.startsWith("Linux"))
		{
			try
			{
				Enumeration<NetworkInterface> enumNetWork = NetworkInterface.getNetworkInterfaces();
				while(enumNetWork.hasMoreElements())
				{
					NetworkInterface networkInterface = enumNetWork.nextElement();
					
					if(networkInterface.getName().startsWith("eth"))
					{
						Enumeration<InetAddress> ds = networkInterface.getInetAddresses();
						while(ds.hasMoreElements())
						{
							if(i != 1)
							{
								InetAddress myself = ds.nextElement();
								enderecoIp = myself.getHostAddress();
								
							}
						i++;
						}
					break;
					}
				}
			}
			catch(Exception erro)
			{
				erro.printStackTrace();
			}
		}
		
		return enderecoIp;
	}
	
	public String getMac()
	{
		int i = 1;
		
		if(nomeSistema.startsWith("Windows"))
		{
			try
			{
				valorIp = InetAddress.getLocalHost();
				NetworkInterface network = NetworkInterface.getByInetAddress(valorIp);
				byte[] valorMac = network.getHardwareAddress();
				for(i = 0; i <valorMac.length;i++)
				{
					enderecoMac += (String.format("%02X%s",valorMac[i], (i < valorMac.length - 1) ? "-" : ""));
				}
			}
			catch(Exception erro)
			{
				erro.printStackTrace();
			}
		}
		
		if(nomeSistema.startsWith("Linux"))
		{
			try
			{
				Enumeration<NetworkInterface> enumNetWork = NetworkInterface.getNetworkInterfaces();
				while(enumNetWork.hasMoreElements())
				{
					NetworkInterface networkInterface = enumNetWork.nextElement();
					
					if(networkInterface.getName().startsWith("eth"))
					{
						Enumeration<InetAddress> ds = networkInterface.getInetAddresses();
						while(ds.hasMoreElements())
						{
							if(i != 2)
							{
								for (int o = 0; o < networkInterface.getHardwareAddress().length; o++) {
			            				enderecoMac += (String.format("%02X%s", networkInterface.getHardwareAddress()[o], (o < networkInterface.getHardwareAddress().length - 1) ? "-" : ""));		
			            		 }
							break;
							}
						i++;
						}
					break;
					}
				}
			}
			catch(Exception erro)
			{
				erro.printStackTrace();
			}
		}
		
		return enderecoMac;
	}
}

Sei que muitos procuram isso, porem so da certo no windows, apos varios dias pesquisando consegui elaborar essa soluçao para windows e linux. Espero que ajude alguem.

Nossa achei que o mac e o ip pegava em qualquer sistema…

Vlw! Vou ver se implemento isso na minha biblioteca…