![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с s/n для железа [D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
ADSVRDL © (2006-07-05 10:27:00)Подскажите варианты для програмного определения серийных номеров железа (комп.),и какое железо можно определить. Нужно по максимуму защитить железо предприятия как это можно реализовать. Спасибо всем кто откликнится!
Alex Konshin (2006-07-09 14:47:00) [1]Так скажу, что тот код, что у меня на сайте, был написан еще до того, как я на этом сайте впервые появился. И он никаким боком не похож на то, что у тебя, и он достает s/n другим способом. Так я не понимаю, что я такого мог в нем дорабатывать. Если ты имеешь в виду, чем-то тебе помог и что-то исправлял в твоем коде, то да, такое могло быть.
Кстати, а это работает непод администратором? Вроде не должно - прав не хватит, чтоб хендл получить. Собственно, мое know how именно в том и заключается, что мой код работает под любым аккаунтом. Да и этот IOCTL код сравнительно недавно появился и в старых версиях NT может и не работать, правда, я не могу сказать когда он появился.
Джо (2006-07-09 03:19:00) [2]Если "клевета" относилось к словам "есть где-то на его сайте" то тут я охотно признаю, что мог быть неправ (я не помню даже проверял ли я тогда наличие исправленного кода на упомянутом сайте). Но не более.
П.С. Исправления, насколько я помню, касались функции SerialNumberToString — она была корява, о чем, я, кажется, предупреждал прямо в той ветке.
Джо (2006-07-09 03:13:00) [3]> [13] Alex Konshin © (08.07.06 08:02)
> > Джо © (07.07.06 16:21) [10]
> Клевета
У меня нет времени искать в архивах подтверждения тому, что я помню очень хорошо. Посему, ограничусь таким же безосновательным заявлением в Ваш адрес, как прозвучавшее — неправда.
Германн (2006-07-09 03:11:00) [4]
> Alex Konshin © (08.07.06 08:02) [13]
...Клевета
Это про "рашпиль" или про "работает"?
Alex Konshin (2006-07-08 08:02:00) [5]> Джо © (07.07.06 16:21) [10]
> > [8] Stanislav © (07.07.06 15:56)
> > Кто то на этом форуме писал:
> > unit HDDInfo;
> Писал я. Работает не всегда. Потом Alex Konshin немного
> дорабатывал рашпилем (есть где-то на его сайте). :) Но,
> все равно, работает не всегда.
Клевета
Stanislav (2006-07-07 16:58:00) [6]Джо © (07.07.06 16:21) [10]
:-)
Всеравно классный модуль. И похоже единственный, по крайней мере я других не встречал.
У меня работает. давал знакомым - тоже работает!
Джо (2006-07-07 16:31:00) [7]Вот полный исходник с примером, если кому нужно:
http://www.unclejoe.ho.com.ua/hdd_info/hddinfo.zip
3.6 Кб.
Джо (2006-07-07 16:21:00) [8]> [8] Stanislav © (07.07.06 15:56)
> Кто то на этом форуме писал:
> unit HDDInfo;
Писал я. Работает не всегда. Потом Alex Konshin немного дорабатывал рашпилем (есть где-то на его сайте). :) Но, все равно, работает не всегда.
П.С. В контексте того, зачем я писал: код коряв местами, писал оч. быстро — просто, чтобы проверить идею.
Stanislav (2006-07-07 15:58:00) [9]Что-то с кодировкой :-)
Stanislav (2006-07-07 15:56:00) [10]Кто то на этом форуме писал:
unit HDDInfo;
interface
type
{@abstract(Êëàññ äëÿ îïðåäåëåíèÿ ñåðèéíîãî íîìåðà æåñòêîãî äèñêà)}
THDDInfo = class (TObject)
private
FDriveNumber: Integer;
FFileHandle: Cardinal;
FInfoAvailable: Boolean;
FProductRevision: string;
FProductId: string;
FSerialNumber: string;
FVendorId: string;
procedure SetDriveNumber(const Value: Integer);
procedure ReadInfo;
public
{íîìåð âèí÷åñòåðà, íà÷èíàÿ ñ 0. Ïî óìîë÷àíèþ ñòîèò 0}
property DriveNumber: Integer read FDriveNumber write SetDriveNumber;
constructor Create;
property VendorId: string read FVendorId;
property ProductId: string read FProductId;
property ProductRevision: string read FProductRevision;
{ñåðèéíûé íîìåð âèí÷åñòåðà, êàê åãî âîçâðàùàåò äðàéâåð}
property SerialNumber: string read FSerialNumber;
{ñåðèéíûé íîìåð âèí÷åñòåðà â âèäå ÷èñëà}
function SerialNumberInt: Cardinal;
{ñåðèéíûé íîìåð âèí÷åñòåðà â ñèìâîëüíîì âèäå}
function SerialNumberText: string;
{Âîçâðàùàåò Èñòèíà ïðè óäà÷íîì ïîëó÷åíèè èíôîðìàöèè}
function IsInfoAvailable: Boolean;
end;
implementation
uses Windows,SysUtils, Classes;
type
STORAGE_PROPERTY_QUERY = packed record
PropertyId: DWORD;
QueryType: DWORD;
AdditionalParameters: array [0..1] of WORD;
end;
STORAGE_DEVICE_DESCRIPTOR = packed record
Version: ULONG;
Size: ULONG;
DeviceType: Byte;
DeviceTypeModifier: Byte;
RemovableMedia: Boolean;
CommandQueueing: Boolean;
VendorIdOffset: ULONG; //0x0C vendor ID offs
ProductIdOffset: ULONG; //0x10 offs
ProductRevisionOffset: ULONG; //0x15 offs
SerialNumberOffset: ULONG; // 0x18 offset
STORAGE_BUS_TYPE: DWORD;
RawPropertiesLength: ULONG;
RawDeviceProperties: array [0..2048] of Byte; // seems enough?
end;
const
IOCTL_STORAGE_QUERY_PROPERTY = $2D1400;
{ Misc. utils }
function ByteToChar (const B: Byte): Char;
begin
Result := Chr(B+$30)
end;
function SerialNumberToCardinal (SerNum: string): Cardinal;
begin
HexToBin(PChar(SerNum),PChar(@Result),SizeOf(Cardinal));
end;
{ïåðåïèñàòü íàôèã,}
{ñäåëàíî íà ñêîðóþ ðóêó!}
function SerialNumberToString (SerNum: string): string;
var
I,StrLen: Integer;
Pair: string;
B: Byte;
Ch: Char absolute B;
begin
Result := '';
StrLen := Length(SerNum);
if Odd(StrLen) then
Exit;
I := 1;
while I < StrLen do
begin
Pair := Copy (SerNum,I,2);
HexToBin (PChar(Pair),PChar(@B),1);
Result := Result + Chr(B);
Inc(I,2);
end;
// à òåïåðü ïåðåñòàâèì ìåñòàìè, óô...
I := 1;
while I < Length(Result) do
begin
Ch := Result[I];
Result[I] := Result[I+1];
Result[I+1] := Ch;
Inc(I,2);
end;
end;
{ THddInfo }
constructor THddInfo.Create;
begin
inherited;
SetDriveNumber(0);
end;
function THDDInfo.IsInfoAvailable: Boolean;
begin
Result := FInfoAvailable
end;
procedure THDDInfo.ReadInfo;
type
PCharArray = ^TCharArray;
TCharArray = array[0..32767] of Char;
var
Returned: Cardinal;
Status: LongBool;
PropQuery: STORAGE_PROPERTY_QUERY;
DeviceDescriptor: STORAGE_DEVICE_DESCRIPTOR;
PCh: PChar;
begin
FInfoAvailable := False;
FProductRevision := '';
FProductId := '';
FSerialNumber := '';
FVendorId := '';
try
FFileHandle := CreateFile (
PChar('\\.\PHYSICALDRIVE' + ByteToChar(FDriveNumber)),
GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0);
if FFileHandle = INVALID_HANDLE_VALUE then
RaiseLastOSError;
ZeroMemory(@PropQuery,SizeOf(PropQuery));
Status := DeviceIoControl(
FFileHandle,
IOCTL_STORAGE_QUERY_PROPERTY,
@PropQuery,
SizeOf(PropQuery),
@DeviceDescriptor,
SizeOf(DeviceDescriptor),
Returned,
nil
);
if not Status then
RaiseLastOSError;
if DeviceDescriptor.VendorIdOffset 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.VendorIdOffset];
FVendorId := PCh;
end;
if DeviceDescriptor.ProductIdOffset 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.ProductIdOffset];
FProductId := PCh;
end;
if DeviceDescriptor.ProductRevisionOffset 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.ProductRevisionOffset];
FProductRevision := PCh;
end;
if DeviceDescriptor.SerialNumberOffset 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.SerialNumberOffset];
FSerialNumber := PCh;
end;
FInfoAvailable := True;
finally
if FFileHandle INVALID_HANDLE_VALUE then
CloseHandle(FFileHandle);
end;
end;
function THDDInfo.SerialNumberInt: Cardinal;
begin
Result := 0;
if IsInfoAvailable and (FSerialNumber'') then
Result := SerialNumberToCardinal(FSerialNumber)
end;
function THDDInfo.SerialNumberText: string;
begin
Result := '';
if IsInfoAvailable and (FSerialNumber'') then
Result := SerialNumberToString(FSerialNumber)
end;
procedure THddInfo.SetDriveNumber(const Value: Integer);
begin
FDriveNumber := Value;
ReadInfo
end;
end.
tesseract (2006-07-05 16:51:00) [11]
> Интересно ADIA32 как это делает?
Наверно через реестр, он содержит полную информацию.
> Это где и как ,
Windows Management Interface - ссылок очень много, например MSDN.
ADSVRDL (2006-07-05 15:49:00) [12]
> А вообще лучше найти заголовки для WMI
Это где и как , и как мамку распознать?
Интересно ADIA32 как это делает?
tesseract (2006-07-05 15:13:00) [13]
> 1.Если устройство отсутствует, но оно всеравно в реестре
> как определить наличие его (например прописано
> несколько IDE а насамом деле один)?
В узле устройства должен быть Control а там ключ activeServices.
А вообще лучше найти заголовки для WMI - там ус-ми и порулить можно :-)
ADSVRDL (2006-07-05 13:49:00) [14]Ok. Попробовал разобраться!
Итак:
1 Процессор ACPI\.. (ищем class = Proceccor)
2 Винты IDE и SCSI\..(ищем class = SDROM и DiskDrive)
Но есть вопросы:
1.Если устройство отсутствует, но оно всеравно в реестре как определить наличие его (например прописано несколько IDE а насамом деле один)?
2. И как бароться с матерью (Показывает только контроллеры памяти и системной шины)?
tesseract (2006-07-05 12:00:00) [15]
> А как насчёт возможности взять настоящий серийный номер
> у устройства ?
Он на этикетке написан.
А чем тебя PCI ID не устраивает?
ADSVRDL (2006-07-05 11:19:00) [16]Насколько я понял вы (tesseract © ) предлогаете воспользоваться серийными номерами присвоенными ОП и названием устройств да? А как насчёт возможности взять настоящий серийный номер у устройства ?
tesseract (2006-07-05 10:39:00) [17]HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum