FireBird ID interno instalacao
gostaria de saber se o firebird gera algum id interno tipo a cada instalação do servidor, estou criando uma rotina de validação de dados para um sistema de automação comercial que possuo em delphi/firebird 2.1 no caso esta rotina teria que pegar esta informação dentro da base de dados tipo com um select e o cliente me passaria este codigo, dai eu geraria uma contrasenha utilizando esta informação, o sistema teria que a cada acesso comparar o que esta gravado com o código que foi passado, caso ambos nao sejam iguais no momento do logon ele já abortaria o acesso, (isso quer dizer que a base de dados foi copiada pra outra maquina e eu nao estou sabendo) no caso a minha licensa é por servidor e nao por maquina caso contrario poderia optar por alguma solucao tipo rdacesso ou coisa parecida, tambem serviria uma rotina onde o firebird pegue o serial do HD mas dai teria que ser o próprio banco de dados extrair essa informaçao.
Mjcramos
Curtidas 0
Respostas
Afarias
25/09/2009
|gostaria de saber se o firebird gera algum id interno tipo a cada
|instalação do servidor,
Não
|estou criando uma rotina de validação de dados para um sistema de
|automação comercial que possuo em delphi/firebird 2.1 no caso esta
|rotina teria que pegar esta informação dentro da base de dados tipo com
|um select e o cliente me passaria este codigo, dai eu geraria uma
|contrasenha utilizando esta informação, o sistema teria que a cada
|acesso comparar o que esta gravado com o código que foi passado, caso
|ambos nao sejam iguais no momento do logon ele já abortaria o acesso,
|(isso quer dizer que a base de dados foi copiada pra outra maquina e eu
|nao estou sabendo) no caso a minha licensa é por servidor e nao por
|maquina caso contrario poderia optar por alguma solucao tipo rdacesso
Vc pode implementar um sistema de licenciamento central
|tambem serviria uma rotina onde o firebird pegue o serial do HD mas dai
|teria que ser o próprio banco de dados extrair essa informaçao.
Isto é possível com uma UDF
T+
|instalação do servidor,
Não
|estou criando uma rotina de validação de dados para um sistema de
|automação comercial que possuo em delphi/firebird 2.1 no caso esta
|rotina teria que pegar esta informação dentro da base de dados tipo com
|um select e o cliente me passaria este codigo, dai eu geraria uma
|contrasenha utilizando esta informação, o sistema teria que a cada
|acesso comparar o que esta gravado com o código que foi passado, caso
|ambos nao sejam iguais no momento do logon ele já abortaria o acesso,
|(isso quer dizer que a base de dados foi copiada pra outra maquina e eu
|nao estou sabendo) no caso a minha licensa é por servidor e nao por
|maquina caso contrario poderia optar por alguma solucao tipo rdacesso
Vc pode implementar um sistema de licenciamento central
|tambem serviria uma rotina onde o firebird pegue o serial do HD mas dai
|teria que ser o próprio banco de dados extrair essa informaçao.
Isto é possível com uma UDF
T+
GOSTEI 0
Mjcramos
25/09/2009
sobre a udf eu ate tentei fazer uma para pegar o serial pelo hd, estou postando o codigo da mesma ai abaixo, no caso ela pegaria o serial do disco e retornaria em um select, so que nao sei o que fiz errado no codigo pois a ideia nao deu certo, sei que da pra inserir codigos em linguagem C e colocar numa dll, este codigo ai abaixo é da dll
library VolUDF;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library´s USES clause AND your project´s (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
ShareMem,
Windows,
SysUtils,
Classes;
//Implementação
Function VOLINFO : Integer; stdcall;
var
Serial: PDWORD;
Volume: PChar;
FSSysFlags,ComponentLen:DWord;
FSBuf:PChar;
begin
Result := 3;
try
GetMem(Volume, MAX_PATH);
GetMem(FSBuf, MAX_PATH);
GetMem(Serial, MAX_PATH);
GetVolumeInformation(nil, Volume, MAX_PATH, Serial,
ComponentLen, FSSysFlags, FSBuf, MAX_PATH);
Result := Serial^;
except
Result := 2;
end;
end;
{$R *.res}
// funcoes exportadas
exports
VOLINFO;
begin
end.
library VolUDF;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library´s USES clause AND your project´s (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
ShareMem,
Windows,
SysUtils,
Classes;
//Implementação
Function VOLINFO : Integer; stdcall;
var
Serial: PDWORD;
Volume: PChar;
FSSysFlags,ComponentLen:DWord;
FSBuf:PChar;
begin
Result := 3;
try
GetMem(Volume, MAX_PATH);
GetMem(FSBuf, MAX_PATH);
GetMem(Serial, MAX_PATH);
GetVolumeInformation(nil, Volume, MAX_PATH, Serial,
ComponentLen, FSSysFlags, FSBuf, MAX_PATH);
Result := Serial^;
except
Result := 2;
end;
end;
{$R *.res}
// funcoes exportadas
exports
VOLINFO;
begin
end.
GOSTEI 0
Afarias
25/09/2009
Criar uma UDF não é simplesmente criar uma DLL. Vc deve tomar conhecimento de algumas questões específicas que uma DLL deve ter para rodar bem o FB.
Outra coisa, se vc programar uma UDF em Delphi, é bom q faça compatível com algum compilador Pascal para Linux (ex: FPC) ou sua solução vai funcionar apenas para servidores Windows. Sem contar q o Delphi não possui compilador 64 bits, de forma que sua solução só vai funcionar para FB 32bit.
Outra coisa q existem direrenças entre UDFs para FB antigo (pré-V2) e atual quanto a como lidar com valores NULL.
|uses
|ShareMem,
ShareMem não serve de nada aqui.
Se for alocar memória compartilhada com o Firebird (resultados varchar declarado com free it por exemplo) vc tem q alocar a memória usando o mesmo gerenciador de memória que o FB foi compilado.
Vc pode usar [b:c04c58ffe2]ib_util_malloc()[/b:c04c58ffe2] para isso OU (msvcrt) [b:c04c58ffe2]malloc[/b:c04c58ffe2] -- (apenas para Windows)
|Function VOLINFO : Integer; stdcall;
Hummm... acredito que o correto aqui é [b:c04c58ffe2]cdecl[/b:c04c58ffe2] e não stdcall
|GetMem(Serial, MAX_PATH);
|{...}
|Result := Serial^;
Como disse, aqui vc *tem* q usar ib_util_malloc ou malloc para alocar memória compartilhada com o FB
Se for realmente partir para esta solução, sugiro que dê uma lida em material sobre como programar UDFs para Firebird ou simplesmente menos estude um código fonte exemplo em Delphi/FPC
T+
Outra coisa, se vc programar uma UDF em Delphi, é bom q faça compatível com algum compilador Pascal para Linux (ex: FPC) ou sua solução vai funcionar apenas para servidores Windows. Sem contar q o Delphi não possui compilador 64 bits, de forma que sua solução só vai funcionar para FB 32bit.
Outra coisa q existem direrenças entre UDFs para FB antigo (pré-V2) e atual quanto a como lidar com valores NULL.
|uses
|ShareMem,
ShareMem não serve de nada aqui.
Se for alocar memória compartilhada com o Firebird (resultados varchar declarado com free it por exemplo) vc tem q alocar a memória usando o mesmo gerenciador de memória que o FB foi compilado.
Vc pode usar [b:c04c58ffe2]ib_util_malloc()[/b:c04c58ffe2] para isso OU (msvcrt) [b:c04c58ffe2]malloc[/b:c04c58ffe2] -- (apenas para Windows)
|Function VOLINFO : Integer; stdcall;
Hummm... acredito que o correto aqui é [b:c04c58ffe2]cdecl[/b:c04c58ffe2] e não stdcall
|GetMem(Serial, MAX_PATH);
|{...}
|Result := Serial^;
Como disse, aqui vc *tem* q usar ib_util_malloc ou malloc para alocar memória compartilhada com o FB
Se for realmente partir para esta solução, sugiro que dê uma lida em material sobre como programar UDFs para Firebird ou simplesmente menos estude um código fonte exemplo em Delphi/FPC
T+
GOSTEI 0
Afarias
25/09/2009
Aproveitando, vou fazer uma sugestão aqui...
...Em lugar de usar o ´id´ do HDD vc pode usar o ´id´ da placa de rede do servidor??
Pq ai neste caso, vc pude usar 2 funções da FreeAdhocUDF para obter esta informação:
F_UUID1MAC -- retorna um UUID baseado na NIC e data/hora
F_UUID1MACMAC -- permite vc extrair apenas o ´id´ da NIC a partir do resultado da função anterior
ou seja, vc poderia ter algo assim:
select F_UUID1MACMAC(F_UUID1MAC()) from rdb$database;
q retornaria um ´id único´ relacionado a NIC do servidor
T+
...Em lugar de usar o ´id´ do HDD vc pode usar o ´id´ da placa de rede do servidor??
Pq ai neste caso, vc pude usar 2 funções da FreeAdhocUDF para obter esta informação:
F_UUID1MAC -- retorna um UUID baseado na NIC e data/hora
F_UUID1MACMAC -- permite vc extrair apenas o ´id´ da NIC a partir do resultado da função anterior
ou seja, vc poderia ter algo assim:
select F_UUID1MACMAC(F_UUID1MAC()) from rdb$database;
q retornaria um ´id único´ relacionado a NIC do servidor
T+
GOSTEI 0
Mjcramos
25/09/2009
Na mosca, era justamente isso que estava precisando, a partir de agora FreeAdhocUDF faz parte do meu projeto, muito obrigado amigao
GOSTEI 0
Maxymus
25/09/2009
Olá pessoal, caso vocês consigam implementar essa função, poderia postar aqui nesse tópico como se utiliza essa função? .. não sei como implementá-la!!
Obrigado!!
meu email : mcor.mesquita@gmail.com
Obrigado!!
meu email : mcor.mesquita@gmail.com
GOSTEI 0
Mjcramos
25/09/2009
voce tem que baixar a FreeAdhocUDF nela vai vir os scripts para declarar as funcoes da udf dentro do seu banco, é so rodar ela, colocar a udf dentro da pasta de udfs do firebird e ja ta pronto, quando vc executa o select ele vai retornar o id da placa de rede do servidor, de qualquer estacao de trabalho que estiver conectada no seu banco de dados,
GOSTEI 0