Notifications
Clear all

Excel validando o "VOL"

15 Posts
4 Usuários
0 Reactions
3,206 Visualizações
(@pedro)
Posts: 362
Reputable Member
Topic starter
 

Boa tarde amigos!

Há alguma forma de um excel funcionar apenas nos computadores que eu autorizar?

Eu não quero por nenhum tipo de senha no arquivo, nem usuário e senha.
Gostaria apenas de um meio para que não fosse copiado e usado em outros lugares.

Vou tentar lhes explicar como funciona em um software que eu uso, que foi feito em Visual Basic, e pensei que poderia ser feito em VBA pro Excel.

No software eu tenho 5 licenças, tive que enviar para a desenvolvedora o número de "VOL" (volume) dos 5 computadores que eu usaria. Pelo que eu sei o "vol" é um número do HD, único, e a desenvolvedora tem em algum lugar a lista dos "vol" autorizados. Se eu instalo o software em outra máquina, ao abrir, ele já da uma mensagem "ESTE MICRO NÃO ESTÁ AUTORIZADO" e fecha.

Gostaria de fazer isso em VBA se for possível, mas não sei nem por onde começar.
Não achei nada na internet que apontasse na direção de algo assim... =/

Vocês sabem se é, ou não, possível? Podem me ajudar?

Também aceito outras alternativas. Desde já, obrigado!

 
Postado : 21/08/2018 3:09 pm
(@xlarruda)
Posts: 0
New Member
 

Saberia fazer isso pelo nome do usuário logado no windows. Nesse caso você insere no código os nomes de usuários windows que serão autorizados a abrir a planilha. Se isso for aceitável, você poderia pesquisar sobre:

VBA.Environ("Username")

Suponhamos que queira deixar o Usuario "Francisco.Silva" e o "Jorge.Henrique" acessarem então:

If VBA.Environ("Username") <> "francisco.silva" and VBA.Environ("Username") <>  "jorge.henrique" then
Application.Close
End if

Mas com esse número no HD não sei dizer... talvez um dos nossos colegas mais experts.

 
Postado : 21/08/2018 3:48 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!

Veja se este exemplo de código te ajuda:

Function NomeDrive(ByVal LetraDriver As String)
    Dim fso As Object
    Dim Drv As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set Drv = fso.GetDrive(LetraDriver)
    NomeDrive = Abs(Drv.SerialNumber)
End Function

Sub Teste()
    MsgBox NomeDrive("C")
End Sub

Fontes:
Bloqueio de planilha com o serial do HD
BLOQUEAR USO DE PLANILHAS VERIFICANDO O NOME DO COMPUTADOR
Excel vba aplicativo retorna o número do hd do computador

Abraço

 
Postado : 21/08/2018 9:21 pm
(@pedro)
Posts: 362
Reputable Member
Topic starter
 

Primeiramente obrigado xlarruda

A minha preocupação principal é o seguinte, como alguns arquivos que eu tenho são quase que "sistemas", são bem completos e envolveram muitas horas de desenvolvimento, e eu os atualizo a muitos anos, a minha preocupação é só que não sejam levados pra fora... =/

Essa sugestão pelo usuário, não impede de abrir o arquivo se o usuário em outro lugar for igual né?

Por exemplo, se no escritório eu tenho um usuário "Administrativo1", e alguém que sabe o funcionamento das planilhas do escritório quiser, com conhecimento básico de informática, facilmente cria um usuário no seu computador em casa "Administrativo1" e passa a ter acesso.

Mesmo que eu deixe o VBA e as Estruturas protegidas com senha, ainda vai poder ser aberto sempre que o usuário for igual, correto?

 
Postado : 22/08/2018 5:16 am
(@pedro)
Posts: 362
Reputable Member
Topic starter
 

Primeiramente obrigado JValq

A sugestão é um começo, talvez dê pra implantar a proteção que eu espero através disso.

A ideia seria deixa no VBA uma lista com os números autorizados, fazer esse "getDriver", e se for diferente dos que estão na lista, ele fecha.

Mas, para criar a lista, veja comigo:

Usando o CMD, com o comando "vol":

	C:Users|junior>vol
	O volume da unidade C não tem nome
	O Número de Série do Volume é 8E47-062C

Usando o CMD, com o comando "wmic diskdrive get serialnumber":

	C:Users|junior>wmic diskdrive get serialnumber
	SerialNumber
	WD-WCC2EFPTPT3P
	0B0E1390E607

E testando esse VBA que vocÊ sugeriu, deu a seguinte mensagem:

	1907947988

Este número é do meu HD certo? Como eu montaria uma lista?

Eu não sei consultar esse número via CMD =/

 
Postado : 22/08/2018 5:22 am
(@fcarlosc)
Posts: 0
New Member
 

Boa-tarde Pedro

Tenho uma "Function", fiz alguns testes, inseri um "InputBox" para digitar a Letra da Unidade.
No meu PC tenho 3 HDs e apenas em um, ele mostrou o "VOL" exato do HD.

Insira um módulo:


Function NumeroSerieUnidade(Optional ByVal LetraUnidad As String) As String

'Nota importante: Recomenda-se ativar a referência da biblioteca Microsoft Scripting Runtime
'Com esta função, obtemos o número de série do disco rígido (partição).
'Este número de série é gerado pelo Windows ao formatar a partição

Dim fso As Object, Drv As Object
Dim SerieUnidadDec As Long

Application.Volatile

'Criamos um objeto FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")

'Vamos atribuir a letra da unidade atual se não for especificado no argumento
If LetraUnidad <> "" Then
    Set Drv = fso.GetDrive(LetraUnidad)
Else
    Set Drv = fso.GetDrive(fso.GetDriveName(App.Path))
End If

With Drv

    'Retorna True se a unidade especificada estiver pronta e False, se não estiver.
    If .IsReady Then

        'SerialNumber Retorna o número de série decimal
        'Que é usado para identificar exclusivamente um volume de disco.
        SerieUnidadDec = Abs(.SerialNumber)

    Else

        SerieUnidadDec = -1

    End If

End With

'Convertemos para hexadecimal
SerieUnidadHex = Application.WorksheetFunction.Dec2Hex(SerieUnidadDec)
 
'Devolvemos o valor com a Function
NumeroSerieUnidade = SerieUnidadHex

'Limpando as variáveis
Set Drv = Nothing
Set fso = Nothing

End Function

Depois insira o código abaixo em "EstaPasta_de_Trabalho"

Private Sub Workbook_Open()

Dim Driver As String
Dim lin As Long

lin = 1

If Range("A1").Value = "" Then
Driver = InputBox("Digite a Letra da Unidade: ", "Driver")
Else
Exit Sub
End If

lin = Worksheets("Plan1").UsedRange.Rows.Count

With Worksheets("Plan1")
     
     .Cells(lin, 1) = Driver

End With

End Sub

Cole esse valor --> =NumeroSerieUnidade(A1) <-- na célula B1

Acho que já é um começo..!

Att,

Francisco

 
Postado : 22/08/2018 12:06 pm
(@xlarruda)
Posts: 0
New Member
 

Exato Pedro! O raciocínio é esse mesmo..

 
Postado : 22/08/2018 12:46 pm
(@pedro)
Posts: 362
Reputable Member
Topic starter
 

Boa tarde fcarlos, e demais amigos

Eu percebi que todas as sugestões são no sentido de fazer o Excel ler o serial, ou outro tipo de identificação do HD.
Todas estão me ajudando a construir a lógica, e desde já obrigado.

Mas eu sou bem limitado em VBA (cada vez descubro mais coisas que eu não sei =/)
Eu não estou entendendo e/ou não estou conseguindo concatenar os conhecimentos e as sugestões que estão sendo dadas, em uma solução.

Vou tentar me explicar o que eu quero fazer de forma mais prática...

Em algum lugar, pode ser em uma "sheet" ou dentro do próprio código do "VBA", eu vou listar as identificações autoriazadas. Se for com "Vol" (número do volume) vai ser assim por exemplo:
5CED-B85B
88EE-48DF
504E-306D
C079-A0E4
8031-3322

Eu só uso o "vol" no exemplo, porque é o que eu sei fazer no "cmd", as outras coisas que vocês falaram (serialnumber, nomedrive, etc) eu não sei como consultar - nem pra montar a lista dos 5 autorizados. Eu não consegui nem começar... É possível me ajudarem nisto?

E aí depois, feita a lista, tenho que fazer o Excel olhar pro vol / serialnumber / nomedrive, e se for um dos 5 roda normal, se não for nenhum fecha automaticamente.

Será que eu consegui explicar?

Sempre em paralelo com os pedidos de ajuda que eu faço aqui, eu vou tentando o que sugerem, testando, mudando, vendo se dá erro, etc... MAs acho que ta me faltando alguma coisa pra integrar esse conhecimento que vocês compartilham, e bolar a solução... =/

Sigo na tentativa, e seguidamente consultando aqui... Desde já obrigado!

 
Postado : 23/08/2018 12:48 pm
(@fcarlosc)
Posts: 0
New Member
 

Boa-tarde Pedro

Com certeza tem várias sugestões, uma delas seria criar um "MsgBox" no inicio da planilha perguntando se deseja inserir um novo "VOL". Se "Sim" pediria uma senha de "Admin" e depois abriria uma caixa "textbox" para cadastrar o novo "VOL". Se "Não" buscaria o nº do VOL, se estiver na lista "OK" senão "Fecha".

 
Postado : 23/08/2018 1:20 pm
(@fcarlosc)
Posts: 0
New Member
 

Boa-noite Pedro

Peguei um exemplo de "Planilha de Login" e adaptei, acho que atende uma parte do seu projeto.

Usuário: ADMIN
Senha: ADMIN

 
Postado : 23/08/2018 3:25 pm
(@fcarlosc)
Posts: 0
New Member
 

Segue arquivo...

 
Postado : 25/08/2018 7:36 am
(@pedro)
Posts: 362
Reputable Member
Topic starter
 

Bom dia fcarlosc

Com base nesse seu comentário e o exemplo que você disponibilizou eu entendi algo que eu estou falhando em explicar.

Na verdade, eu não gostaria que tivesse uma tela de login / senha, e nem a possibilidade de "inserir" novos volumes / logins / senhas.

A quetão é que, quando eu abrir o arquivo ele tem que se perguntar "onde eu estou?"
Se estou no computador "X", funciona; e
Se estiver no computador "Y", fecha.

E a maneira de eu identificar o computador "X" e "Y", não vai ser nada que eu insira nele.
Não vai ser um numero de autorização, não vai ser um login, nada deste tipo.

Esta é a parte que eu gostaria de automatizar.

Aqui no escritório eu uso um software que valida o "vol".

Ou seja, quando eu abro o software no escritório ele funciona normal, mas se eu abro em casa da uma msgbox "Este equipamento não está liberado." e fecha.

Gostaria de fazer um excel assim. Se os funcionários abrirem ele aqui no escritório funciona normal. Mas se copiarem num pen-drive pra levar pra fora não vai abrir.

Um espécie de proteção vinculada ao hardware.

No VBA eu não sei bem, mas acho que seria um "Private Sub" que executa uma vez quando abre, só com o objetivo de olhar pro vol da máquina, ver se ele é um dos que ta na lista, e funcionar/fechar, conforme o caso.

Atualmente estou tentando fazer algo tipo a sugestão dessa página: http://www.yogeshguptaonline.com/2009/0 ... kbook.html

Só que ali está pela placa mãe, e eu não consigo descobrir o serial da minha placa mãe, nem por linha de comando e nem no hardware... =/

Ta complicado, mas sigo na luta, desde já e sempre obrigado aos que estão colaborando XD

 
Postado : 30/08/2018 6:49 am
(@pedro)
Posts: 362
Reputable Member
Topic starter
 

O cósigo do link acima parece ser bem funcional, é bem curtinho, e mesmo que eu não entenda muito eu olho pra ele e vejo uma lógica que parece atender o que eu to tentando.

O problema é que no meu pc, quando que consulto o "wmic baseboard get product,Manufacturer,version,serialnumber" diz "INVALID".
Não consigo aplicar a sugestão por não saber meu serial =/

Outra que eu estou tentando, é adaptar o código sugerido pelo wagner neste outro tópico: http://www.planilhando.com.br/forum/viewtopic.php?t=9812&p=51402
Mas ainda sem sucesso =/

Sigo na luta e desde já agradeço a colaboração ^^

 
Postado : 30/08/2018 7:57 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

O problema é que no meu pc, quando que consulto o "wmic baseboard get product,Manufacturer,version,serialnumber" diz "INVALID".

Vai depender de haver sido preenchido o numero de seria da placa mae (MB), no meu note sai como "A ser preenchido pelo distribuidor"

Quanto a utilizar o Vol (numero do volume atribuido pelo S.O)
experimente
"cole as rotinas abaixo no Modulo "EstaPasta_de_trabalho"

Private Function HDSerialNumber() As String
    Dim fsObj   As Object
    Dim drv     As Object
    Set fsObj = CreateObject("Scripting.FileSystemObject")
    Set drv = fsObj.Drives("C")

    HDSerialNumber = Left(Hex(drv.SerialNumber), 4) _
        & "-" & Right(Hex(drv.SerialNumber), 4)
End Function

Private Sub verVol()
MsgBox HDSerialNumber
End Sub
Private Function MeuVolume(strVol) As Boolean
Dim intCont As Integer
Dim strMeusVolumes(4) As String 'Altere a quantidade de acordo com sua necessidade
'Inclua aqui seus volumes
strMeusVolumes(1) = "AAAA-AAAA"
strMeusVolumes(2) = "BBBB-BBBB"
strMeusVolumes(3) = "xxxx-xxxx"
strMeusVolumes(4) = "yyyy-yyyy"
'strMeusVolumes(5) = ""
'strMeusVolumes(6) = ""
'strMeusVolumes(7) = ""
'strMeusVolumes(8) = ""
'strMeusVolumes(9) = ""
'strMeusVolumes(10) = ""
'strMeusVolumes(11) = ""


For intContont = 1 To UBound(strMeusVolumes)
    If strVol = strMeusVolumes(intContont) Then
         MeuVolume = True
         Exit Function
     End If
Next intContont
    
End Function
Private Sub Workbook_Open()
    If MeuVolume(HDSerialNumber) = False Then ' Checking if current machine serial number is matching with required
        MsgBox "Não Autorizado"
        'ActiveWorkbook.Save
        'ActiveWorkbook.Close
    End If
End Sub
 
Postado : 30/08/2018 11:41 am
(@pedro)
Posts: 362
Reputable Member
Topic starter
 

Quanto a utilizar o Vol (numero do volume atribuido pelo S.O) experimente
"cole as rotinas abaixo no Modulo "EstaPasta_de_trabalho"

Bom dia,
Experimentei o código sugerido e funcionou perfeitamente, bem dizer não precisei adaptar nada, só dizer ali quais os volumes autorizados.
Muito obrigado Reinaldo!

Apesar de eu não conseguir ter aplicada as soluções anteriores perfeitamente - limitação minha, tudo isso contribuiu para eu aprender um pouco mais.

Muito obrigado a todos os outros que colaboraram também!

 
Postado : 31/08/2018 5:59 am