Bem pessoal, já fazem alguns dias… eu acabei precisando deixar esse assunto de lado pq apareceram outras prioridades. Mas eu não podia deixar de responder à vcs que tentaram me ajudar.
Então, desde já o meu muito obrigada àqueles que de alguma forma contribuiram, abaixo respondo a cada um e explico qual foi a solução adotada e pq. 
antoniopopete:
E se você criasse arquivos ocultos como forma de validação para isso?
Se existisse determinado arquivo oculto você bloqueava a instanciação(existe isso???) de outro programa, no seu main, fazendo uma verificação se o arquivo oculto existe ou não.
Ai sua lógica de segurança estaria baseada em arqauivos ocultos.
Será que isso ajudaria?
Sim, isso funcionaria… só que só funcionaria no Linux. Isso que vc descreveu (exceto pelo fato de vc mencionar o arquivo como estando oculto) é o que chamamos de FileLocking. É uma técnica muito usada que inclusive já testamos… só que ela não tem 100% de funcionamento. No Linux esse esquema funciona muito bem, porém no WinXP ele se perde e não funciona. Já vi vários artigos desencorajando o uso deste sistema, até documentos Java sobre o assunto deixam claro que o uso não é aconselhável.
Luca:
Se você não quer que ninguém renomeie, use aquela dica do JTS para pegar o nome da classe com o método Main. Ou você diz que o cara vai editar o código e renomear a classe dentro do jar?
[]s
Luca
JTS? Acho que vc quer dizer JPS!
Então, essa solução é muito boa, já testei tb. Só que esse comando só pega processos Java rodando, se eu rodasse meu sistema a partir do .jar funcionaria, mas como rodo a partir de um executável, depois que gero o executável ele deixa de ser um processo Java e por isso o JPS não funciona no meu caso.
De fato, o kra não vai editar o código e renomear a classe dentro do jar inclusive pq o kra não vai ter meu jar… hehehe
oyama:
Opinião pessoal sem argumentos técnicos: acho que esta opção por nome de arquivo não seria o ideal. Você teria que saber quais programas estão rodando para verificar se não tem um com o mesmo nome.
A opção do socket poderia ser implementado de maneira configurável, se garantisse que um usuário qualquer não pudesse alterar a porta usada. Isto poderia ser feito ou criptografando e/ou assinando o dado. Ou seja se fosse alterar a porta teria que pedir para um administrador gerar um arquivo criptografado/assinado com a porta desejada.
Outro esquema muito utilizado é o arquivo de lock. É relativamente fácil de implementar, mas pode ter problema no caso de “abendar” o programa. Neste caso, o seu programa poderia verificar se existe outro programa acessando o arquivo, se tiver é por que tem um programa rodando. Se não tiver é só apagar e criar um novo.
Bem, saber quais programas estão rodando pra verificar se já não tem um com nome igual foi a parte fácil do problema. Já tá feita há tempos…rs…
Qto a opção do socket, como eu já falei antes, eu gosto muito desta opção. Meu problema era justamente uma resistência com respeito ao fato de se eu colocasse alguma porta fixa que em um cliente já estivesse sendo usada. Então pensei em configurar, e ai veio a questão de que ai o usuário poderia entrar no sistema com uma porta, ai mudar a porta e entrar no sistema denovo. Sua idéia de criptografar ou algo assim foi boa, gostei disso, mas ao msm tempo, não nos é muito conveniente que o cliente tenha que entrar em contato conosco toda vez q ele quiser trocar a porta… Mas já adianto que foi uma solução usando sockets que acabamos decidindo, depois dos comentários sobre cada opinião do pessoal eu falo sobre a solução.
Sobre o arquivo de lock eu já comentei acima os motivos pelos quais não queremos.
rmarin:
Oras, se você só quer o nome do programa então utilize a opção do Leandro. O primeiro argumento em C é o nome do executável.
Você nem precisa comparar em C, você só captura e envia como argumento para o seu programa Java, lá sim você verifica se o nome está correto ou não e bloqueia a utilização de mais um.
–
Agora, com relação ao properties e a solução socket, você pode colocar o properties dentro do seu classpath e dentro do jar, além disso você pode usar criptografia no properties. Se isso não for suficiente, use o lauch4j e insira o jar dentro do executável.
Dependendo da porta que você colocar eu acho extremamente difícil que seu cliente já utilize essa porta.
Daí eu dúvido que alguém vai querer alterar a porta do seu socket.
–
Cá entre nós, não consigo ver por que alguém faria uma coisa dessas… Parece aquela história do Vista Starter Edition, que só deixa você abrir 3 processos diferentes…
Bom, a solução em C do Leandro é legal, mas no meu caso não posso usar, teria que ser algo em java dentro do meu próprio programa.
Qto ao properties e a solução socket, como eu já comentei acima, ela foi a escolhida, no final dou mais detalhes.
Eu consigo ver muitos motivos pra fazer o que estou fazendo. Talvez o fato de que cobramos por quantidade de licencas e o usuário tentar “burlar” e usar mais do que o que ele está pagando é uma coisa totalmente possível… Não acho que vc seja tão inoscente que não pensou nisso!
ovelha:
http://www.linhadecodigo.com.br/Artigo.aspx?id=1408
Tem uma boa solução ai, so que é em C
Ah! O bom e velho MUTEX! Eu aprendi algo sobre isso na facul… Então, mas como vc msm disse, está em C e, não sei se notou, mas ele usa a função CreateMutex da API Win32, o que no meu caso não pode ser já que tem que funcionar em Windows e em Linux tb.
JGame:
E ai Renata quer sair comigo vc é muito gata…hehehe…ai nós dicutimos
isso tomando um choppinho…hehehe
anota meu msn: [email removido]
Mas voltando
O seguinte desesenvolvi o Source para testar e deu certo ok
1- Faz o teu fonte normal
2- Apos pronto seu fonte vc vai anexar a ele uma Procedure, ou Funcao-membro ou metodo ou seja que “diabos o parta”…para fazer o servico de MagicNumber conhecido como semente (Oculto) que esta atrelado ao nome do arquivo ( codigo de caractere Unicode associado)
Esta semente tem como entranda alguns dados ccoletado da sua maquina como n-registros que criará uma estância unica e pode somente ser executado na sua maquina . A Modelo Serie De Cauch-Rieman adequa bem utlizando Variaveis de entrada (n- registo, tempo ). a Serie é necessaria para cada vez que vc executar o executavel
4- Enteda isso como codigo de Pregarga
Nao coloque no construtor(muito calculo de Pto Flutuante)
o codigo em sim do constrtor chamando o metodo
Eu fiz o fonte precarga e deu certo
5- Se vc quiser…algo mais sofisticado podemos Usar RMI-IIOP com CORBA
para usar em rede este estou adequando somente em Java que acredito que é a Plataforma que esteja usando…
Isso eu te dou 2 dias para poder eu fazer …envolve mais coisa
6- A professora mandou eu fazer algumas licoes de Geografia…mas se der tempo eu faco
7- Me adiciona no MSN para eu te passar os fontes em modo standalone
Nao quero divulgar aqui para tornar público
Não, não quero sair com vc! :?
Bem, eu não quero que meu programa rode exclusivamente em uma máquina. Já fiz isso que vc mencionou, sei como funciona, tinha um esquema simpático até em que a licença expirava de tempos em tempos e era necessária outra chave para continuar o uso, desta forma, o cliente que não pagava a mensalidade parava de usar o sistema tb.
Mas não é isso que eu quero. O kra pode ter qtos sistemas quiser instalados na máquina dele, ele pode ter o msm executável em “n” máquinas, só quero que se ele comprou 20 licenças ele use apenas 20 programas ao mesmo tempo. Ele pode ter o programa em 40 máquinas, mas ele só usa 20 ao mesmo tempo. Entendem? Se fechar um pode abrir outro em outra máquina, etc, etc… Mas não é isso tb que eu preciso verificar com essa história de tentar pegar o nome do executável. A verdade é que tenho, entre meus sistemas, 3 deles que não podem em hipótese nenhuma, rodar ao mesmo tempo na mesma máquina. Pq? Bem, motivos meus… enfim, por isso a questão inicial em que falei que o programa A, B e C não podem rodar ao mesmo tempo.
Bom, vamos deixar isso pra lá, como já disse, busco uma solução mais simples e a do socket é algo mais simples e funcional no meu caso.
E qto ao seu MSN tô fazendo questão de não anotar…
Obrigada de qq forma.
gomesrod:
Sem querer ser pessimista, acho que você entrou numa bela encrenca…
Mas enfim! Acho que para pensar melhor no assunto valeria a pena conhecer um pouco do funcionamento dessa ferramenta Jet que você citou… tem como colocar algumas informações aqui?
Aê!!! Eu tb acho gomesrod! rs…
Então, não tenho maiores informações sobre a ferramenta, o que eu tinha pra dizer sobre ela já disse… não a conheço assim a fundo.
Por fim, o que será feito (digo “será” pq eu ainda não consegui implementar, mas é bem simples, não deve haver problemas):
Bom, primeiro tentei fazer algo em que eu pegasse os processos rodando na máquina (no windows e no linux) e verificasse se já tem algo rodando que impeça de executar o programa que eu estou tentando executar. Isso funcionou perfeitamente, só que ai aconteceu um grande problema durante os testes: e se o arquivo executável for renomeado?! É, por esse motivo se tornou impossível usar a verificação de processos. Se meu programa se chama x.exe e alguém renomeia ele pra z.exe qdo eu verificar a lista de processos aparecerá (obviamente) o z.exe e não o x.exe que é o nome inicial do processo. Então tentei pegar o nome do executável para verificar durante a execução se o nome era o nome original, foi quando houve toda essa polêmica aqui e por fim chegamos a conclusão de que isso era impossível.
A idéia do FileLocking eu já expliquei pq não adotamos, é bem simples e tentadora… hehehe… mas como já descrevi acima, não funciona e os motivos tb já foram mencionados.
A idéia de criar um campo na database e verificar através dele (que foi mencionada) eu tb já pensei, mas não posso fazer isso pelo que já falei, ai por algum motivo não libera o campo na tabela e pronto, ngn mais consegue acessar o sistema.
A idéia do socket me parecia (não só a mim mas a muita gente) ser a melhor! Simples, a porta não tem como ficar presa se o sistema cair, etc, etc… tudo de bom. Meu único problema estava em especificar qual porta. Se eu deixasse uma fixa dentro do sistema corria o risco de alguém já estar usando esta porta pra alguma coisa. Se eu deixasse configurável o usuário poderia abrir o sistema uma vez, ai trocar a porta no arquivo de configuração e abrir o sistema pela segunda vez.
Bom, então pensei que teria que ser configurável msm, fixa nem pensar. Mas tinha que ser de uma forma que o usuário não pudesse “burlar” como eu já expliquei. Houve uma idéia sobre criptografar a configuração, mas não queria que ficasse dependendo de nós pra gerar essa configuração toda vez, etc…
Bom, no fim das contas encotrei uma forma de fazer isso, claro que é algo específico aqui no meu caso, mas apenas pra que aqueles que tentaram me ajudar saibam como foi resolvido.
Vejam bem que meu problema era verificar se alguns programas não eram abertos na msma máquina ao mesmo tempo. Isso pq se eles são abertos em diferentes máquinas da rede ao mesmo tempo eu já verifico, tenho um “autenticador” que faz isso usando IP da máquina, etc.
Bom, se não autenticar no meu programa da rede o sistema não abre. Eu tenho uma porta configurada pra isso, pra essa comunicação entre a estação e o servidor que roda o meu programa de autenticação. Então resolvi usar essa mesma porta pra verificar se existe mais de uma instância na msma máquina.
Veja bem, se a porta já estiver em uso, é pq já tem uma instância logada no meu autenticador, então não devo abrir o programa. Se não estiver em uso, é a primeira instância do programa que estou rodando, então posso abrir e assim que abrir ele já loga no autenticador e trava a porta.
O bom disso é que a porta é configurável, mas como é a msma porta que ele usa pra “conversar” com o autenticador o usuário não pode mudar o valor dela apenas pra uma instância, se ele mudar terá que ser pra todos, senão não autentica e nada funciona.
No fim, cheguei ao que eu queria, tenho um arquivo de configuração, a porta é configurável só que o usuário não tem como configurar diferentes portas de comunicação já que a porta é a msma que acessa ao autenticador e se essa porta não for a mesma em todas as máquinas nada funfa.
Bom, não sei se fui clara, espero que tenha conseguido explicar e agradeço muito à todos que contribuiram… 
Vlw pessoall!
[]'s