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…