Форум » [x]Harbour » Серийный номер винта » Ответить

Серийный номер винта

Dima: Как его считать ? Не ID присвоенный при форматировании а номер зашитый на заводе ну по типу как MAC сетевой платы. PS Everest такой номер показывает. ID модели ST3250624AS Серийный номер 5ND306E8 Версия 3.AAE

Ответов - 10

santy: Дима есть старый пример, переведённый с С#: [pre2] #include "fivewin.ch" function Main() MsgInfo( GetUSBSerial( "D:" ) ) return nil ******************************* FUNCTION GetUSBSerial( cDrive ) ******************************* local cDiskNum := "", cPnPDeviceID := "", cTmp, oDiskDrive,; oLogicalDrive local oWMIObjA, oWMIServerA, oWMIDiskDrive, oWMIObjA2, oWMIServerA2,; oWMILogicalDisk try oWMIObjA := GetActiveObject( "wbemScripting.SwbemLocator" ) catch try oWMIObjA := CreateObject( "wbemScripting.SwbemLocator" ) catch Alert( "ERRO ! Nao criou objeto wbemScripting") return end end oWMIServerA := oWMIObjA:ConnectServer() oWMIDiskDrive := oWMIServerA:ExecQuery( "SELECT * FROM Win32_DiskDrive" ) try oWMIObjA2 := GetActiveObject( "wbemScripting.SwbemLocator" ) catch try oWMIObjA2 := CreateObject( "wbemScripting.SwbemLocator" ) catch Alert( "ERRO ! Nao criou objeto wbemScripting") return end end oWMIServerA2 := oWMIObjA2:ConnectServer() oWMILogicalDisk := oWMIServerA2:ExecQuery( "SELECT * FROM Win32_LogicalDiskToPartition" ) for each oLogicalDrive in oWMILogicalDisk if substr(oLogicalDrive:Dependent,at('"',oLogicalDrive:Dependent)+1,2 ) == cDrive cDiskNum :=substr(oLogicalDrive:Antecedent,at('#',oLogicalDrive:Antecedent )+1,1 ) endif next for each oDiskDrive in oWMIDiskDrive if oDiskDrive:Name == "\\.\PHYSICALDRIVE" + cDiskNum if oDiskDrive:InterfaceType == "USB" cTmp := substr( oDiskDrive:PnPDeviceID, 1,rat("&",oDiskDrive:PnPDeviceID ) - 1 ) cPnPDeviceID := substr( cTmp, rat( "&", cTmp ) + 1 ) cPnPDeviceID := substr( cPnPDeviceID, at( "\",cPnPDeviceID) +1 ) elseif oDiskDrive:InterfaceType == "IDE" cPnPDeviceID := substr( oDiskDrive:PnPDeviceID,rat("\",oDiskDrive:PnPDeviceID ) + 1 ) endif cPnPDeviceID := "BUS Type: " + oDiskDrive:InterfaceType +"("+oDiskDrive:MediaType + ") " + " Model: " + oDiskDrive:Model + ; " SerialNumber: " + cPnPDeviceID + " Serial Volume: " + NumToHex(VolSerial(cDrive ) ) endif next RETURN cPnPDeviceID [/pre2] Можна ещё попробовать такой пример: [pre2] function SerNumHddDisk() local oWMI, objWMI, oPhysicalMedia, oData sComp :="." oWMI := CreateObject( "winmgmts:\\"+sComp+"\root\CIMV2" ) objWMI := oWMI:ConnectServer() oPhysicalMedia := objWMI:ExecQuery( "Select * from Win32_PhysicalMedia" ) for each oData in oPhysicalMedia MsgInfo( oData:SerialNumber ) next return nil [/pre2] нужно тестить, выдаёт ошибки. Дима запусти вот эту утилиту, очень помагает. Написана на шарпе. WMI Code Creator

LYSK: HKLM\Software\Microsoft\Windows Genuine Advantage - HDSLN

LYSK: или по wmic получить Signature wmic diskdrive get signature получаем что то вроде этого: ============= Signature 1703225753 1335371724 ============= а уж сама сигнатура это... ====================== Definition: The disk signature, one part of the master boot record, is a unique, identifying number for a hard disk drive or other storage device. In Windows, a list of every disk signature ever recorded on an individual computer since installing Windows ====================== надеюсь, без перевода понятно...


Dima: Спасибо , буду пробовать.

fil: Это не оно ? VolSerial() - Returns the serial number of a disk drive. (Harbour)

ММК: Gopa:=nSerialHD() #include <Windows.h> #include <hbapi.h> #include <dos.h> typedef struct { WORD DUM; LONG lSerie; BYTE Volume[ 11 ]; BYTE fat[ 8 ]; } HDINFO; typedef struct { DWORD edi, esi, ebp, reserved, ebx, edx, ecx, eax; WORD flags, es, ds, fs, gs, ip, cs, sp, ss; } REALMODEINT; void pascal Dos3Call( void ); //----------------------------------------------------------------// #ifndef __FLAT__ static BOOL RealModeInt( WORD wIntNo, REALMODEINT * pReal ) { asm { push di mov bx, wIntNo and bx, 0x00FF mov cx, 0 les di, pReal mov ax, 0x0300 int 0x31 pop di } return pReal->flags & 1; } //----------------------------------------------------------------// static LONG lSerialHD( WORD wDrive ) { DWORD DosHandle = GlobalDosAlloc( sizeof( HDINFO ) ); REALMODEINT sInt; LONG lHD; memset( ( LPBYTE ) &sInt, ( BYTE ) 0, sizeof( REALMODEINT ) ); sInt.eax = 0x00006900; sInt.ebx = wDrive; // C: = 3 sInt.ds = HIWORD( DosHandle ); sInt.edx = 0L; RealModeInt( 0x0021, &sInt ); // Check for error result if( RealModeInt( 0x0021, &sInt ) ) lHD = 0; // returned value if there is an error else lHD = ( ( HDINFO * ) MK_FP( LOWORD( DosHandle ), sInt.edx ) )->lSerie; GlobalDosFree( LOWORD( DosHandle ) ); return lHD; } #endif //----------------------------------------------------------------// #ifdef __FLAT__ HB_FUNC( NSERIALHD ) { DWORD dwVolumeSerialNumber; BYTE VolumeNameBuffer[ 256 ]; BYTE FileSystemNameBuffer[ 256 ]; GetVolumeInformation( hb_pcount() ? hb_parc( 1 ): "C:\\", ( char * ) VolumeNameBuffer, sizeof( VolumeNameBuffer ), &dwVolumeSerialNumber, 0, 0, ( char * ) FileSystemNameBuffer, sizeof( FileSystemNameBuffer ) ); hb_retnl( dwVolumeSerialNumber ); } HB_FUNC( VOLUMENAME ) { DWORD dwVolumeSerialNumber; BYTE VolumeNameBuffer[ 256 ]; BYTE FileSystemNameBuffer[ 256 ]; GetVolumeInformation( hb_pcount() ? hb_parc( 1 ): "C:\\", ( char * ) VolumeNameBuffer, sizeof( VolumeNameBuffer ), &dwVolumeSerialNumber, 0, 0, ( char * ) FileSystemNameBuffer, sizeof( FileSystemNameBuffer ) ); hb_retc( ( char * ) VolumeNameBuffer ); } #else HB_FUNC( nSerialHD ) { WORD wDrive; if( hb_pcount() ) { wDrive = hb_parc( 1 )[ 0 ]; if( wDrive >= 'a' && wDrive <= 'z' ) wDrive -= ( 'a' - 1 ); else wDrive -= ( 'A' - 1 ); } else { _AH = 0x19; Dos3Call(); wDrive = _AL + 1; } hb_retnl( lSerialHD( wDrive ) ); } #endif //----------------------------------------------------------------// #ifndef __FLAT__ static LONG lSerialA( void ) { DWORD DosHandle = GlobalDosAlloc( 512 ); REALMODEINT sInt; LONG lHD; memset( ( LPBYTE ) &sInt, ( BYTE ) 0, sizeof( REALMODEINT ) ); sInt.eax = 0x00000201; // AL n sectors to read sInt.ebx = 0x00000000; // BX offset buffer sInt.ecx = 0x00000001; // CH track, CL sector (1...) sInt.edx = 0x00000000; // DH Head, DL drive sInt.es = HIWORD( DosHandle ); // ES segment buffer RealModeInt( 0x0013, &sInt ); if( sInt.flags & 1 ) lHD = 0; else lHD = * ( long * ) MK_FP( LOWORD( DosHandle ), 39 ); GlobalDosFree( LOWORD( DosHandle ) ); return lHD; } //----------------------------------------------------------------// HB_FUNC( nSerialA ) { hb_retnl( lSerialA() ); } //----------------------------------------------------------------// #else HB_FUNC( NSERIALA ) { BYTE VolumeNameBuffer[ 100 ]; BYTE FileSystemNameBuffer[ 100 ]; DWORD dwVolumeSerialNumber; GetVolumeInformation( "A:\\", ( char * ) VolumeNameBuffer, sizeof( VolumeNameBuffer ), &dwVolumeSerialNumber, 0, 0, ( char * ) FileSystemNameBuffer, sizeof( FileSystemNameBuffer ) ); hb_retnl( dwVolumeSerialNumber ); } #endif

Dima: Вот такой скрипт VB у меня показывает серийник только на одном винте (в Harbour тоже) На остальных в поле серийник пусто........ test.vbs [pre2] strComputer = "." Result = "" Dim Model(10), InterfaceType(10), SerialNumber(10) Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Rem Enumerating Physical Disk Model, etc - http://msdn2.microsoft.com/en-us/library/aa394132.aspx i = 0 Set colDiskDrives = objWMIService.ExecQuery ("Select * from Win32_DiskDrive") For each objDiskDrive in colDiskDrives Model(i) = objDiskDrive.Model InterfaceType(i) = objDiskDrive.InterfaceType i=i+1 Next Set colDiskDrives = objWMIService.ExecQuery ("Select * from Win32_PhysicalMedia") i = 0 For each objDisk in colDiskDrives SerialNumber(i) = objDisk.SerialNumber Result = Result & "HDD " & i & ":" & vbCrLf & vbTab & _ "Model: " & Model(i) & vbCrLf & vbTab & _ "InterfaceType: " & InterfaceType(i) & vbCrLf & vbTab & _ "SerialNumber: " & SerialNumber(i) & vbCrLf i=i+1 Next WScript.Echo Result [/pre2] PS У меня 3 HDD

santy: // один серийник GetUSBSerial( "C:" ) GetUSBSerial( "D:" ) // другой серийник GetUSBSerial( "F:" ) GetUSBSerial( "G:" )

Dima: santy пишет: GetUSBSerial( "C:" ) Да как бы работает но в Serial Volume на диске С выдает -1 , на остальных дисках норм. В то же время SerialNumber на всех дисках отработал верно.

Dima: Dima пишет: Да как бы работает но в Serial Volume на диске С выдает -1 Понял. Нужно слэш добавлять А как преобразовать 5&18123253&0&0.0.0 или 5&55881AE&0&0.0.0 к виду 5ND306E8 ?



полная версия страницы