none
Seriennummer eines Datenträgers auslesen RRS feed

  • Frage

  • Ich möchte die Seriennummer eines Datenträgers lesen. Hab da schon was, aber es liest nicht die SN von Wechselmedien. Weiterhin wird die SN als Dezimalzahl gelesen. Versuche diese in Hex zu wandeln, sodas diese mit der angezegten SN im Dos Fenster übereinstimmt sind gescheitert. Ich finde keinen Bezug.

        'Festplatten-Seriennummer auslesen
        Function GetHDDSerial(ByVal HDD_idx As Integer) As String
    
            Dim searcher As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")
    
            For Each wmi_HD As System.Management.ManagementObject In searcher.Get()
                If wmi_HD.Item("Index") = HDD_idx Then
                    ' wenn Index gefunden, Signature-Property zurckgeben
                    Return wmi_HD.Item("Signature").ToString
                End If
            Next wmi_HD
            ' Falls Index nicht gefunden, Leerstring zurckgeben
            Return ""
    
        End Function

    Grüsse an Alle die helfen können.

    Arno

    Sonntag, 28. März 2010 15:13

Antworten

  • Hallo Arno,

    der Wert aus der Eingabeforderung bezieht sich auf das logische Laufwerk -
    bekanntlich kann man eine Platte auch in mehrere aufteilen.

    Siehe Win32_LogicalDisk Class -> VolumeSerialNumber (ist ein String)

    Sollte das für Deinen Kopierschutz sein:

    Einfach den erstbesten Wert zu nehmen, könnte schnell daneben gehen.
    Generell sollte man sich nie darauf verlassen, dass die WMI Auflistungen
    immer in der gleichen Reihenfolge zurückgeliefert werden.

    Auch soll es auch heute noch Rechner mit Disketten geben (bei mir nicht).
    Und in den Auflistungen tauchen auch andere Geräte wie CDROM/USB-Laufwerke,
    Kartenleser usw. auf.
    Zuletzt kann man die Volume Serialnummer leicht anpassen kann.

    Zuverlässiger wäre die Seriennummer des physikalischen Laufwerks,
    da sie vom Hersteller vergeben wird, z. B.:
    Win32_PhysicalMedia
    -> SerialNumber
    - von denen man aber wiederum mehrere haben kann (bei mir z. B.)
    und auch alle Removable, Replaceable aussortieren sollte.

    Gruß Elmar

    Sonntag, 28. März 2010 16:08
  • Hallo Arno024,

    Schau Dir mal auch den folgenden Code an. Er bezieht sich auf physikalischen Laufwerke und nicht auf logische Laufwerke. Vielleicht kann er Dir weiterhelfen:

    Imports System.Management
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            '//Hardware Model und Type info
            Dim searcher As ManagementObjectSearcher = _
                            New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")
            For Each wmi_HD As ManagementObject In searcher.Get()
                ListBox1.Items.Add("Model:" & vbTab & wmi_HD("Model").ToString())
                ListBox1.Items.Add("Type:" & vbTab & wmi_HD("InterfaceType").ToString())
            Next wmi_HD
    
            ''//Hardware SerialNumber info
            searcher = New ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia")
            For Each wmi_HD As ManagementObject In searcher.Get()
                If wmi_HD("SerialNumber") Is Nothing Then
                    ListBox1.Items.Add("Serial No:" & vbTab & "None")
                Else
                    ListBox1.Items.Add("Serial No:" & vbTab & wmi_HD("SerialNumber").ToString())
                End If
            Next wmi_HD
    
        End Sub
    
    End Class

     

    Mit LogicalDrive kann es so sein:

     

    Shared 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

     

    Ältere Methode, Seriennummer des physikalischen Laufwerks mithilfe von GetVolumeInformation API Funktion à http://www.vb-helper.com/howto_net_get_disk_serial_number.html herausfinden.

    Introduction to WMI - http://www.emmet-gray.com/Articles/WMI_Intro.htm

     

    Grüße,

    Robert

    Montag, 29. März 2010 11:03

Alle Antworten

  • Hallo Arno,

    der Wert aus der Eingabeforderung bezieht sich auf das logische Laufwerk -
    bekanntlich kann man eine Platte auch in mehrere aufteilen.

    Siehe Win32_LogicalDisk Class -> VolumeSerialNumber (ist ein String)

    Sollte das für Deinen Kopierschutz sein:

    Einfach den erstbesten Wert zu nehmen, könnte schnell daneben gehen.
    Generell sollte man sich nie darauf verlassen, dass die WMI Auflistungen
    immer in der gleichen Reihenfolge zurückgeliefert werden.

    Auch soll es auch heute noch Rechner mit Disketten geben (bei mir nicht).
    Und in den Auflistungen tauchen auch andere Geräte wie CDROM/USB-Laufwerke,
    Kartenleser usw. auf.
    Zuletzt kann man die Volume Serialnummer leicht anpassen kann.

    Zuverlässiger wäre die Seriennummer des physikalischen Laufwerks,
    da sie vom Hersteller vergeben wird, z. B.:
    Win32_PhysicalMedia
    -> SerialNumber
    - von denen man aber wiederum mehrere haben kann (bei mir z. B.)
    und auch alle Removable, Replaceable aussortieren sollte.

    Gruß Elmar

    Sonntag, 28. März 2010 16:08
  • Hallo Arno024,

    Schau Dir mal auch den folgenden Code an. Er bezieht sich auf physikalischen Laufwerke und nicht auf logische Laufwerke. Vielleicht kann er Dir weiterhelfen:

    Imports System.Management
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            '//Hardware Model und Type info
            Dim searcher As ManagementObjectSearcher = _
                            New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")
            For Each wmi_HD As ManagementObject In searcher.Get()
                ListBox1.Items.Add("Model:" & vbTab & wmi_HD("Model").ToString())
                ListBox1.Items.Add("Type:" & vbTab & wmi_HD("InterfaceType").ToString())
            Next wmi_HD
    
            ''//Hardware SerialNumber info
            searcher = New ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia")
            For Each wmi_HD As ManagementObject In searcher.Get()
                If wmi_HD("SerialNumber") Is Nothing Then
                    ListBox1.Items.Add("Serial No:" & vbTab & "None")
                Else
                    ListBox1.Items.Add("Serial No:" & vbTab & wmi_HD("SerialNumber").ToString())
                End If
            Next wmi_HD
    
        End Sub
    
    End Class

     

    Mit LogicalDrive kann es so sein:

     

    Shared 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

     

    Ältere Methode, Seriennummer des physikalischen Laufwerks mithilfe von GetVolumeInformation API Funktion à http://www.vb-helper.com/howto_net_get_disk_serial_number.html herausfinden.

    Introduction to WMI - http://www.emmet-gray.com/Articles/WMI_Intro.htm

     

    Grüße,

    Robert

    Montag, 29. März 2010 11:03
  • Hi Robert

    Hab heute 4 Stunden probiert und gesucht (Siehe Code am Anfang von mir eingetragen). Ohne Erfolg. Kein Durchblick.

    Auch scheint es mir, als wäre ich der Einzigste, der so etwas programmieren möchte.

    Du bist meine Rettung! Hab beide Codes probiert und zum laufen gebracht.

    Beide sind die, welche ich gesuchtg habe. Danke!

    Du hast mir sehr geholfen.

    Obwohl ich schon seit 26 Jahren gelegentlich programmiere, tue ich mir doch mit der Objektorientierung sehr schwer.

    Die benutzbaren Objekte, Funkrionen, Klassen u.s.w sind so vielfältig geworden, das man schnell den Überblick verliert, und Vieles übersieht, oder nicht findet, was man brauchen kann.

    Nochmal Danke.

    Arno

    Montag, 29. März 2010 16:41
  • Hallo Arno024,

    Freut uns dass wir Dir weiter helfen könnten.

    Ich möchte mich auch an Elmar bedanken weil er uns den richtigen Weg gezeigt hat durch seinen hilfreichen Beitrag wo er die Win32_LogicalDisk Klasse und Win32_PhysicalMedia Klasse erwähnt hat. Der Rest war dann einfach J

    @Arno024: Du kannst auch hier reinschauen: Häufig gestellte Fragen zu Visual Basic .NET General. Hier gibt’s auch einen Beitrag über WMI.

    Grüße und Erfolg,

    Robert

    Dienstag, 30. März 2010 06:21
  • Hallo Robert

    Du hast recht, Elmar hat auch mit geholfen. Nur hat er mir nicht weiterhelfen können, da ich in einer anderen Liga spiele. Ich programmiere nur gelegentlich und dann auch nur für meinen Beruf die Wasseraufbereitung. Hier gibt es viel zu berechnen und auch genügend Futter um Programme zu schreiben.

    Mein Programm geht an maximal 50 Zielpersonen die warscheinlich keine Ahnung von dem haben, über das wir hier diskutieren. Ich möchte halt nicht, dass jeder mein Programm kopiert und benutzt. Den Zielpersonen ersparrt mein Programm ne Menge Arbeit. Ein einfacher Kopierschutz und die angezeigte SN von 2 Laufwerken verknüpft mit einem Benutzernamen ist in diesem Fall Kopierschutz genug.

    Danke nochmal und Danke auch an Elmar.

    Arno

    PS

    Hab noch was gefunden, was nen richtigen Kopierschutz verspricht. Muß einfach in diese Sammlung. Ist für meinen Fall aber zu aufwendig.

    http://www.vbarchiv.net/workshop/workshop_90-produktaktivierung-mit-testzeit-beschraenkung.html

    Dienstag, 30. März 2010 15:05