Malandragem do cliente

Instalei um sistema para desktop em duas máquinas para um cliente… negociei com ele por duas licenças…uma para cada pc…
Hoje fui lá no estabelecimento prestar assistencia…quando cheguei lá… o cara tinha compartilhado o diretório de instalação do sistema e estava executando numas 4 máquinas…kkkk…é malandragem…tudo pra não pagar assistencia para instalação e mais duas licenças

O que gostaria de saber é o seguinte…
Tem como eu verificar no meu sistema se foi instanciado por outro computador…pra mim cortar a alegria dele?

cara uma opção é o cara fazer login apartir de uma base de dados você adiciona um campo chamado logado ai quando o usuario loga esse campo fica ativo e outro não pode acessar com o mesmo login.

caso isso não aconteça tenta pegar o numero do processador executando ou então coloca um xml ou um arquivo de configuração na maquina que sete a opção 1 caso o usuario ja esteja logado.

caso queira pegar o numero do processador para fazer a comparação faça isso.

[code]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();
}[/code]

Créditos pelo fonte heiligerstein daqui do guj

Cria uma tabela por exemplo maquina logada, se passar de dois registros na tabela, vc pode falar que a aplicação atingiu o numero máximo permitido. [=

Seria a solução mais simples, rápida e eficiente ao meu ver.

Mas me diz uma coisa, o que você fez quando viu a falcatrua? Falou pro cliente que não podia ou teve que engolir essa?

Obrigado pelas sugestões…

Atualmente no sistema eu tenho uma tabela de terminais que estão em utilização no sistema…ex terminal1 terminal2…
Então seguindo a idéias passadas eu criaria uma nova coluna nessa tabela de terminais para informar o nr do processador

SE o numero não bater…ele avisa… estaria correto…

Mas a questão seria a seguinte… no caso de o usuário abrir num outro computador pelo diretório compartilhado…essa instancia iria pegar o número do processador de qual máquina…?? da máquina que está o sistema ou da máquina que está instanciando?

Seu problema é o método de licenciamento - você teria de ter negociado uma “site license” :slight_smile:

Isto posto, você pode usar alguma coisa que veja se no máximo 2 estações estão sendo executadas simultaneamente. Quando a 3a. se logar, isso é violação da licença. Isso é mais chato que parece (sempre dá algum problema).

Seria a solução mais simples, rápida e eficiente ao meu ver.

Mas me diz uma coisa, o que você fez quando viu a falcatrua? Falou pro cliente que não podia ou teve que engolir essa?[/quote]

Cara…me passou mil coisas pela cabeça…pensei em falar…em chingar…em falar com educação…pensei no tempo que levei fazendo o sistema pra depois um cara vim e tentar me passar a perna… também pensei depois nas consequencias…ex…se eu falasse com muita “energia”…poderia até acabar perdendo o cliente…
Então resolvi deixar quieto…fazer que não vi… pois…sabe como é…as vezes a gente exaltado fala coisa que não deve… mesmo tendo a razão… E minha idéia é continuar com o cliente…

mas agora quero fazer uma trava e atualizar o sistema pela internet… pois fiz um mecanismo de auto atualização… então quando atualizar…as máquinas que estão licenciadas vão funcionar…e as outras não…he he he

Seria a solução mais simples, rápida e eficiente ao meu ver.

Mas me diz uma coisa, o que você fez quando viu a falcatrua? Falou pro cliente que não podia ou teve que engolir essa?[/quote]

Cara…me passou mil coisas pela cabeça…pensei em falar…em chingar…em falar com educação…pensei no tempo que levei fazendo o sistema pra depois um cara vim e tentar me passar a perna… também pensei depois nas consequencias…ex…se eu falasse com muita “energia”…poderia até acabar perdendo o cliente…
Então resolvi deixar quieto…fazer que não vi… pois…sabe como é…as vezes a gente exaltado fala coisa que não deve… mesmo tendo a razão… E minha idéia é continuar com o cliente…

mas agora quero fazer uma trava e atualizar o sistema pela internet… pois fiz um mecanismo de auto atualização… então quando atualizar…as máquinas que estão licenciadas vão funcionar…e as outras não…he he he[/quote]

Acho que foi melhor deixar quieto mesmo. Quando for possível, faz essa atualização mesmo.

Não teria como pegar o nome ou ip do pc que está gravado o jar do sistema originalmente e o nome ou ip do computador que está sendo instanciado?

Pergunta basica: nao tem como voce mudar a licenca? Talvez aumentando um pouco o valor e permitindo rodar em quantas maquinas quiser? Ou diferenciando licenca de execucao (qtas maquinas quiser) e assistencia (por maquina)?

Qualquer implementacao sugerida aqui provavelmente vai:

  1. te dar mais trabalho;
  2. penalizar usuarios legitimos (ex.: qdo trocarem computador/IP etc), colaborando ainda mais com item 1.

Na solução que eu dei, não irá penalizar, iria liberar apenas 2 logados por vez.

Com isso, se ele sair de uma máquina e for para outra, vai estar numa boa. [=

Na solução que eu dei, não irá penalizar, iria liberar apenas 2 logados por vez.

Com isso, se ele sair de uma máquina e for para outra, vai estar numa boa. [=[/quote]

mas como ficaria isso? pelo que eu entendi isso não impediria de ter a aplicação em duas maquinas, apenas de estar logado em duas máquinas “ao mesmo tempo”.

eu sugeriria verificar várias coisas, inclusive lógica e fisica, como id do processador, do disco, chave de registro do SO, ip, mac adress… enfim, e caso mudasse apenas uma até permite e atualiza o valor mas caso mude tudo ou quasse tudo bloqueie…

Na solução que eu dei, não irá penalizar, iria liberar apenas 2 logados por vez.

Com isso, se ele sair de uma máquina e for para outra, vai estar numa boa. [=[/quote]

mas como ficaria isso? pelo que eu entendi isso não impediria de ter a aplicação em duas maquinas, apenas de estar logado em duas máquinas “ao mesmo tempo”[/quote]
Exato. Eu sempre gosto de optar pelo mais simples.

Ele não pagou para usar em dois lugares? Deixa usar uai. Se o cara formatar o pc, muita coisa pode mudar, c ele trocar o hardware ou comprar máquinas novas… e assim vai.

Bem, mas é gosto meu. Eu entendo sua preocupação em validar tudo que é necessário e concordo com sua abordagem também. [=

Reescreva sua solução para rodar na Web. Nesse modelo de SaaS (Software as a Service) vc nunca mais terá qualquer problema de pirataria… :wink:

Já pensei seriamente nisso…e vou implementar nesse SaaS… mas para os próximos…por enquanto tenho que encontrar uma solução para isso…

[jeitinho detected!]

Bom … fiz um método assim


/**
*Se retornar true é remoto senão retorna false
**/
  public boolean verificaSeRemoto()
        String caminho = System.getProperty("user.dir");
        
        if (caminho.substring(0,2).equals("\\")){
            return true;
        }
        else if (caminho.indexOf("smb:") != -1){
           return true;
        }
        else
           return false;
}
        

fiz um teste aqui e funcionou… a idéia é verificar o caminho da instância se é remota ou não… fiz o mais simples possível
Não sei se seria o correto… aceito sugestões

Então ao iniciar o sistema eu faço a verificação

  //se for instancia remota então avisa e finaliza
     if (verificaSeRemoto()){
            JOptionPane.showMessageDialog(null,"Erro!\nObjeto instanciado remotamente!\nO sistema será finalizado!","Sistema",JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        }
        

Pode usar o endereço mac…

você pode criar um mecanismo de “licença flutuante”. assim como o Autocad da Autodesk.

o cliente pagará por licença, poderá instalar o aplicativo onde desejar e criar quantos usuário quiser - com perfis diferentes, por exemplo. mas você validará quantos usuários estão utlizando o aplicativo ao mesmo tempo.

crie um mecanismo que, ao usuário abrir o aplicativo ou tentar efetuar login, ele faça uma consulta banco de dados ou arquivo de licenças (localizado num servidor).