Como evitar que o executável seja aberto em rede?
Tenho um sistema que utiliza configurações do computador onde está instalado mas alguns usuários teimam em abrí-lo através de outro computador conectado em rede local e estas configurações são alteradas.
Minha dúvida:
Como posso fazer para bloquear o acesso ao executável do programa por outro computador, exceto o qual naquele onde está instalado?
Já tentei bloquear a instância mas ela só funciona no próprio computador, permitindo a criação de nova instância e abertura em outro computador da rede.
Minha dúvida:
Como posso fazer para bloquear o acesso ao executável do programa por outro computador, exceto o qual naquele onde está instalado?
Já tentei bloquear a instância mas ela só funciona no próprio computador, permitindo a criação de nova instância e abertura em outro computador da rede.
Aristeu Sales
Curtidas 0
Respostas
Fábio Cruz
28/05/2010
Pode ter uma forma melhor, mas...
Crie uma tabela com a informação que o sistema já está em uso, mas não esqueça de limpar depois que fechar
Crie uma tabela com a informação que o sistema já está em uso, mas não esqueça de limpar depois que fechar
GOSTEI 0
Aristeu Sales
28/05/2010
Obrigado pela sua dica Facc mas, neste caso, se houver algum problema e o programa não for fechado corretamente, ele não abrirá da próxima vez porque o identificador não foi alterado.
O que eu gostaria é de algo como o verificador de instância do aplicativo em que você pode usá-lo para que não seja aberta mais de uma instância.
Mas, em último caso, sua dica servirá como paliativo.
Valeu!
GOSTEI 0
Emerson Nascimento
28/05/2010
você pode criar um arquivo ini - de preferência criptografado - e colocar ali quais computadores podem executar o sistema.
ao inicar o programa você pega o nome da máquina atual e verifica se ele esta contide no arquivo ini. se não estiver, você cancela a execução do programa.
algo assim:
no fonte do projeto:
program Project7;
uses
Forms,
Dialogs,
SysUtils,
Classes,
Windows,
Unit12 in 'Unit12.pas' ;
{$R *.res}
var
lOk: boolean;
sl: TStringList;
arq: string;
compname: array[0..MAX_COMPUTERNAME_LENGTH+1] of char;
scompname: string;
ntam: cardinal;
begin
Application.Initialize;
arq := 'sistema.ini';
ntam := MAX_COMPUTERNAME_LENGTH+1;
GetComputerName(compname, ntam);
scompname := AnsiUpperCase(Trim(compname));
lOK := False;
if FileExists(arq) then
begin
sl := TStringList.Create;
try
sl.LoadFromFile(arq);
lOK := Pos(scompname, sl.Values['Maquinas']) > 0;
if not lOk then
ShowMessage('O sistema não pode ser executado por este computador ('+scompname+')');
finally
FreeAndNil(sl);
end;
end
else
ShowMessage('Arquivo de controle [sistema.ini] não encontrado. O sistema não poderá ser executado.');
if lOK then
begin
Application.CreateForm(TForm12, Form12);
Application.Run;
end
else
Application.Terminate;
end.
no arquivo sistema.ini (você pode colocar o conteúdo criptografado):
[EXECUTAR]
Maquinas=SERVER001;CLIENT002;
no exemplo apresentado, o sistema só poderá ser executado a partir da máquina SERVER001 e da CLIENT002.
ao inicar o programa você pega o nome da máquina atual e verifica se ele esta contide no arquivo ini. se não estiver, você cancela a execução do programa.
algo assim:
no fonte do projeto:
program Project7;
uses
Forms,
Dialogs,
SysUtils,
Classes,
Windows,
Unit12 in 'Unit12.pas' ;
{$R *.res}
var
lOk: boolean;
sl: TStringList;
arq: string;
compname: array[0..MAX_COMPUTERNAME_LENGTH+1] of char;
scompname: string;
ntam: cardinal;
begin
Application.Initialize;
arq := 'sistema.ini';
ntam := MAX_COMPUTERNAME_LENGTH+1;
GetComputerName(compname, ntam);
scompname := AnsiUpperCase(Trim(compname));
lOK := False;
if FileExists(arq) then
begin
sl := TStringList.Create;
try
sl.LoadFromFile(arq);
lOK := Pos(scompname, sl.Values['Maquinas']) > 0;
if not lOk then
ShowMessage('O sistema não pode ser executado por este computador ('+scompname+')');
finally
FreeAndNil(sl);
end;
end
else
ShowMessage('Arquivo de controle [sistema.ini] não encontrado. O sistema não poderá ser executado.');
if lOK then
begin
Application.CreateForm(TForm12, Form12);
Application.Run;
end
else
Application.Terminate;
end.
no arquivo sistema.ini (você pode colocar o conteúdo criptografado):
[EXECUTAR]
Maquinas=SERVER001;CLIENT002;
no exemplo apresentado, o sistema só poderá ser executado a partir da máquina SERVER001 e da CLIENT002.
GOSTEI 0
Carlos Mazzi
28/05/2010
deu certo amigo?
GOSTEI 0
Adalberto Brasaca
28/05/2010
Se o que você quer é que o seu sistema rode somente na máquina onde está instalado, você pode fazer uma comparação do caminho onde o executável está sendo rodado. Por exemplo, se ele estiver sendo rodado na máquina onde está instalado, o caminho será provavelmente "C:". Se for de outra máquina, através de um atalho apontando para o executável, começará com "\\". É só comparar os dois e abortar a execução...
GOSTEI 0
Aristeu Sales
28/05/2010
Agradeço pelas sugestões.
Todas as comparações funcionam mas requerem a gravação de algo que identifique a localização atual do sistema para comparações.
A sugestão do Adalberto é interessante (sem a necessitar gravar o local da aplicação) mas neste caso meu código deveria comparar somente com o drive C:, que não é o padrão de instalação para alguns dos usuários de meu sistema.
Ainda não consegui chegar ao que desejava: uma funcionalidade semelhante a verificação de instância (que não necessita de gravar informações para fazer a comparação).
Mesmo assim obrigado pelas dicas.
GOSTEI 0