|
[ franjo_tahi2 @ 18.11.2011. 08:13 ] @
| Kako iz D2007 očitati serijski broj motherboard-a.
Na netu sam našao ovo, ali mi izgldea prekomplicirano: [url] http://www.delphitricks.com/so.../retrieve_cpu_information.html [/url]
a sljedeći kod ne radi, tj. ne vraća broj:
Code:
program GetWMI_MotherBoardSerial;
{$APPTYPE CONSOLE}
uses
SysUtils
,ActiveX
,ComObj
,Variants;
function GetMotherBoardSerial:String;
var
objWMIService : OLEVariant;
colItems : OLEVariant;
colItem : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
function GetWMIObject(const objectName: String): IDispatch;
var
chEaten: Integer;
BindCtx: IBindCtx;
Moniker: IMoniker;
begin
OleCheck(CreateBindCtx(0, bindCtx));
OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
end;
begin
Result:='';
objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
colItems := objWMIService.ExecQuery('SELECT SerialNumber FROM Win32_BaseBoard','WQL',0);
oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
if oEnum.Next(1, colItem, iValue) = 0 then
Result:=VarToStr(colItem.SerialNumber);
end;
begin
try
CoInitialize(nil);
try
Writeln('Serial MotherBoard '+GetMotherBoardSerial);
Readln;
finally
CoUninitialize;
end;
except
on E:Exception do
Begin
Writeln(E.Classname, ': ', E.Message);
Readln;
End;
end;
end.
|
[ reiser @ 18.11.2011. 17:06 ] @
[ Aleksandar Đokić @ 18.11.2011. 21:43 ] @
kod koji postovao mi je nesto sumnjiv, ali zato kod na linku mi se cini ok, neophodno je koriscenje asemblera
[ salaczr @ 19.11.2011. 10:45 ] @
@franjo_tahi2
Kod koji si postovao je ok, odnosno vraca serijski broj maticne ploce.
Pogledaj malo Microsoft WMI dokumentaciju http://msdn.microsoft.com/en-u...top/aa394582%28v=vs.85%29.aspx
WMI klasa Win32_BaseBoard vraca serijski broj maticne ploce i tvoj kod i Magenta systems koriste nju.
pozdrav
[ franjo_tahi2 @ 21.11.2011. 08:40 ] @
Ne zanam u čem je štos. qry: Code: ... 'SELECT SerialNumber FROM Win32_BaseBoard' ...
kod kolege vraća serijski broj, a kod mene ne.
On ima ThinkPad, a ja HP laptop. Oba su dvojezgrena, oba imaju Win 7.
[ komplikator @ 24.11.2011. 07:49 ] @
Ja sam prije koji mjesec kod zamjene ploče na laptopu nekim serviserskim programom za hp računala bez problema upisao novi serijski borj laptopa, oznaku ploče, serijski ploče (ona njihova 3 broja). tako da ako pucaš na to kao vid zaštite programa baš i nije neka zaštita.
Slijedeći problem je kada će neki jopac iz čista mira u servisima pogasiti WMI servis (kao što to neki sigurnosni stručnjaci savjetuju) i imaš problem. Isto tako, pitanje je kada će idući SP ili generacija windoza promijeniti rad s WMI, izbaciti neke klase i sl.
[ franjo_tahi2 @ 24.11.2011. 14:15 ] @
Je, pucam na zaštitu preko broja ploče. :(
A kako onda? Što uzeti da bih znao da je to upravo taj komp? Broj diska - ne valja jer se diskovi mijenjaju. Me mogu dozvoliti da netko kupi program, zamjeni disk pa mu program više ne radi. Mislio sam uzeti broj diska i ploče pa dozvoliti rad ako jedno od ta dva broja odgovaraju.
Nije moj program bog zna što da bi se netko upustio u razbijanje zaštite. Tek toliko da ne možeš kupiti jednu kopiju, a onda ju podijeliti svim kompičima.
Ima li tko ideju kako se zaštiti od kopiranja programa (nelegalnog)?
[ savkic @ 24.11.2011. 16:13 ] @
> A kako onda? Što uzeti da bih znao da je to upravo taj komp? Broj diska - ne valja jer se diskovi mijenjaju. Me mogu dozvoliti da netko kupi program, zamjeni disk pa
> mu program više ne radi. Mislio sam uzeti broj diska i ploče pa dozvoliti rad ako jedno od ta dva broja odgovaraju.
Mislim da se najviše koristi kombinacija nekoliko stvari, broj mrežne kartice, broj windowsa, CPU, motherboard, pa sad šta bude dostupno od toga se gleda.
[Ovu poruku je menjao savkic dana 24.11.2011. u 18:08 GMT+1]
[ reiser @ 24.11.2011. 16:20 ] @
Jel ti dolazis na licu mesta da instaliras program po kupovini ? Ako je tako, napravi mali aktivator, koji ce napraviti key fajl kad ga pokrenes, u kome ce biti serijski broj ploce, hard diska i NIC MAC adresa. Dodjes kod korisnika sa aktivatorom, pokrenes ga, dobijes key fajl koji mu ostavis i to je to.
Tvoj program ce uporedjivati serijske brojeve sa tim brojevima iz tog kljuca, i ako se bar jedan poklapa onda je ok. Ako korisnik odluci da kupi novu masinu onda ces morati da mu napravis novi aktivacioni fajl.
[ salaczr @ 24.11.2011. 17:37 ] @
Za tvoje potrebe sasvim je dovoljno uzeti serijski broj HDD-a i MAC na primer. Sve vise racunara imaju integrisan NIC tako da mu u neku ruku to dodje i kao identifikator ploce.
Ako zelis da izbegnes WMI probaj nesto ovako:
uzimanje serijskog broja HDD-a http://www.elitesecurity.org/t418469-0#2773671,
a za MAC imam unit koji sam pronasao negde na netu:
Code:
unit ethernet_address;
interface
uses classes, sysutils;
const
MAX_INTERFACE_NAME_LEN = $100;
ERROR_SUCCESS = 0;
MAXLEN_IFDESCR = $100;
MAXLEN_PHYSADDR = 8;
MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0 ;
MIB_IF_OPER_STATUS_UNREACHABLE = 1;
MIB_IF_OPER_STATUS_DISCONNECTED = 2;
MIB_IF_OPER_STATUS_CONNECTING = 3;
MIB_IF_OPER_STATUS_CONNECTED = 4;
MIB_IF_OPER_STATUS_OPERATIONAL = 5;
MIB_IF_TYPE_OTHER = 1;
MIB_IF_TYPE_ETHERNET = 6;
MIB_IF_TYPE_TOKENRING = 9;
MIB_IF_TYPE_FDDI = 15;
MIB_IF_TYPE_PPP = 23;
MIB_IF_TYPE_LOOPBACK = 24;
MIB_IF_TYPE_SLIP = 28;
MIB_IF_ADMIN_STATUS_UP = 1;
MIB_IF_ADMIN_STATUS_DOWN = 2;
MIB_IF_ADMIN_STATUS_TESTING = 3;
type
MIB_IFROW = Record
wszName : Array[0 .. (MAX_INTERFACE_NAME_LEN*2-1)] of char;
dwIndex : LongInt;
dwType : LongInt;
dwMtu : LongInt;
dwSpeed : LongInt;
dwPhysAddrLen : LongInt;
bPhysAddr : Array[0 .. (MAXLEN_PHYSADDR-1)] of Byte;
dwAdminStatus : LongInt;
dwOperStatus : LongInt;
dwLastChange : LongInt;
dwInOctets : LongInt;
dwInUcastPkts : LongInt;
dwInNUcastPkts : LongInt;
dwInDiscards : LongInt;
dwInErrors : LongInt;
dwInUnknownProtos : LongInt;
dwOutOctets : LongInt;
dwOutUcastPkts : LongInt;
dwOutNUcastPkts : LongInt;
dwOutDiscards : LongInt;
dwOutErrors : LongInt;
dwOutQLen : LongInt;
dwDescrLen : LongInt;
bDescr : Array[0 .. (MAXLEN_IFDESCR - 1)] of Char;
end;
function Get_EthernetAddresses: TStringList;
Function GetIfTable( pIfTable : Pointer;
VAR pdwSize : LongInt;
bOrder : LongInt ): LongInt; stdcall;
implementation
Function GetIfTable; stdcall; external 'IPHLPAPI.DLL';
function Get_EthernetAddresses: TStringList;
const
_MAX_ROWS_ = 20;
type
_IfTable = Record
nRows : LongInt;
ifRow : Array[1.._MAX_ROWS_] of MIB_IFROW;
end;
VAR
pIfTable : ^_IfTable;
TableSize : LongInt;
tmp : String;
i,j : Integer;
ErrCode : LongInt;
begin
pIfTable := nil;
//------------------------------------------------------------
Result:=TStringList.Create;
if Assigned(Result) then
try
//-------------------------------------------------------
// First: just get the buffer size.
// TableSize returns the size needed.
TableSize:=0; // Set to zero so the GetIfTabel function
// won't try to fill the buffer yet,
// but only return the actual size it needs.
GetIfTable(pIfTable, TableSize, 1);
if (TableSize < SizeOf(MIB_IFROW)+Sizeof(LongInt)) then
begin
Exit; // less than 1 table entry?!
end; // if-end.
// Second:
// allocate memory for the buffer and retrieve the
// entire table.
GetMem(pIfTable, TableSize);
ErrCode := GetIfTable(pIfTable, TableSize, 1);
if ErrCode<>ERROR_SUCCESS then
begin
Exit; // OK, that did not work.
// Not enough memory i guess.
end; // if-end.
// Read the ETHERNET addresses.
for i := 1 to pIfTable^.nRows do
try
if pIfTable^.ifRow[i].dwType=MIB_IF_TYPE_ETHERNET then
begin
tmp:='';
for j:=0 to pIfTable^.ifRow[i].dwPhysAddrLen-1 do
begin
tmp := tmp + format('%.2x',
[ pIfTable^.ifRow[i].bPhysAddr[j] ] );
end; // for-end.
//-------------------------------------
if Length(tmp)>0 then Result.Add(tmp);
end; // if-end.
except
Exit;
end; // if-try-except-end.
finally
if Assigned(pIfTable) then FreeMem(pIfTable,TableSize);
end; // if-try-finally-end.
end;
end.
pozdrav
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|