none
Kennnummer eines Computers RRS feed

  • Frage

  • Hallo,

    gibt es eine computerspezifische, eineindeutige Kennung ( Kennnummer ), die sich ueber Visual Basic abfragen laesst ? Ich moechte meine Software einzig auf einem Computer laufen lassen und dafuer eine Verschluesselung schreiben, die diese Kennnummer mit einbezieht. Diese Kennnummer sollte unabhaengig von aufgespielter Betriebssystemsoftware sein.

    Viele Gruesse

    Ao La Fu


    Ao La Fu
    Sonntag, 3. Juli 2011 12:28

Antworten

  • Hallo Ao La Fu,

    Ich habe es noch einmal gestest. Programm läuft einwandfrei. Da bin ich ehrlich gesagt auch ratlos.

    Gruß Ellen

    Option Strict On
    Option Infer On
    
    Imports System.Management
    Module Module1
    
      Sub Main()
        Dim driveNumber As String = GetDriveSerialNumber("C:")
        Console.WriteLine(driveNumber)
        Console.ReadKey()
    
      End Sub
      Private Function GetDriveSerialNumber(ByVal drive As String) As String
    
        Dim driveSerial As String = String.Empty
        Dim driveFixed As String = System.IO.Path.GetPathRoot(drive)
        driveFixed = Replace(driveFixed, "\", String.Empty)
    
        Using querySearch As New ManagementObjectSearcher("SELECT VolumeSerialNumber FROM Win32_LogicalDisk Where Name = '" & driveFixed & "'")
    
          Using queryCollection As ManagementObjectCollection = querySearch.Get()
    
            Dim moItem As ManagementObject
    
            For Each moItem In queryCollection
    
              driveSerial = CStr(moItem.Item("VolumeSerialNumber"))
    
              Exit For
            Next
          End Using
        End Using
        Return driveSerial
      End Function
    End Module
    

     


    Ich benutze/ I'm using VB2008 & VB2010
    • Als Antwort markiert Ao La Fu Mittwoch, 6. Juli 2011 06:53
    Dienstag, 5. Juli 2011 15:48

Alle Antworten

  • Hallo,

    nein, es gibt keine eindeutige spezifische Kennung für einen PC. Eine halbwegs eindeutige Kennung kann die MAC Adresse eines Netzwerkadapters sein. Aber auch diese ist nicht zuverlässig, da ein Rechner mehr als ein Netzwerkadapter haben kann, wie bspw. Notebooks meist bereits über zwei verfügen, für LAN und W-LAN Verbindungen, wobei die W-LAN Verbindung auch getrennt/abgeschaltet werden kann. Dazu gesellen sich dann noch virtuelle Netzwerkadapter, die auch alles andere als eindeutig sind.

     

    Imports System.Net.NetworkInformation
    
    Module Module1
    
     Sub Main()
     For Each lNetInterface As NetworkInterface In NetworkInterface.GetAllNetworkInterfaces()
      If lNetInterface.NetworkInterfaceType <> NetworkInterfaceType.Loopback AndAlso _
       lNetInterface.NetworkInterfaceType <> NetworkInterfaceType.Tunnel Then
    
      Console.WriteLine("Name:{1}{0}MAC:{2}{0}Status:{3}{0}Type:{4}{0}", _
           Environment.NewLine, _
           lNetInterface.Name, _
           BitConverter.ToString(lNetInterface.GetPhysicalAddress.GetAddressBytes()), _
           lNetInterface.OperationalStatus.ToString(), _
           lNetInterface.NetworkInterfaceType.ToString())
      End If
     Next
    
     Console.ReadKey()
     End Sub
    
    End Module
    
    

    Windows selber erstellt für die Aktivierung eine halbwegs eindeutige Kennung aus einer Vielzahl von Seriennummern und der konkreten Hardwarekonfiguration her und arbeitet mit einer gewissen Toleranz, wenn eine dieser Komponenten getauscht wurde. Ferner stellt Windows/Microsoft auch einen 24/7 Online + Telefon Support bereit, damit man seine Windows Installation auch dann noch aktivieren und weiterverwenden kann, wenn mehrere Komponenten getauscht wurden. Glaube nicht, dass Du so etwas leisten kannst.

    Vielleicht stellt ein Dongle eine bessere Alternative dar, je nachdem wie wertvoll die von Dir zu schützende Investition ist. Für einen 08/15 Medienplayer dürfte ein derartiger Schutz kaum sinnvoll sein, weder mit Dongle noch in sonst einer registrierungspflichtigen Art. Themen wie Datenschutz wären da noch, die zusätzlich zu den technischen Problemen hinzukommen.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de

    Sonntag, 3. Juli 2011 13:28
    Moderator
  • Hallo Thorsten,

    vielen Dank fuer Deine Auskunft ! Ist es aufwendig, einen Dongle in ein Visual Basic Programm zu integrieren ??? Oder besitzt gar ein einfacher USB-Stick eine eindeutige Kennung ??

    Wie wuerdest Du Deine eigene Anwendung vor ungefragter Vervielfaeltigung schuetzen ?

    Viele Gruesse

    Ao La Fu


    Ao La Fu
    Sonntag, 3. Juli 2011 14:06
  • Hi.

    Eventuell kannst du auch die CPU ID nutzen? http://www.activevb.de/rubriken/faq/faq0022.html

    Allerdings nur auch Pentium CPUS. Kann möglicherweise auch abgeschaltet werden etc.

    Es sollte kein Thema sein, einen Dongle auch von VB aus anzusprechen. Hier darf aber nicht ausser Acht gelassen werden, das mit genügender Energie dein VB Programm reverse-engineered werden kann und so eventuell auch der Schutz dahin ist. .Net Assembler ist da mit einfachen Tools leicht in Code zurückzuwandeln. Hier hilft dann - zumindest eingeschränkt - ein Code crypting tool (war früher bei VS dabei - keine Ahnung obs noch in 2010 so ist).

    Was für Stückzahlen deines Programms willst du denn verkaufen? Ein Dongle kostet auch Geld (sollte so zwischen 10-100€/Stück liegen würd ich mal schätzen) ...

    Die MAC ist sicher auch ein erster Weg um eine ID zu berechnen, mit der Du deine Lizenzschlüssel berechnen kannst. Aber - alles aufwändig - wie gesagt kann es mehr als ein Interface geben. Was passiert mit geänderter Hardware etc.

     

     


    ------------------------- I Love Windows Phone http://modernappdesign.blogspot.com/
    Sonntag, 3. Juli 2011 16:21
  • Hallo

    VB Express 2008 Kopierschutz für meine Forms Anwendung: http://social.msdn.microsoft.com/Forums/en-US/vbasicexpresseditionde/thread/ba605263-4cc2-4923-8f64-ecf57053daaf

    Username, computername und serialdrivenumber werden zu einem verschlüsseltem string verbunden, um daraus einen Freischaltcode zu generieren. Der Freischaltcode wird in einer Umgebungsvariabeln lokal gespeichert : My.Settings Object

    In meinem post gibt es eine function:

    Dim driveSerial As String = GetDriveSerialNumber("C:")

    Das Laufwerk C: ist i.d.R ein unveränderliches Hardwaremerkmal eines Computers. Einen Stick abzufragen habe ich noch nicht versucht. Versuche doch mal

    GetDriveSerialNumber("E:")

    wenn E. der Stick ist.

    Rücjmeldung erwünscht.

    schöne Grüße Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Sonntag, 3. Juli 2011 17:53
  • So habe ich auch schon mal nen Kopierschutz erstellt.

    Es ist auch möglich die Laufwerkseriennummer(die abgefragt wird) direkt in der kompilierten EXE zu ändern. D.h. ich musste die EXE einmal kompilieren und auf beliebige USB-Sticks kopieren. Dann über ein Zusatztool (eigenbau) die Serienummer Sticks in die EXE schreiben.

    Die Seriennummer wurde in der EXE an einer bestimmten Stelle verschlüsselt abgelegt. Wenn man die EXE startet, liest sie diese Stellen in sich selbst aus, entschlüsselt sie und schaut nach, ob ein Laufwerk diese Seriennummer hat. Diese Abfrage steckt in nem Modul und kann im Quellcode leicht implementiert werden. {Function CheckDongle() as Boolean}

    Im Prinzip kann man statt ner Laufwerksseriennummer ein bestimtes Datum verwenden z.B. für zeitlich begrenzte Programmausführung.

    Montag, 4. Juli 2011 11:12
  • Hallo Ellen,

    Deine Angabe, das Laufwerk C: sei i.d.R ein unveränderliches Hardwaremerkmal eines Computers, ist einfach und logisch. Ich wollte Deine Funktion GetDriveSerialNumber ausprobieren, bin aber nicht weitergekommen, da der "ManagementObjectSearcher" auf meinem Computer nicht erkannt wird und das, obwohl ich System.Management importiert habe. Was ist schief gelaufen? 

    Gruss Ao La Fu


    Ao La Fu
    Dienstag, 5. Juli 2011 09:52
  • Hallo Ao La Fu,

    du kannst die Laufwerksseriennummer auch mittels WMI auslesen.

    Versuch das mal mit dem Code von vbarchiv.net:

    http://www.vbarchiv.net/tipps/details.php?id=1364


    Please 'Mark as Answer' if I helped. This helps others who have the same problem!
    Dienstag, 5. Juli 2011 11:20
  • Hallo Ao La Fu,

    hast Du auch einen Verweis auf System.Management zu Deinem Project hinzugefügt ?


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    Dienstag, 5. Juli 2011 11:34
  • Hallo Ao La Fu,

    hast Du es hinbekommen. Die

    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Management.dll

    ist standrdmässig in einem Form Projekt nicht importiert. Das musst Du manuell tun:

    Projekt > Eigenschaften > Verweise > Hinzufügen (.NET) > DLL suchen > OK button > fertig

    Zur Kontrolle Objectbrowser (F2). Muss dann da stehen.

    schöne Grüße Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Dienstag, 5. Juli 2011 12:05
  • Hallo Ellen, hallo Hannes,

    der Verweis hat erwartungsgemaess gefehlt. Als erstes schon 'mal thanx fuer diesen Hinweis ! Leider stoppt der Debugger nun in der naechsten Zeile bei "queryCollection" ( Typ kann nicht konvertiert werden ) und danach dann natuerlich auch bei moItem,Item. Sorry, fuer diese weiteren Fragen nach den Ursachen !

    Viele Gruesse Ao La Fu


    Ao La Fu
    Dienstag, 5. Juli 2011 14:54
  • Hallo Ao La Fu,

    Ich habe es noch einmal gestest. Programm läuft einwandfrei. Da bin ich ehrlich gesagt auch ratlos.

    Gruß Ellen

    Option Strict On
    Option Infer On
    
    Imports System.Management
    Module Module1
    
      Sub Main()
        Dim driveNumber As String = GetDriveSerialNumber("C:")
        Console.WriteLine(driveNumber)
        Console.ReadKey()
    
      End Sub
      Private Function GetDriveSerialNumber(ByVal drive As String) As String
    
        Dim driveSerial As String = String.Empty
        Dim driveFixed As String = System.IO.Path.GetPathRoot(drive)
        driveFixed = Replace(driveFixed, "\", String.Empty)
    
        Using querySearch As New ManagementObjectSearcher("SELECT VolumeSerialNumber FROM Win32_LogicalDisk Where Name = '" & driveFixed & "'")
    
          Using queryCollection As ManagementObjectCollection = querySearch.Get()
    
            Dim moItem As ManagementObject
    
            For Each moItem In queryCollection
    
              driveSerial = CStr(moItem.Item("VolumeSerialNumber"))
    
              Exit For
            Next
          End Using
        End Using
        Return driveSerial
      End Function
    End Module
    

     


    Ich benutze/ I'm using VB2008 & VB2010
    • Als Antwort markiert Ao La Fu Mittwoch, 6. Juli 2011 06:53
    Dienstag, 5. Juli 2011 15:48
  • Hallo Ellen,

    ich habe Deine Function "GetDriveSerialNumber" in ein nagelneues Projekt kopiert und schon klappt alles reibungslos ! Deine Funktion liest Harddisk-, DVD-Drive- und USB-Stick Seriennummern aus. Mit dieser Funktion plus Deinen weiteren Ueberlegungen ( siehe Ellens Link : http://social.msdn.microsoft.com/Forums/en-US/vbasicexpresseditionde/thread/ba605263-4cc2-4923-8f64-ecf57053daaf ) laesst sich ein gewisser Kopierschutz gewaehrleisten. Vielen Dank fuer Deine Hilfe !

    Gruesse Ao La Fu


    Ao La Fu
    Mittwoch, 6. Juli 2011 06:51