2009-07-24 6 views
4

Ich möchte die festverdrahtete Seriennummer von der Festplatte erhalten, aber nicht mit WMI. Ich habe versucht, WMI-Code zu verwenden, und es funktioniert auf meinem Computer nicht sicher. Gibt es in .NET eine Alternative, um die Seriennummer einer physischen Festplatte zu finden?Wie kann ich die Seriennummer des Festplattengeräts finden, ohne das WMI in .NET zu verwenden?

+4

Öffnen Sie die Box und schauen Sie? – inspite

+1

Diese so oft gefragt worden ist ... –

+0

Nein, das ein Unterschied ist .......... er die Seriennummer jedes Volumen der Festplatte – Pritesh

Antwort

4

loszulegen Dies soll dazu beitragen:

How to get Physical HDD serial number without WMI

In Bezug auf Ihr Problem mit WMI nicht Daten zurückgegeben; Sind Sie sicher, wie Sie die richtigen Berechtigungen zum Abrufen von Daten aus WMI erhalten? Sie können WMI Tools verwenden, um dies zu überprüfen/zu beheben.

+0

Ich führe den Code im eingeschränkten Account-Modus. Also ich denke, das ist das Problem. Gibt es irgendeine Möglichkeit, wie ich meine Privilegien innerhalb des begrenzten Kontos erhöhen kann? –

+1

Ich glaube nicht. Wäre das nicht alles, um den Benutzern Privilegien zuzuweisen? Oder wenn Sie das admin-Passwort kennen, können Sie den "runas" -Befehl verwenden. – Espo

0

Sie können die Verwendung:

GetVolumeInformation

Win32-API-Funktion, um diese Informationen zu erhalten, wenn Sie WMI vermeiden müssen. Die verknüpfte Seite enthält die Deklarationssignatur (in VB & C#) für die API-Funktion zusammen mit Beispielcode.

+0

Gibt es nicht die Volume-Seriennummer zurück? Ich möchte die Seriennummer des Geräts, die sich nicht mit der Formatierung ändert –

+1

@Xinxua - Entschuldigung, Sie haben Recht. Es gibt das Volume und nicht die Seriennummer des Geräts zurück. Ich denke, der einzige Weg, dies ohne WMI zu erreichen, besteht darin, in untergeordnete Betriebssystemfunktionen, die von C++/nicht verwaltetem Code aufgerufen werden (wie bei der anderen Espo-Antwort), herunterzufahren, wenn Sie mit eingeschränkten Windows-Kontoberechtigungen und WMI arbeiten (wahrscheinlich deshalb), dann bezweifle ich, dass das Aufrufen von C++ - DLL-Funktionen von einer .NET-Anwendung aus funktioniert, es sei denn, Sie können Code als höhere Berechtigung ausführen/ausführen, und dazu würden die entsprechenden Zugriffs-/Kennwörter erforderlich sein. – CraigTP

0

Verwenden WMI von Server-Explorer in VS

  • Open Server-Explorer
  • Erweitern Sie Ihre Maschine
  • Expand-Management-Klassen
  • erweitern Disk-Laufwerke
  • Wählen Sie das Laufwerk
  • ziehen Sie es auf ein Formular, um den generierten Code zu sehen
  • Acc ess die VolumeSerialNumber Eigenschaft im Code
4

Rauh bereit:

using System; 
using System.Management; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ManagementClass mangnmt = new ManagementClass("Win32_LogicalDisk"); 
      ManagementObjectCollection mcol = mangnmt.GetInstances(); 
      string result = ""; 
      foreach (ManagementObject strt in mcol) 
      { 
       result += "Name    : " + Convert.ToString(strt["Name"]) + Environment.NewLine; 
       result += "VolumeName  : " + Convert.ToString(strt["VolumeName"]) + Environment.NewLine; 
       result += "VolumeSerialNumber: " + Convert.ToString(strt["VolumeSerialNumber"]) + Environment.NewLine; 
       result += Environment.NewLine; 
      } 
      Console.Out.WriteLine(result); 
      Console.In.ReadLine(); 
     } 
    } 
} 

Hinweis gibt es auch andere Attribute, die Sie verwenden können, und wenn Sie die Details für eine bestimmte Platte wollen, müssen Sie einige Berechnungen durchführen müssen über die Ergebnisse.

Hoffe, dass hilft!

+6

Dies verwendet immer noch WMI – Smith

0

Ich benutze hdd Firmware Track in meinen Projekten. Ich programmierte hinter dem MDI-Formular, um nach der hdd Firmware-Nummer zu suchen, dann seine Schleife auf allen zur Verfügung gestellten Zahlen von hdds der Firmencomputer und wenn es irgendjemandem unter diesen zur Verfügung gestellten hdds firmwarennummern entspricht, dann laufen die Anwendung und das laden mdi Formular anderes weise zur Verfügung stellt Nachricht "Die Anwendung ist nicht auf diesem Computer registriert, bitte rufen Sie Herrn Afridi, um diese Anwendung auf 00923339176357 zu registrieren. Meine E-Mail-Adresse ist [email protected] Ich werde vollständigen Quellcode des Abrufs, wie professionell hdd Firmware-Nummer und wie zu programmieren um andere durch illegale Verwendung Ihrer App zu stoppen

Eine schöne Sache, die Sie alle Firmwarechardfirmware auf einmal spezifizieren und die Anwendung zuerst die hdd Firmwarennummer wählen lassen sollten, speichern Sie sie in einer Variablen und wählen Sie dann den Wert von Diese Variable (ein String-Wert) und Loop eins nach dem anderen mit jeder hdd-Nummer von uns logischer Operator ODER. Wenn es eine übereinstimmende Nummer unter den Firmen-hdds-Zahlen mit variablem Wert findet, dann sollte die App das Hauptformular (mdi) laden, andernfalls den Benutzer zur Registrierung benachrichtigen.

Der Beispielcode wird mit vb6 bereitgestellt. Sie können später einfach in vb.net programmieren, indem Sie verstehen, wie Sie nicht verwalteten Code in einer verwalteten .net-Anwendung aufrufen. In diesem Fall wird eine .dll.

1

Verwenden der createfile wie unten gezeigt. Es erfordert möglicherweise administrative Berechtigungen. Fügen Sie 4 Textfelder und eine Schaltfläche in Ihrem Code hinzu.

private const int CREATE_NEW = 1; 
    private const int OPEN_EXISTING = 3; 
    private const uint GENERIC_READ = 0x80000000; 
    private const uint GENERIC_WRITE = 0x40000000; 
    // 10000000000000000000000000000000 --- GENERIC_READ 
    // 01000000000000000000000000000000 --- GENERIC_WRITE 
    // 00100000000000000000000000000000 --- GENERIC_EXECUTE 
    // 00010000000000000000000000000000 --- GENERIC_ALL  

    //Securable objects use an access mask format in which the 
    //four high-order bits specify generic access rights 


    private const int FILE_SHARE_READ = 0x1;  
    private const int FILE_SHARE_WRITE = 0x2; 
    // 00000000000000000000000000000001 --- FILE_SHARE_READ 
    // 00000000000000000000000000000010 --- FILE_SHARE_WRITE 
    // 00000000000000000000000000000100 --- FILE_SHARE_DELETE 

    private const int VER_PLATFORM_WIN32_NT = 2; 
    private const int DFP_RECEIVE_DRIVE_DATA = 0x7C088; 
    //  0   000000000000111   11     0    00000100010   00 
    //  Common Device Type    Required Access  Custom   Function Code  Transfer Type 

    private const int INVALID_HANDLE_VALUE = -1; 

    public enum DriveTypes { Fixed, Removable, Unknown }; 
    public string[] DriveStrings = { "Fixed", "Removable", "Unknown" }; 

    [StructLayout(LayoutKind.Sequential, Size = 8)] 
    private class IDEREGS 
    { 
     public byte Features; 
     public byte SectorCount; 
     public byte SectorNumber; 
     public byte CylinderLow; 
     public byte CylinderHigh; 
     public byte DriveHead; 
     public byte Command; 
     public byte Reserved; 
    } 

    [StructLayout(LayoutKind.Sequential, Size = 32)] 
    private class SENDCMDINPARAMS 
    { 
     public int BufferSize; 
     public IDEREGS DriveRegs; 
     public byte DriveNumber; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] 
     public byte[] Reserved; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] 
     public int[] Reserved2; 
     public SENDCMDINPARAMS() 
     { 
      DriveRegs = new IDEREGS(); 
      Reserved = new byte[3]; 
      Reserved2 = new int[4]; 
     } 
    } 
    [StructLayout(LayoutKind.Sequential, Size = 12)] 
    private class DRIVERSTATUS 
    { 
     public byte DriveError; 
     public byte IDEStatus; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] 
     public byte[] Reserved; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] 
     public int[] Reserved2; 
     public DRIVERSTATUS() 
     { 
      Reserved = new byte[2]; 
      Reserved2 = new int[2]; 
     } 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    private class IDSECTOR 
    { 
     public short GenConfig; 
     public short NumberCylinders; 
     public short Reserved; 
     public short NumberHeads; 
     public short BytesPerTrack; 
     public short BytesPerSector; 
     public short SectorsPerTrack; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] 
     public short[] VendorUnique; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] 
     public char[] SerialNumber; 
     public short BufferClass; 
     public short BufferSize; 
     public short ECCSize; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
     public char[] FirmwareRevision; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] 
     public char[] ModelNumber; 
     public short MoreVendorUnique; 
     public short DoubleWordIO; 
     public short Capabilities; 
     public short Reserved1; 
     public short PIOTiming; 
     public short DMATiming; 
     public short BS; 
     public short NumberCurrentCyls; 
     public short NumberCurrentHeads; 
     public short NumberCurrentSectorsPerTrack; 
     public int CurrentSectorCapacity; 
     public short MultipleSectorCapacity; 
     public short MultipleSectorStuff; 
     public int TotalAddressableSectors; 
     public short SingleWordDMA; 
     public short MultiWordDMA; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 382)] 
     public byte[] Reserved2; 
     public IDSECTOR() 
     { 
      VendorUnique = new short[3]; 
      Reserved2 = new byte[382]; 
      FirmwareRevision = new char[8]; 
      SerialNumber = new char[20]; 
      ModelNumber = new char[40]; 
     } 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    private class SENDCMDOUTPARAMS 
    { 
     public int BufferSize; 
     public DRIVERSTATUS Status; 
     public IDSECTOR IDS; 
     public SENDCMDOUTPARAMS() 
     { 
      Status = new DRIVERSTATUS(); 
      IDS = new IDSECTOR(); 
     } 
    } 

    [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
    private static extern int CloseHandle(int hObject); 

    [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
    private static extern int CreateFile(
       string lpFileName, 
       uint dwDesiredAccess, 
       int dwShareMode, 
       int lpSecurityAttributes, 
       int dwCreationDisposition, 
       int dwFlagsAndAttributes, 
       int hTemplateFile 
      ); 

    [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
    private static extern int DeviceIoControl(
      int hDevice, 
      int dwIoControlCode, 
      [In(), Out()] SENDCMDINPARAMS lpInBuffer, 
      int lpInBufferSize, 
      [In(), Out()] SENDCMDOUTPARAMS lpOutBuffer, 
      int lpOutBufferSize, 
      ref int lpBytesReturned, 
      int lpOverlapped 
     ); 

    private string SwapChars(char[] chars) 
    { 
     for (int i = 0; i <= chars.Length - 2; i += 2) 
     { 
      char t; 
      t = chars[i]; 
      chars[i] = chars[i + 1]; 
      chars[i + 1] = t; 
     } 
     string s = new string(chars); 
     return s; 
    } 


    private void button1_Click(object sender, System.EventArgs e) 
    { 

     string serialNumber = " ", model = " ", firmware = " "; 
     bool result; 
     DriveTypes driveType = DriveTypes.Unknown; 
     int handle, returnSize = 0; 
     int driveNumber = 0; 
     SENDCMDINPARAMS sci = new SENDCMDINPARAMS(); 
     SENDCMDOUTPARAMS sco = new SENDCMDOUTPARAMS(); 

     if (Environment.OSVersion.Platform == PlatformID.Win32NT) 
      //    \\.\PhysicalDrive0 Opens the first physical drive. 
      //    \\.\PhysicalDrive2 Opens the third physical drive. 
      // see more info on http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx 
      handle = CreateFile("\\\\.\\PhysicalDrive" + "0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); 
     else // for win'9x 
      handle = CreateFile("\\\\.\\Smartvsd", 0, 0, 0, CREATE_NEW, 0, 0); 
     if (handle != INVALID_HANDLE_VALUE) 
     { 
      sci.DriveNumber = (byte)driveNumber; 
      sci.BufferSize = Marshal.SizeOf(sco); 
      sci.DriveRegs.DriveHead = (byte)(0xA0 | driveNumber << 4); 
      sci.DriveRegs.Command = 0xEC; 
      sci.DriveRegs.SectorCount = 1; 
      sci.DriveRegs.SectorNumber = 1; 
      if (DeviceIoControl(handle, DFP_RECEIVE_DRIVE_DATA, sci, Marshal.SizeOf(sci), sco, Marshal.SizeOf(sco), ref returnSize, 0) != 0) 
      { 
       serialNumber = SwapChars(sco.IDS.SerialNumber); 
       model = SwapChars(sco.IDS.ModelNumber); 
       firmware = SwapChars(sco.IDS.FirmwareRevision); 
      } 

      textBox1.Text = serialNumber; 
      textBox2.Text = model; 
      textBox3.Text = firmware; 
      if ((sco.IDS.GenConfig & 0x80) == 0x40) 
       driveType = DriveTypes.Removable; 
      else if ((sco.IDS.GenConfig & 0x40) == 0x40) 
       driveType = DriveTypes.Fixed; 
      else 
       driveType = DriveTypes.Unknown; 
      CloseHandle(handle); 
      textBox4.Text = DriveStrings[(int)driveType]; 
     } 
    } 
Verwandte Themen