Форум: "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;
// à òåïåðü ïåðåñòàâèì ìåñòàìè, óô...
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.52 MB
Время: 0.045 c