Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.19;
Скачать: CL | DM;

Вниз

Помогите с s/n для железа   Найти похожие ветки 

 
ADSVRDL   (2006-07-05 10:27) [0]

Подскажите варианты для програмного определения серийных номеров железа (комп.),и какое железо можно определить. Нужно по максимуму защитить железо предприятия как это можно реализовать. Спасибо всем кто откликнится!


 
tesseract ©   (2006-07-05 10:39) [1]

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum


 
ADSVRDL   (2006-07-05 11:19) [2]

Насколько я понял вы (tesseract © ) предлогаете воспользоваться серийными номерами присвоенными ОП и названием устройств да? А как насчёт возможности взять настоящий серийный номер у устройства ?


 
tesseract ©   (2006-07-05 12:00) [3]


> А как насчёт возможности взять настоящий серийный номер
> у устройства ?


Он на этикетке написан.

А чем тебя PCI ID не устраивает?


 
ADSVRDL   (2006-07-05 13:49) [4]

Ok. Попробовал разобраться!  

Итак:
        1 Процессор ACPI\.. (ищем class = Proceccor)
        2 Винты IDE и SCSI\..(ищем class = SDROM и DiskDrive)
       
Но есть вопросы:
   1.Если устройство отсутствует, но оно всеравно в реестре  как    определить наличие его (например прописано         несколько IDE а насамом деле один)?
  2. И как бароться с матерью (Показывает только контроллеры памяти и системной шины)?


 
tesseract ©   (2006-07-05 15:13) [5]


>   1.Если устройство отсутствует, но оно всеравно в реестре
>  как    определить наличие его (например прописано      
>   несколько IDE а насамом деле один)?


В узле устройства должен быть Control а там ключ activeServices.

А вообще лучше найти заголовки для WMI - там ус-ми и порулить можно :-)


 
ADSVRDL   (2006-07-05 15:49) [6]


> А вообще лучше найти заголовки для WMI


Это где и как , и как мамку распознать?

Интересно ADIA32 как это делает?


 
tesseract ©   (2006-07-05 16:51) [7]


> Интересно ADIA32 как это делает?


Наверно через реестр, он содержит полную информацию.


> Это где и как ,


Windows Management Interface  - ссылок очень много, например  MSDN.


 
Stanislav ©   (2006-07-07 15:56) [8]

Кто то на этом форуме писал:
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;
// &#224; &#242;&#229;&#239;&#229;&#240;&#252; &#239;&#229;&#240;&#229;&#241;&#242;&#224;&#226;&#232;&#236; &#236;&#229;&#241;&#242;&#224;&#236;&#232;, &#243;&#244;...
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.


 
Stanislav ©   (2006-07-07 15:58) [9]

Что-то с кодировкой :-)


 
Джо ©   (2006-07-07 16:21) [10]

> [8] Stanislav ©   (07.07.06 15:56)
> Кто то на этом форуме писал:
> unit HDDInfo;

Писал я. Работает не всегда. Потом Alex Konshin немного дорабатывал рашпилем (есть где-то на его сайте). :) Но, все равно, работает не всегда.

П.С. В контексте того, зачем я писал: код коряв местами, писал оч. быстро — просто, чтобы проверить идею.


 
Джо ©   (2006-07-07 16:31) [11]

Вот полный исходник с примером, если кому нужно:
http://www.unclejoe.ho.com.ua/hdd_info/hddinfo.zip
3.6 Кб.


 
Stanislav ©   (2006-07-07 16:58) [12]

Джо ©   (07.07.06 16:21) [10]
:-)
Всеравно классный модуль. И похоже единственный, по крайней мере я других не встречал.
У меня работает. давал знакомым - тоже работает!


 
Alex Konshin ©   (2006-07-08 08:02) [13]

> Джо ©   (07.07.06 16:21) [10]
> > [8] Stanislav ©   (07.07.06 15:56)
> > Кто то на этом форуме писал:
> > unit HDDInfo;
> Писал я. Работает не всегда. Потом Alex Konshin немного
> дорабатывал рашпилем (есть где-то на его сайте). :) Но,
> все равно, работает не всегда.

Клевета


 
Германн ©   (2006-07-09 03:11) [14]


> Alex Konshin ©   (08.07.06 08:02) [13]
...Клевета

Это про "рашпиль" или про "работает"?


 
Джо ©   (2006-07-09 03:13) [15]

> [13] Alex Konshin ©   (08.07.06 08:02)
> > Джо ©   (07.07.06 16:21) [10]
> Клевета

У меня нет времени искать в архивах подтверждения тому, что я помню очень хорошо. Посему, ограничусь таким же безосновательным заявлением в Ваш адрес, как прозвучавшее — неправда.


 
Джо ©   (2006-07-09 03:19) [16]

Если "клевета" относилось к словам "есть где-то на его сайте" то тут я охотно признаю, что мог быть неправ (я не помню даже проверял ли я тогда наличие исправленного кода на упомянутом сайте). Но не более.

П.С. Исправления, насколько я помню, касались функции SerialNumberToString  — она была корява, о чем, я, кажется, предупреждал прямо в той ветке.


 
Alex Konshin ©   (2006-07-09 14:47) [17]

Так скажу, что тот код, что у меня на сайте, был написан еще до того, как я на  этом сайте впервые появился. И он никаким боком не похож на то, что у тебя, и он достает s/n другим способом. Так я не понимаю, что я такого мог в нем дорабатывать. Если ты имеешь в виду, чем-то тебе помог и что-то исправлял в твоем коде, то да, такое могло быть.
Кстати, а это работает не под администратором? Вроде не должно - прав не хватит, чтоб хендл получить. Собственно, мое know how именно в том и заключается, что мой код работает под любым аккаунтом. Да и этот IOCTL код сравнительно недавно появился и в старых версиях NT может и не работать, правда, я не могу сказать когда он появился.



Страницы: 1 вся ветка

Текущий архив: 2006.11.19;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.033 c
2-1162301640
daser
2006-10-31 16:34
2006.11.19
как sql-запросом убить 2 одинаковые записи?


15-1162213008
ZeroDivide
2006-10-30 15:56
2006.11.19
Заполняем анкетку


15-1162303585
Crazybeaver
2006-10-31 17:06
2006.11.19
Чудеса на виражах. Каким образом выполнена эта технология?


1-1160308687
brother
2006-10-08 15:58
2006.11.19
Старт сервиса сразу


15-1162494089
Vovan#1
2006-11-02 22:01
2006.11.19
Оформление математических решений