Malandragem do cliente

27 respostas
L

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?

27 Respostas

G

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.

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();
    }

Créditos pelo fonte heiligerstein daqui do guj

H

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. [=

R

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?

L

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?

E

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).

L

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?

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

R

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?

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

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

L

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?

S

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.
H

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. [=

M

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. [=

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…

H

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. [=

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”
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. [=

A

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:

L

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

P

[jeitinho detected!]

L

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

L

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);
        }
L

Pode usar o endereço mac…

W

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).

J

Tenho uma dúvida em relação a solução apresentada por alguns, de se gravar que a máquina está logada no sistema em um arquivo ou tabela do banco de dados.

Se por acaso a energia cair, a máquina travar ou algo assim, antes de ser possível atualizar a informação na base de dados que o sistema naquela máquina foi fechado. Certamente quando ele tentar entrar novamente o sistema não vai deixar ele logar.

Alguém aqui já passou por isso?

H

Jhonny Oliveira:
Tenho uma dúvida em relação a solução apresentada por alguns, de se gravar que a máquina está logada no sistema em um arquivo ou tabela do banco de dados.

Se por acaso a energia cair, a máquina travar ou algo assim, antes de ser possível atualizar a informação na base de dados que o sistema naquela máquina foi fechado. Certamente quando ele tentar entrar novamente o sistema não vai deixar ele logar.

Alguém aqui já passou por isso?

Basta colocar um tempo de última atividade.

Nome: MAQUINA_A
LAST_LOGIN: 10:34

Se passar de 5min ou sei lah, você mata o primeiro e libera o próximo. [=

G

Considerando que o acesso é remoto das máquinas, você pode estabelecer conexão por perfil do usuário.

Uma tabela chamada algo como “monitoramento_login” irá monitorá os logins que estão em uso, no momento.

A ideia de usar login flutuante, que wbdsjunior sugeriu é bem interessante, e a considero mais justa tanto para o cliente quanto para o fornecedor.

Mas voltando… nessa tabela, você registraria o login e a hora de acesso, inicialmente. E as consultas à ela seriam feitas em três situações:

1 - Quando um usuário tenta-se logar no sistema, verificava se  tinha registro com o mesmo login, caso tivesse, barrava o acesso;

2 - Quando o usuário deslogasse do sistema, apagava o registro pelo login do usuário que deslogou para liberar futuro acesso;

3 - A cada X tempo, pois evitaria locks de usuários. A cada 5 min, 2, 3, sei , uma thread ou até mesmo uma rotina de scheduler iria à tabela verifica qual foi o último acesso do usuário. Essa rotina serveria com um tick marcando a hora de atualização a cada X minutos, se houvesse alguma falha no sistema, a hora não seria marcada e quando o usuário tentasse logar novamente o sistema iria saber se foi desligado por falha ou não. A outra opção para esse caso seria criar um bootstrap, para sempre apagar os registros dessa tabela quando o servidor fosse inicializado.
W

Jhonny Oliveira:
Tenho uma dúvida em relação a solução apresentada por alguns, de se gravar que a máquina está logada no sistema em um arquivo ou tabela do banco de dados.

Se por acaso a energia cair, a máquina travar ou algo assim, antes de ser possível atualizar a informação na base de dados que o sistema naquela máquina foi fechado. Certamente quando ele tentar entrar novamente o sistema não vai deixar ele logar.

Alguém aqui já passou por isso?


você pode criar um utilitário para “matar” a sessão do usuário.

L

Cara… tem cliente que é sacana hein!
Fazer issso na cara dura. HUahuahau
Pior que ele deve ter pensado assim:
“Ele não vai reclamar porque vai ficar com medo de perder o cliente”
O tempo me ensinou que tem algumas pessoas que não vale apena termos como clientes.

vc poderia pelo menos cobrar por 4 manutenções.
Admiro sua paciencia.

L

Luiz Augusto Prado:
Cara… tem cliente que é sacana hein!
Fazer issso na cara dura. HUahuahau
Pior que ele deve ter pensado assim:
“Ele não vai reclamar porque vai ficar com medo de perder o cliente”
O tempo me ensinou que tem algumas pessoas que não vale apena termos como clientes.

vc poderia pelo menos cobrar por 4 manutenções.
Admiro sua paciencia.


He he he… e tem mesmo…

Agradeço as dezenas de idéias… vou formular uma solução seguindo as várias idéias sujeridas aqui… login flutuante ou verificando numero do mac ou numero do processador…vou ver por aqui segundo o contrato que o cara assinou…(Sim…ele assinou um contrato em que consta as licenças)… mas tenho certeza de que quando ele tentar acessar as máquinas “sem licença” … vai telefonar reclamando que o sistema só está funcionando em duas máquinas…kkkkkk…

Vou desenvolver Urgente uma solução Web para meu sistema… para os próximos clientes… e modificar os termos de licença

Mais adiante eu posto a solução que fiz , qual foi a reação do cliente … e o desfecho desta linda História he he he…

M

Estou curioso pra ver o que o cliente vai falar hahaha

L

Eu vi que tem muitas ideias bacanas aqui para contornar esse problema. Mas me ocorreu uma duvida:
Alguem sabe se é possivel inicializar uma maquina virtual (Como um virutalbox), sem que a pessoa que for instalar o software saiba que é uma maquina virtual ?
Se o programa for instalado em uma maquina virtual, acho que é possivel mudar algumas variaveis tais como o numero do processador, fazer cópias do arquivo e colocar as cópias em outras maquinas.

Se limitar o numero de conexões com o servidor de modo a ter o mesmo numero de licenças acho que seria uma boa.

Criado 21 de março de 2012
Ultima resposta 22 de mar. de 2012
Respostas 27
Participantes 15