Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];

Вниз

Помогите с 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.067 c
15-1162295245
serrgg
2006-10-31 14:47
2006.11.19
Как узнать версию Delphi в которой был создан проект?


15-1162507884
Ketmar
2006-11-03 01:51
2006.11.19
какими только извращениями люди не страдают...


2-1162210728
dreamse
2006-10-30 15:18
2006.11.19
Как считать список ключей которые есть в разделе ветки реестра ?


15-1162047689
homm
2006-10-28 19:01
2006.11.19
Навеяно DMC а точнее движком данного форума


11-1138954163
igor__
2006-02-03 11:09
2006.11.19
Как работать с БД из KOL?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский