¿Cómo puedo encontrar el número de serie del dispositivo de disco duro sin usar el WMI en .NET?

Quiero obtener el número de serie cableado del disco duro pero NO utilizando WMI. Intenté usar el código WMI, y no funciona en mi máquina con seguridad. Entonces, ¿hay alguna alternativa en .NET para encontrar el número de serie de un disco duro físico?

Esto debería ayudar a empezar:

Cómo obtener el número de serie del disco duro físico sin WMI

Con respecto a su problema con WMI no devolver datos; ¿Está seguro de cómo obtener los privilegios adecuados para obtener datos de WMI? Puede usar las herramientas de WMI para verificar / arreglar esto.

Utilice el archivo de creación como se muestra a continuación. Puede requerir permisos administrativos. Agregue 4 cuadros de texto y un botón en su código.

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]; } } 

Una solución que funciona perfectamente se puede encontrar aquí:

http://www.codeproject.com/Articles/16941/Get-Physical-HDD-Serial-Number-without-WMI

[editar] Lo sentimos, se perdió una referencia a esto que ya se ha enviado.

Puedes usar el:

GetVolumeInformation

Función Win32 API para obtener esta información, si debe evitar WMI. La página vinculada proporciona la firma de statement completa (en VB y C #) para la función API junto con el código de ejemplo.

Tus mejores opciones son windows api,

Hice una búsqueda simple y obtuve esto

Información general del procesador y también leer este post.

Estoy usando la pista de firmware hdd en mis proyectos. Programé detrás del formulario mdi para buscar el número de firmware de hdd, luego su bucle en todos los números proporcionados de hdds de computadoras de la compañía y si coincide con cualquiera de estos números de firmware de hdds proporcionados, luego ejecutar la aplicación y cargar mdi de otra manera proporciona un mensaje “La aplicación no está registrada en esta máquina, llame al Sr. Afridi para registrar esta aplicación en 00923339176357. Mi dirección de correo electrónico es munawar_s_afridi@yahoo.com. Enviaré el código fuente completo para obtener información sobre cómo progtwigr el número de firmware de HDDD y cómo para detener a otros mediante el uso de su aplicación de forma ilegal.

Una cosa interesante es que debe especificar todas las computadoras de la compañía con el firmware de hdd a la vez y dejar que la aplicación primero escoja el número de firmware de hdd, almacenarlo en una variable y luego elegir el valor de esta variable (un valor de cadena) y hacer un bucle uno por uno con cada número de disco duro utilizando el operador lógico OR. Si encuentra un número coincidente entre los números de hdds de las empresas con valor variable, la aplicación debe cargar el formulario principal (mdi), de lo contrario, debe notificar al usuario para el registro.

El código de ejemplo se proporcionará utilizando vb6. Puede progtwigr fácilmente más adelante en vb.net simplemente entendiendo cómo llamar código no administrado a una aplicación .net administrada. En este caso una .dll.

Use WMI desde Server Explorer en VS

  • Open Server Explorer
  • Expande tu máquina
  • Expandir las clases de gestión.
  • Expandir volúmenes de disco
  • Seleccione la unidad
  • Arrástrelo a un formulario para ver el código generado.
  • Acceda a la propiedad VolumeSerialNumber en el código