Newsgroup: it.comp.appl.access
Titolo: Identificare il computer in uso

Buongiorno a tutti.
Ho la necessità di identificare in modo univoco il computer sul quale gira 
un applicativo Access 2007. Devo escogitare una sorta di chiave di 
protezione che comprenda il numero identificativo del bios, il product key 
di windows (obbligatoriamente xp o vista) ed il numero univoco dell'hard 
disk sul quale è stato installato l'applicativo. La sostituzione anche di 
uno solo di questi tre componenti comporterà una nuova registrazione e 
l'acquisto di una nuova licenza d'uso.
L'infinità di pagine che trattano del WMI mi ha scoraggiato. Qualcuno mi sa 
indicare un sito dal quale poter attingere le informazioni che mi occorrono 
? Ho cercato sul sitocomune ma mi pare che il codice del bios non viene 
trattato.
Grazie
Antonio

 ha scritto nel messaggio 
news:4908463b$0$11387$5fc...@news.tiscali.it...

www.sitocomune.com
Ciao.
-- 
Sergio MAZZA 

 ha scritto nel messaggio 
news:ge9na5$q4$1...@tdi.cu.mi.it...

Mi pare che nel sitocomune si tratti solo del product key di windows e del 
numero identificativo dell'hard disk. Nessun riferimento alla motherboard o 
al bios. Lo so, sono paranoico, ma se riuscissi a trovare il modo per avere 
il codice della scheda madre sarei molto più sicuro. Comunque grazie per il 
suggerimento.
Ciao
Antonio

Private Sub Comando7_Click()
On Error GoTo Err_Comando7_Click
'Some Array of BIOS characteristics supported by the computer as
defined by the SMBIOS Reference Specification. The possible values for
this property are:
'3 - BIOS characteristics not supported
'4 - ISA is supported
'6 - EISA is supported
'7 - PCI is supported
'8 - PC Card (PCMCIA) is supported
'9 - Plug and Play is supported
'10 - APM is supported
'11 - BIOS is upgradable (flash)
'15 - Boot from CD is supported
'16 - Selectable boot is supported
'17 - BIOS ROM is socketed
'18 - Boot from PC card (PCMCIA) is supported
'32 ACPI supported
'34 AGP is supported
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root
\cimv2")
Set colBIOS = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_BIOS")
For Each objBIOS In colBIOS
 MsgBox "Build Number: " & objBIOS.BuildNumber
 MsgBox "Current Language: " & objBIOS.CurrentLanguage
 MsgBox "Installable Languages: " & objBIOS.InstallableLanguages
 MsgBox "Manufacturer: " & objBIOS.Manufacturer
 MsgBox "Name: " & objBIOS.Name
 MsgBox "Primary BIOS: " & objBIOS.PrimaryBIOS
 MsgBox "Release Date: " & objBIOS.ReleaseDate
 MsgBox "Serial Number: " & objBIOS.SerialNumber
 MsgBox "SMBIOS Version: " & objBIOS.SMBIOSBIOSVersion
 MsgBox "SMBIOS Major Version: " & objBIOS.SMBIOSMajorVersion
 MsgBox "SMBIOS Minor Version: " & objBIOS.SMBIOSMinorVersion
 MsgBox "SMBIOS Present: " & objBIOS.SMBIOSPresent
 MsgBox "Status: " & objBIOS.Status
 MsgBox "Version: " & objBIOS.Version
 'For Each intCharacteristic In objBIOS.BiosCharacteristics
 'MsgBox "BIOS Characteristics: " & intCharacteristic
 'Next
Next
'_____________________________________________________________
Const HKEY_LOCAL_MACHINE = &H80000002
strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
strValueName = "DigitalProductId"
strComputer = "."
Dim iValues()
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &
_
     strComputer & "\root\default:StdRegProv")
oReg.GetBinaryValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName,
iValues
Dim arrDPID
arrDPID = Array()
For i = 52 To 66
ReDim Preserve arrDPID(UBound(arrDPID) + 1)
arrDPID(UBound(arrDPID)) = iValues(i)
Next
' <--------------- Create an array to hold the valid characters for a
microsoft Product Key -------------------------->
Dim arrChars
arrChars = Array("B", "C", "D", "F", "G", "H", "J", "K", "M", "P",
"Q", "R", "T", "V", "W", "X", "Y", "2", "3", "4", "6", "7", "8", "9")
' <--------------- The clever bit !!! (Decrypt the base24 encoded
binary data)-------------------------->
For i = 24 To 0 Step -1
k = 0
For j = 14 To 0 Step -1
k = k * 256 Xor arrDPID(j)
arrDPID(j) = Int(k / 24)
k = k Mod 24
Next
strProductKey = arrChars(k) & strProductKey
' <------- add the "-" between the groups of 5 Char -------->
If i Mod 5 = 0 And i <> 0 Then strProductKey = "-" & strProductKey
Next
strFinalKey = strProductKey
'
' <---------- This part of the script displays operating system
Information and the license Key --------->
'
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root
\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
  ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem In colOperatingSystems
  strOS = objOperatingSystem.Caption
  strBuild = objOperatingSystem.BuildNumber
  strSerial = objOperatingSystem.SerialNumber
  strRegistered = objOperatingSystem.RegisteredUser
Next
Set wshShell = CreateObject("wscript.shell")
strPopupMsg = strOS & vbNewLine & vbNewLine
strPopupMsg = strPopupMsg & "Build Number:  " & strBuild & vbNewLine
strPopupMsg = strPopupMsg & "PID:  " & strSerial & vbNewLine &
vbNewLine
strPopupMsg = strPopupMsg & "Registered to:  " & strRegistered &
vbNewLine & vbNewLine & vbNewLine
strPopupMsg = strPopupMsg & "Your Windows Product Key is:" & vbNewLine
& vbNewLine & strFinalKey
strPopupTitle = "Microsoft Windows License Information"
wshShell.PopUp strPopupMsg, , strPopupTitle, vbCancelOnly +
vbInformation
Exit_Comando7_Click:
    Exit Sub
Err_Comando7_Click:
    MsgBox Err.Description
    Resume Exit_Comando7_Click
End Sub

 ha scritto nel messaggio 
news:1ef9834e-9aa2-4070...@f77g2000hsf.googlegroups.com...

Perfetto !!! Sei stato gentilissimo. Ora studierò un metodo per fondere i 
tre dati (bios - windows - hd), crittografare il tutto e generare una sorta 
di chiave di accesso. In questo modo un utente che volesse poter utilizzare 
l'applicazione su due computers dovrà acquistare 2 licenze d'uso.
Ancora grazie
Antonio

bhè postaci qualche tips ogni tanto
a me interessa per esempio
buon lavoro
ciao
Alex

 ha scritto nel messaggio 
news:980815b9-344a-4fa2...@y71g2000hsa.googlegroups.com...

buon lavoro
ciao
Alex
---------------  RISPOSTA  ----------------
Eccomi qua.
Mi pareva di avere trovato con l'uso del WMI il numero di serie dell' hard 
disk, ma mi sbagliavo. Cercando ancora su Internet ho trovato la seguente 
funzione:
Declare Function GetVolumeInformation Lib "kernel32.dll" Alias 
"GetVolumeInformationA" _
        (ByVal lpRootPathName As String, _
        ByVal lpVolumeNameBuffer As String, _
        ByVal nVolumeNameSize As Integer, _
        lpVolumeSerialNumber As Long, _
        lpMaximumComponentLength As Long, _
        lpFileSystemFlags As Long, _
        ByVal lpFileSystemNameBuffer As String, _
        ByVal nFileSystemNameSize As Long) _
        As Long
Con l'uso di questa e delle altre funzioni del WMI riesco ad avere i dati 
che mi servono col seguente codice:
Dim obj1 As Object, obj2 As Object, obj3 As Object
Dim SchedaMadre As String
Dim SistemaOperativo As String
Dim WindowsProductKey As String
Dim HardDiskSistema As String
Dim SerialeHD As String, SerialeHDNum As Long
Dim Risposta As Long
Dim Temp1 As String, Temp2 As String
Temp1 = String$(255, Chr$(0))
Temp2 = String$(255, Chr$(0))
Set obj1 = 
GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set obj2 = obj1.ExecQuery("SELECT * FROM Win32_BIOS")
For Each obj3 In obj2
    SchedaMadre = obj3.serialnumber
Next
Set obj2 = obj1.ExecQuery("Select * from Win32_OperatingSystem")
For Each obj3 In obj2
    WindowsProductKey = obj3.serialnumber
    SistemaOperativo = obj3.Caption
    HardDiskSistema = Left$(obj3.WindowsDirectory, 2)
Next
SerialeHD = ""
Risposta = GetVolumeInformation(HardDiskSistema, Temp1, Len(Temp1), 
SerialeHDNum, 0, 0, Temp2, Len(Temp2))
If Risposta <> True Then SerialeHD = str$(SerialeHDNum)
Debug.Print "Identificativo scheda madre: " & vbTab & SchedaMadre & vbCrLf & 
_
            "Sistema Operativo : " & vbTab & SistemaOperativo & vbCrLf & _
            "Windows Product-Key: " & vbTab & WindowsProductKey & vbCrLf & _
            "Hard Disk principale : " & vbTab & HardDiskSistema & vbCrLf & _
            "Numero seriale HD: " & vbTab & SerialeHD
Non sono sicuro che il numero seriale HD sia quello imposto dal produttore o 
se si tratta del numero assegnato al momento della formattazione. In ogni 
caso, i dati trovati mi sembrano sufficienti per calcolare una chiave 
univoca per ogni computer esistente.
Se qualcuno ha qualche suggerimento in merito...
Saluti a tutti e grazie
Antonio

Tieni conto di una cosa per niente secondaria, le Wmi non e' detto che siano 
installate e funzionanti, e basarsi sula loro disponibilita' potrebbe 
riservare brutte sorprese
Almeno un test per verificarne la disponibilita' dovrebbe essere eseguito, 
altrimenti bisogna dirottare su altre funzioni
Ciao
RobertoA

 ha scritto nel messaggio 
news:4908463b$0$11387$5fc...@news.tiscali.it...

Ho scritto abbastanza su questa tecnologia sia su questo NG che su 
www.sitocomune.com
Mi pare di aver risposto proprio a un quesito sul seriale dell'HD.
Se vuoi padroneggiare questa tecnica è indispensabile scaricare ScriptOmatic 
dal sito Microsoft:
http://www.microsoft.com/downloads/details.aspx?familyid=09dfc342-648b-4119-b7eb-783b0f7d1178&displaylang=en
richiede la validazione della licenza di windows.
Si tratta di un tool gratuito che costruisce per te gli script in vari 
linguaggi (compreso VBscript e Jscript) a partire dalle varie classi WMI.
A partire da questi script non ti sarà difficile realizzare qualsiasi 
funzione in VBA da usare con Access.
Si tratta di un tool che non dovrebbe mai mancare ad uno sviluppatore.
Ciao, Carlo 

 ha scritto nel messaggio 
news:4909aee7$1...@newsgate.x-privat.org...

Le WMI fanno parte integrante del sistema operativo Windows!
E' già tutto bello e pronto e non occorre installare nulla.
Per uno sgurdo...
http://www.dotnethell.it/articles/WMI.aspx
Ciao, Carlo 

 ha scritto nel 
messaggio news:geccuo$gpo$1...@tdi.cu.mi.it...

Sapevo di poter contare sull'esperienza del NG. Ad onor del vero, prima di 
richiedere l'aiuto di voi altri tento sempre di trovare la soluzione 
direttamente sui siti specializzati. Quest'argomento, però, mi è sembrato 
poco sviluppato, o meglio, eccessivamente sviluppato e, purtroppo, in modo 
caotico. Oltretutto, se non ho commesso qualche strafalcione nel ricopiarle, 
anche le routines del sitocomune non mi avevano dato il risultato sperato.
Grazie ancora e buon lavoro
Antonio

 
http://www.dotnethell.it/articles/WMI.aspx
Si, se parliamo di Xp, 2000, 2003
No, se parliamo di Nt, 98, 95
A questi ultimi mi riferivo, non e' raro trovare ancora delle postazioni 
Windows 98 o Nt in giro, che non vengono aggiornate "..perche' tanto vanno 
bene.."
Almeno se penso ai nostri clienti, mi vengono in mente circa una dozzina di 
postazioni di questo tipo, relegate nelle officine che fanno da 
trasferimento files con i centri di lavoro
Ciao
RobertoA

 ha scritto nel messaggio 
news:490a29da$1...@newsgate.x-privat.org...

Sì Roberto, tutte le versioni di Windows antecedenti Windows ME, hanno la 
necessità di installare le WMI.
Se a qualcuno dovesse servire può scaricare le WMI per 95/98 da qui:
http://www.microsoft.com/downloads/details.aspx?FamilyId=98A4C5BA-337B-4E92-8C18-A63847760EA5&displaylang=en
Per Windows NT lo si può fare da qui:
http://www.microsoft.com/downloads/details.aspx?FamilyID=c174cfb1-ef67-471d-9277-4c2b1014a31e&displaylang=en
C'è da dire che il nostro amico parlava di applicativo A2007.
Ciao, Carlo

> C'è da dire che il nostro amico parlava di applicativo A2007.
Perche' le procedure fatte col 2007 non girano su Windows 98 o Nt ?
Ciao
RobertoA

 ha scritto nel messaggio 
news:490a...@newsgate.x-privat.org...

Office 2007 richiede minimo Windows XP sp2.
http://office.microsoft.com/it-it/suites/HA101668651040.aspx
Ciao, Carlo 

 ha scritto nel messaggio 
news:490a1083$0$14496$5fc...@news.tiscali.it...

Ho fatto proprio bene a postare il quesito: così sono venuto a conoscenza 
del fantastico ScriptOmatic del quale ignoravo l'esistenza. Ho di che 
studiare, adesso: gli esami non finiscono mai.
Ciao
Antonio