Newsgroup: it.comp.lang.visual-basic
Titolo: numero Harddisk o pc....o qualkosa di simile...

Salve,
PREMETTO:
è uno dei primi messaggi che mando in quanto dummies,
e mi scuso anticipatamente se la mia domanda è stata già posta, ho guardato
un po' in giro ma non l'ho vista...
CHIEDO: :-)
devo dare un mio piccolo programma ad una persona,e pensando anke a futuri
programmi mi sono posto il quesito: come proteggerlo da una divulgazione non
voluta?
Vorrei crearmi una procedura random che mi generi una stringa diversa su
ogni pc su cui installo l'applicazione...
una volta in possesso di quella stringa posso creare un codice unico...
Di cosa ho bisogno?
posso prelevare dal pc informazioni su qualkosa di univoco?
Grazie anticipatamente...
Anke commenti sull'argomento (protezione programmi) sono ben accetti :-)

[CUT]
guarda la API
GetVolumeInformation()
per avere il seriale del disco, che per inciso cambia ad ogni
formattazione e cmq, per caso, potrebbe accadere che
installi il programma a due persone che hanno lo stesso
seriale, ipotesi remota, ma non impossibile
--
bye BlackMagic
ICQ# 85485468

 seriale, ipotesi remota, ma non impossibile
Grazie per la rapidità
mi andrò a dare un occhiata alle Api
penso che vada bene quello...


La getVolumeInformation() ritorna il SN della formattazione dell'HD.
Applicare una chiave di installazione sul SN riportato da questa funzione è
facimente
aggirabile. Molto meglio leggere il vero SN del HD inserito nel firmaware
interno.
Ecco un assaggio :
'
****************************************************************************
**************
Option Explicit
' Costanti per l'individuazione della versione di OS
Private Const VER_PLATFORM_WIN32S = 0
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VER_PLATFORM_WIN32_NT = 2
' Costanti per la comunicazione con il driver IDE
Private Const DFP_RECEIVE_DRIVE_DATA = &H7C088
' Costanti per la CreateFile
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3
Private Const CREATE_NEW = 1
' Enumerazione dei comandi per la CmnGetHDData
Private Enum HDINFO
    HD_MODEL_NUMBER
    HD_SERIAL_NUMBER
    HD_FIRMWARE_REVISION
End Enum
' Struttura per l'individuazione della versione di OS
Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type
' Struttura per il campo irDriveRegs della struttura SENDCMDINPARAMS
Private Type IDEREGS
    bFeaturesReg As Byte
    bSectorCountReg As Byte
    bSectorNumberReg As Byte
    bCylLowReg As Byte
    bCylHighReg As Byte
    bDriveHeadReg As Byte
    bCommandReg As Byte
    bReserved As Byte
End Type
' Struttura per l'I/O dei comandi al driver IDE
Private Type SENDCMDINPARAMS
    cBufferSize As Long
    irDriveRegs As IDEREGS
    bDriveNumber As Byte
    bReserved(1 To 3) As Byte
    dwReserved(1 To 4) As Long
End Type
' Struttura per il campo DStatus della struttura SENDCMDOUTPARAMS
Private Type DRIVERSTATUS
    bDriveError As Byte
    bIDEStatus As Byte
    bReserved(1 To 2) As Byte
    dwReserved(1 To 2) As Long
End Type
' Struttura per l'I/O dei comandi al driver IDE
Private Type SENDCMDOUTPARAMS
    cBufferSize As Long
    DStatus As DRIVERSTATUS     ' ovvero DriverStatus
    bBuffer(1 To 512) As Byte
End Type
' Per ottenere la versione del SO
Private Declare Function GetVersionEx _
    Lib "kernel32" Alias "GetVersionExA" _
    (lpVersionInformation As OSVERSIONINFO) As Long
' Per ottenere un handle al device IDE
Private Declare Function CreateFile _
    Lib "kernel32" Alias "CreateFileA" _
    (ByVal lpFileName As String, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, _
    ByVal lpSecurityAttributes As Long, _
    ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As Long) As Long
' Per chiudere l'handle del device IDE
Private Declare Function CloseHandle _
    Lib "kernel32" _
    (ByVal hObject As Long) As Long
' Per comunicare con il driver IDE
Private Declare Function DeviceIoControl _
    Lib "kernel32" _
    (ByVal hDevice As Long, _
    ByVal dwIoControlCode As Long, _
    lpInBuffer As Any, _
    ByVal nInBufferSize As Long, _
    lpOutBuffer As Any, _
    ByVal nOutBufferSize As Long, _
    lpBytesReturned As Long, _
    ByVal lpOverlapped As Long) As Long
' Per azzerare buffer di scambio dati
Private Declare Sub ZeroMemory _
    Lib "kernel32" Alias "RtlZeroMemory" _
    (dest As Any, _
    ByVal numBytes As Long)
' Per copiare porzioni di memoria
Private Declare Sub CopyMemory _
    Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, _
    Source As Any, _
    ByVal Length As Long)
Private mvarCurrentDrive As Byte    ' Drive corrente
Private mvarPlatform As String      ' Piattaforma usata
Private Function CmnGetHDData(hdi As HDINFO) As String
' Rilevazione proprieta' IDE
    Dim bin As SENDCMDINPARAMS
    Dim bout As SENDCMDOUTPARAMS
    Dim hdh As Long
    Dim br As Long
    Dim ix As Long
    Dim hddfr As Long
    Dim hddln As Long
    Dim s As String
    Select Case hdi             ' Selezione tipo caratteristica richiesta
        Case HD_MODEL_NUMBER
            hddfr = 55          ' Posizione nel buffer del ModelNumber
            hddln = 40          ' Lunghezza nel buffer del ModelNumber
        Case HD_SERIAL_NUMBER
            hddfr = 21          ' Posizione nel buffer del SerialNumber
            hddln = 20          ' Lunghezza nel buffer del SerialNumber
        Case HD_FIRMWARE_REVISION
            hddfr = 47          ' Posizione nel buffer del FirmwareRevision
            hddln = 8           ' Lunghezza nel buffer del FirmwareRevision
        Case Else
            Err.Raise 10001, "HD Data type illegale" ' Altre informazioni
non disponibili
    End Select
    Select Case mvarPlatform
        Case "WNT"
            ' Per Win NT/2000 apertura handle al drive fisico
            hdh = CreateFile("\\.\PhysicalDrive" & mvarCurrentDrive, _
                GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ +
FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
        Case "W95", "W98"
            ' Per Win 9X apertura handle al driver SMART
            ' (in \WINDOWS\SYSTEM da spostare in \WINDOWS\SYSTEM\IOSUBSYS)
            ' che comunica con il driver IDE
            hdh = CreateFile("\\.\Smartvsd", _
                0, 0, 0, CREATE_NEW, 0, 0)
        Case Else
            ' Piattaforma non supportata (Win32S)
            Err.Raise 10002, , "S.O. errato (Solo WNT, W98 or W95)"    '
Altre piattaforme non gestite
    End Select
    ' Controllo validità handle
    If hdh = 0 Then
        Err.Raise 10003, , "Errore nella creazione del file"
    End If
    ' Azzeramento strutture per l'I/O da driver
    ZeroMemory bin, Len(bin)
    ZeroMemory bout, Len(bout)
    ' Preparazione parametri struttura di richiesta al driver
    With bin
        .bDriveNumber = mvarCurrentDrive
        .cBufferSize = 512
        With .irDriveRegs
            If (mvarCurrentDrive And 1) Then
                .bDriveHeadReg = &HB0
            Else
                .bDriveHeadReg = &HA0
            End If
            .bCommandReg = &HEC
            .bSectorCountReg = 1
            .bSectorNumberReg = 1
        End With
    End With
    ' Richiesta al driver
    DeviceIoControl hdh, DFP_RECEIVE_DRIVE_DATA, bin, Len(bin), bout,
Len(bout), br, 0
    ' Formazione stringa di risposta
    ' da buffer di uscita
    ' L'ordine dei byte e' invertito
    s = ""
    For ix = hddfr To hddfr + hddln - 1 Step 2
        If bout.bBuffer(ix + 1) = 0 Then Exit For
        s = s & Chr(bout.bBuffer(ix + 1))
        If bout.bBuffer(ix) = 0 Then Exit For
        s = s & Chr(bout.bBuffer(ix))
    Next ix
    ' Chiusura handle
    CloseHandle hdh
    ' Restituzione informazione richiesta
    CmnGetHDData = Trim(s)
End Function

Lo script di Cocale2001 è molto interessante ma non è gestibile da Win XP e
ME. Qualcuno saprebbe il codice per adattarlo anche a questi OS?
Ciao

interno.
a titolo puramente informativo, com'e' possibile raggirarla?
mmm mi sa che non avro' tante risposte :P
ciaoooo
Dade

 questi OS?
Lo *snippet* di Cocale2001 funziona anche con WinXP e ME, per provarlo
aggiungere e provare:
<code>
Private Sub Form_Load()
    'Per WNT/2000/XP
    mvarPlatform = "WNT"
    'Per W95/98/Me
    'mvarPlatform = "W95"
    MsgBox "Serial Number: " & _
            CmnGetHDData(HD_SERIAL_NUMBER) & _
            vbNewLine & "Model Number: " & _
            CmnGetHDData(HD_MODEL_NUMBER) & _
            vbNewLine & "Firmware Revision:" & _
            CmnGetHDData(HD_FIRMWARE_REVISION)
End Sub
</code>
Inutile dire che esistono sistemi migliori di una variabile da impostare "a
mano", per identificare il sistema operativo.
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org

 mano", per identificare il sistema operativo.
Tagliato "con l'accetta" dalla KB Microsoft:
'****************
Public Declare Function GetVersionExA Lib "kernel32" _
(lpVersionInformation As OSVERSIONINFO) As Integer
Public Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Public Function getVersion() As String
      Dim osinfo As OSVERSIONINFO
      Dim retvalue As Integer
      osinfo.dwOSVersionInfoSize = 148
      osinfo.szCSDVersion = Space$(128)
      retvalue = GetVersionExA(osinfo)
      With osinfo
            Select Case .dwPlatformId
                  Case 1
                        Select Case .dwMinorVersion
                              Case 0
                                    getVersion = "Windows 95"
                              Case 10
                                    getVersion = "Windows 98"
                              Case 90
                                    getVersion = "Windows Millennium"
                        End Select
                  Case 2
                        Select Case .dwMajorVersion
                              Case 3
                                    getVersion = "Windows NT 3.51"
                              Case 4
                                    getVersion = "Windows NT 4.0"
                              Case 5
                                    If .dwMinorVersion = 0 Then
                                          getVersion = "Windows 2000"
                                    Else
                                          getVersion = "Windows XP"
                                    End If
                        End Select
                  Case Else
                        getVersion = "Failed"
            End Select
      End With
End Function
'****************
Bye, G.

Il frammeto di codice postato non è altro che un metodo di una classe che ho
fatto
per ottenere le info dall' HD. Chi è interessato puo farne richiesta al
sottoscritto
inviando una email a 
cocal...@yahoo.it
Saluti

Non so come fare ....

 ha scritto nel messaggio
news:b06oje$8b3$1...@grillo.cs.interbusiness.it...
