Amigos do forum estou tentando implementar esse código abaixo para dá mais segurança ao aplicativo e fiz tudo corretamente como foi descrito, só que quando executo o banco que eu coloco a senha, aparece a mensagem "erro de conversão de dados"
Muito simples este exemplo, para usar no seu aplicativo , copie o módulo BasNumSerie e a tabela Hd
para seu banco de dados e no evento open do primeiro formulário aberto pelo seu banco de dados chame
a função assim: Call leHD ("C:\").
Criar tabela HD
Campo "NumSerieHd" Indexado (Duplicação não autorizada)
Ao Abrir
Call leHD("C:\")
***********Módulo BasNumSerie*******************
Option Compare Database
Option Explicit
Private Declare Function GetVolumeInformation Lib "kernel32" _
Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, _
lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, _
lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, _
ByVal nFileSystemNameSize As Long) As Long
Public Function DriveSerialNumber(strDrive As String) As String
'Para obter o numero de serie do HD
'Na janela imediata digite: ?DriveSerialNumber("c")
Dim x As Long, lngSerialNum As Long
Dim strRoot As String
strRoot = Left$(strDrive, 1) & ":\"
x = GetVolumeInformation(strRoot, "", 255, lngSerialNum, 0, 0, "", 255)
DriveSerialNumber = Hex$(lngSerialNum)
End Function
Public Function leHD(strHd As String)
'Para proteger o sitema contra cópia
'Carlos Moura
Dim DB As Database, rst As Recordset, strSenha As String
Dim intValor As Integer
On Error GoTo Sai
Set DB = CurrentDb
Set rst = DB.OpenRecordset("HD")
'se não há registro na tabela, adiciona
If rst.EOF Then
'Para adicionar o registro do HD solicita uma senha interna
strSenha = InputBox("Entre com a senha!", "Liberando Sistema")
'teste binário senha digitada e senha interna
'troque a senha interna para uma mais segura
intValor = InStr(1, strSenha, "cM123", 0)
'senha confere, então libera
If intValor = 1 Then
rst.AddNew
'encripta o número do hd antes de salvar na tabela
rst!NumSerieHd = EncryptText(DriveSerialNumber(strHd))
rst.Update
Else
MsgBox "Você não tem permissão para usar este programa"
DoCmd.Quit
End If
ElseIf DecryptText(rst!NumSerieHd) <> DriveSerialNumber(strHd) Then
MsgBox "Você não tem permissão para usar este programa"
DoCmd.Quit
End If
rst.Close
Set DB = Nothing
Exit Function
Sai:
MsgBox Err.Description, vbCritical, "Fechando Programa"
DoCmd.Quit
End Function
'Encripta a senha digitada
Function EncryptText(ByVal Source As String) As String
Dim Dest As String, i As Integer, L As Integer
Dest = Source
L = Len(Source) + 1
For i = 1 To Len(Dest)
Mid$(Dest, i, 1) = Chr$((270 + i - Asc(Mid$(Source, L - i, 1))) And 255)
Next i
EncryptText = Dest
End Function
'Decripta a senha para forma normal
Function DecryptText(ByVal Source As String) As String
Dim Dest As String, i As Integer, L As Integer
Dest = Source
L = Len(Source) + 1
For i = 1 To Len(Dest)
Mid$(Dest, L - i, 1) = Chr$((270 + i - Asc(Mid$(Source, i, 1))) And 255)
Next i
DecryptText = Dest
End Function
Gostaria de saber porque está ocorrendo isso
Muito simples este exemplo, para usar no seu aplicativo , copie o módulo BasNumSerie e a tabela Hd
para seu banco de dados e no evento open do primeiro formulário aberto pelo seu banco de dados chame
a função assim: Call leHD ("C:\").
Criar tabela HD
Campo "NumSerieHd" Indexado (Duplicação não autorizada)
Ao Abrir
Call leHD("C:\")
***********Módulo BasNumSerie*******************
Option Compare Database
Option Explicit
Private Declare Function GetVolumeInformation Lib "kernel32" _
Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, _
lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, _
lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, _
ByVal nFileSystemNameSize As Long) As Long
Public Function DriveSerialNumber(strDrive As String) As String
'Para obter o numero de serie do HD
'Na janela imediata digite: ?DriveSerialNumber("c")
Dim x As Long, lngSerialNum As Long
Dim strRoot As String
strRoot = Left$(strDrive, 1) & ":\"
x = GetVolumeInformation(strRoot, "", 255, lngSerialNum, 0, 0, "", 255)
DriveSerialNumber = Hex$(lngSerialNum)
End Function
Public Function leHD(strHd As String)
'Para proteger o sitema contra cópia
'Carlos Moura
Dim DB As Database, rst As Recordset, strSenha As String
Dim intValor As Integer
On Error GoTo Sai
Set DB = CurrentDb
Set rst = DB.OpenRecordset("HD")
'se não há registro na tabela, adiciona
If rst.EOF Then
'Para adicionar o registro do HD solicita uma senha interna
strSenha = InputBox("Entre com a senha!", "Liberando Sistema")
'teste binário senha digitada e senha interna
'troque a senha interna para uma mais segura
intValor = InStr(1, strSenha, "cM123", 0)
'senha confere, então libera
If intValor = 1 Then
rst.AddNew
'encripta o número do hd antes de salvar na tabela
rst!NumSerieHd = EncryptText(DriveSerialNumber(strHd))
rst.Update
Else
MsgBox "Você não tem permissão para usar este programa"
DoCmd.Quit
End If
ElseIf DecryptText(rst!NumSerieHd) <> DriveSerialNumber(strHd) Then
MsgBox "Você não tem permissão para usar este programa"
DoCmd.Quit
End If
rst.Close
Set DB = Nothing
Exit Function
Sai:
MsgBox Err.Description, vbCritical, "Fechando Programa"
DoCmd.Quit
End Function
'Encripta a senha digitada
Function EncryptText(ByVal Source As String) As String
Dim Dest As String, i As Integer, L As Integer
Dest = Source
L = Len(Source) + 1
For i = 1 To Len(Dest)
Mid$(Dest, i, 1) = Chr$((270 + i - Asc(Mid$(Source, L - i, 1))) And 255)
Next i
EncryptText = Dest
End Function
'Decripta a senha para forma normal
Function DecryptText(ByVal Source As String) As String
Dim Dest As String, i As Integer, L As Integer
Dest = Source
L = Len(Source) + 1
For i = 1 To Len(Dest)
Mid$(Dest, L - i, 1) = Chr$((270 + i - Asc(Mid$(Source, i, 1))) And 255)
Next i
DecryptText = Dest
End Function
Gostaria de saber porque está ocorrendo isso