Em primeiro lugar devo agradecer a Leonardo Machado, quem tanto me ajudou sem pedir nada em troca(Valeu Leo!) Claro que muito aprendi neste fórum sem o qual não poderia ter sabido o pouco que sei sem a ajuda dos gurus do FW.
Function SerialProtect(Criador)
// Vem de...
// ACTIVATE WINDOW oWnd MAXIMIZED;
// ON INIT(IF(Criador#'12081952', Valida_Senha('Entrada ao Sistema', '1', .T.), SerialProtect(Criador)))
// Protegendo meu programa...
// CRIADOR es un parámetro que utilizo quando instalo un programa por primera vez, abro uma ventana al DOS y
// digito el nombre del ejecutable espacio y 12081952, claro que es la fecha de mi cumpleaños(cosa de viejo,
// para no olvidarme!).
// Pueden crear um Keygen que haga esto, quedaria mas profesional y despues inutilizarlo com Ferase o limitando la // fecha. mas abajo van entender la importancia desta variable que sirve para gravar de manera encriptada el UUID // da placa madre en la base de datos para posteriormente comparar el mismo. Caso la placa madre sea antigua y no // tenha UUID, tomo el numero de serie del HD.
//-----------------------------------------------------------
local oLoc := CreateObject( "wbemScripting.SwbemLocator" )
local oSrv := oLoc:ConnectServer(,"root\cimv2")
local aDrives := oSrv:ExecQuery( "SELECT * FROM Win32_ComputerSystemProduct" )
local oDrive, cSerial := ''
Local aData := {}
Local oMac, oDlgSerial, oSerial1, oSerial2
Local cMac := Space(10), cSerial1 := Space(64), cSerial2 := Space(64)
DEFINE BRUSH oBrush Filename "Image\stone.bmp"
DEFINE ICON oIcon Resource "KEYS.ICO"
FOR Each oDrive in aDrives
AADD( aData, oDrive:UUID )
Next
For nAt := 1 to Len( aData )
cSerial += Upper( AllTrim( cStr( aData[nAt] ) ) )
Next nAt
cMac := NEWPAR->MAC
IF EMPTY(cSerial) // Como la placa es antigua no tiene UUID, entonces tomamos el serial del HD
cSerial := nSerialHD('C:')
IF Valtype(cSerial) == 'N'
cSerial := Str(cSerial)
ENDIF
ENDIF
cSerial1 := alltrim(cSerial)
IF Criador == '12081952' //Puedem mandar un regalo en este dia!!!
DEFINE DIALOG oDlgSerial RESOURCE "SERIAL";
ICON oIcon;
BRUSH oBrush
REDEFINE VGET oSerial1 Var cSerial1 ID 101 OF oDlgSerial WHEN .F. VISTA // Uso Vget de Vagner Wirts es mais bonito (estoy hablando del Get)
REDEFINE VGET oMac Var cMac ID 103 OF oDlgSerial PICTURE '9999999999'
REDEFINE BUTTON oBtnOK ID 10 OF oDlgSerial;
ACTION (Check_Serial(cSerial1, cMac, Criador, oDlgSerial))
REDEFINE BUTTON oBtnCANCEL ID 20 OF oDlgSerial Transparent;
ACTION (oDlgSerial:End(), oWnd:End())
ACTIVATE DIALOG oDlgSerial Centered
ENDIF
Return (cSerial)
*********************************************************
Static Function Check_Serial(cSerial, cMac, Criador, oDlgSerial)
IF Criador == '12081952'
NEWPAR->( net_lock( .t. ) )
NEWPAR->SERIAL := Alltrim(Encode(cSerial)) Nro de serie, UUID o Serial del HD
NEWPAR->MAC := cMac //Nro de maquina
NEWPAR->(dbunlock())
oDlgSerial:End()
oWnd:End()
ENDIF
Return
**********************************************************************
///////////////////////////////////////////////////////////////////////////////
// encode() NOVA VERSAO 06/09/2000 //
///////////////////////////////////////////////////////////////////////////////
Function encode(p_str)
Local m_char := '', m_outstr := '', m_cont := 0, m_aux := ''
IF Valtype( p_str ) # 'C'
Return( p_str )
ENDIF
//
// rotina para encriptar
//
for m_cont := 0 to len(p_str) - 1
m_aux += substr(p_str,len(p_str)-m_cont,1)
m_outstr += chr( asc(substr(m_aux,m_cont+1,1)) + m_cont * 2 + 127 )
next
return m_outstr
///////////////////////////////////////////////////////////////////////////////
// decode() NOVA VERSAO !!! 06/09/2000 //
///////////////////////////////////////////////////////////////////////////////
function decode(p_str)
local m_char := '', m_outstr := '', m_cont := 0, m_aux := ''
//
// rotina para desencriptar
//
for m_cont := 0 to len(p_str) - 1
m_aux += chr( asc(substr(p_str,m_cont+1,1)) - m_cont * 2 - 127 )
next
for m_cont := 0 to len(m_aux) - 1
m_outstr += substr(m_aux,len(m_aux)-m_cont,1)
next
return m_outstr
******************************************************************************
Function Check_Senha(vCod, vSenha, oDlg1, entrada)
Local Largo := 8, habilita := .f.
IF Empty(Entrada)
Entrada := .F.
ELSE
xSerial := SerialProtect()
IF EMPTY(xSerial)
xSerial := nSerialHD('C:\')
ENDIF
IF Valtype(xSerial) == 'N'
xSerial := Str(xSerial)
ENDIF
acSerial := Alltrim(Decode(NEWPAR->SERIAL))
IF ALLTRIM(xSerial) # ALLTRIM(acSerial) .or. Empty(acSerial)
lSair := .T.
oDlg1:End()
MsgStop(OemToAnsi('Este computador nao possui licenca de uso!' + CRLF + 'Ligue para (51)xxxx-xxxx para adquirir uma'))
oWnd:End()
ENDIF
ENDIF
IF Sequencia > 3
lSair := .T.
oDlg1:End()
oWnd:end()
ENDIF
IF vCod == 0 .AND. Empty(vSenha)
IF Entrada == .T.
lSair := .T.
oDlg1:End()
oWnd:end()
ENDIF
ENDIF
IF empty(vSenha)
MsgInfo(OemToAnsi('Voce nao digitou a Senha'))
oDlg1:Setfocus()
oSenha:Setfocus()
oSenha:Refresh()
Return(habilita)
ENDIF
IF vCod == 0
MsgInfo(OemToAnsi('Voce nÆo digitou o C¢digo'))
oDlg1:Setfocus()
oCod:Setfocus()
oCod:Refresh()
Return(habilita)
ENDIF
IF LEN( vSenha ) # largo
cDif := ( largo - LEN( vSenha ) )
vSenha := vSenha + space( cDif )
ENDIF
vSenha := upper( vSenha )
NEWFUN->( dbsetorder(1) )
NEWFUN->( dbseek( vSenha ) )
IF NEWFUN->( FOUND() )
IF NEWFUN->COD == vCod
lSair := .T.
oDlg1:End()
IF TIME() < '12:00'
MsgWait("Bom dia " + pripalavra(NEWFUN->NOM) + ', ' + "Seu acesso esta liberado", "Bem Vindo",2)
ENDIF
IF TIME() > '12:00' .AND. TIME() <'19:00'
MsgWait("Boa Tarde " + alltrim(pripalavra(NEWFUN->NOM)) + ', ' + "Seu acesso esta liberado","Bem Vindo",2)
ENDIF
IF TIME() > '19:01' .AND. TIME() < '23:59'
MsgWait("Boa Noite " + alltrim(pripalavra(NEWFUN->NOM)) + ', ' + "Seu acesso esta liberado","Bem Vindo",2)
ENDIF
Return lSair
ENDIF
ENDIF
IF NEWFUN->( FOUND() )
IF NEWFUN->COD # vCod
msgstop(OemToAnsi('O C¢digo digitado nÆo confere com a senha,') + CRLF + 'a entrada ao sistema foi NEGADA' +;
CRLF + 'Tentativa Nro: ' + ALLTRIM(STR(SEQUENCIA)))
oDlg1:Setfocus()
vSenha := Space(8)
oSenha:Setfocus()
oSenha:Refresh()
habilita := .f.
sequencia++
return habilita
ENDIF
ELSE
MsgStop(OemToAnsi('A Senha digitada nÆo existe') + CRLF + 'Tentativa Nro: ' + ALLTRIM(STR(SEQUENCIA)))
oDlg1:Setfocus()
vSenha := Space(8)
oSenha:Setfocus()
oSenha:Refresh()
sequencia++
Return(habilita)
ENDIF
RETURN