关于获取远程机器的MAC,求救........
我现在正在研究如何获取远程机器的MAC,我们知道可以通过SNMP来做到,现在工作我已经作了很多了,可是有一个问题无法解决,现在给出我写好的部分代码,请大家帮助解决:
///snmp.pas
{*****************************************************************************
Copyright 1992 - 1998 Microsoft Corporation
Translate:Kingron
Mail: Kingron@163.net
Web: http://kingron.myetang.com
Module Name:
snmp.h
Abstract:
Definitions for SNMP development.
*****************************************************************************}
unit SNMP;
interface
uses windows;
{$IFNDEF _INC_SNMP}
{$DEFINE _INC_SNMP}
{$ENDIF}
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Type Definitions //
// //
///////////////////////////////////////////////////////////////////////////////
const
Inetmib1 = 'Inetmib1.dll';
Igmpagnt = 'igmpagnt.dll';
snmpapidll = 'snmpapi.dll';
type
PByteAr=array[0..1000] of byte;
type
TAsnOctetString = packed record
stream: PByteAr;
length: UINT;
dynamic: BOOL;
end;
TAsnObjectIdentifier = packed record
idLength: UINT; /// Length of IDS
ids: pointer; /// Pointer to oid array
end;
PAsnObjectIdentifier = ^TAsnObjectIdentifier;
LONG = WORD;
TAsnInteger32 = LONG;
TAsnUnsigned32 = DWORD;
TAsnCounter64 = ULARGE_INTEGER;
TAsnCounter32 = TAsnUnsigned32;
TAsnGauge32 = TAsnUnsigned32;
TAsnTimeticks = TAsnUnsigned32;
TAsnBits = TAsnOctetString;
TAsnSequence = TAsnOctetString;
TAsnImplicitSequence = TAsnOctetString;
TAsnIPAddress = TAsnOctetString;
TAsnNetworkAddress = TAsnOctetString;
TAsnDisplayString = TAsnOctetString;
TAsnOpaque = TAsnOctetString;
TAsnValue = packed record
number: TAsnInteger32; // ASN_INTEGER
// ASN_INTEGER32
unsigned32: TAsnUnsigned32; // ASN_UNSIGNED32
counter64: TAsnCounter64; // ASN_COUNTER64
Astring: TAsnOctetString; // ASN_OCTETSTRING
bits: TAsnBits; // ASN_BITS
Aobject: TAsnObjectIdentifier; // ASN_OBJECTIDENTIFIER
sequence: TAsnSequence; // ASN_SEQUENCE
address: TAsnIPAddress; // ASN_IPADDRESS
counter: TAsnCounter32; // ASN_COUNTER32
gauge: TAsnGauge32; // ASN_GAUGE32
ticks: TAsnTimeticks; // ASN_TIMETICKS
arbitrary: TAsnOpaque; // ASN_OPAQUE
end;
TAsnAny = packed record
asnType: BYTE;
asnValue: TAsnValue;
end;
TAsnObjectName = TAsnObjectIdentifier;
TAsnObjectSyntax = TAsnAny;
TSnmpVarBind = packed record
name: TAsnObjectName;
value: TAsnObjectSyntax;
end;
TSnmpVarBindList = packed record
list: pointer;
len: UINT;
end;
////下面还有,请接着
问题点数:300、回复次数:33Top
1 楼Kingron(单身走我路……)回复于 2002-04-28 00:40:47 得分 0
{$IFNDEF _INC_WINSNMP}
///////////////////////////////////////////////////////////////////////////////
// //
// ASN/BER Base Types //
// //
///////////////////////////////////////////////////////////////////////////////
const
ASN_UNIVERSAL = $00;
ASN_APPLICATION = $40;
ASN_CONTEXT = $80;
ASN_PRIVATE = $C0;
ASN_PRIMITIVE = $00;
ASN_CONSTRUCTOR = $20;
///////////////////////////////////////////////////////////////////////////////
// //
// PDU Type Values //
// //
///////////////////////////////////////////////////////////////////////////////
SNMP_PDU_GET = ASN_CONTEXT or ASN_CONSTRUCTOR or $0;
SNMP_PDU_GETNEXT = ASN_CONTEXT or ASN_CONSTRUCTOR and $1;
SNMP_PDU_RESPONSE = ASN_CONTEXT or ASN_CONSTRUCTOR and $2;
SNMP_PDU_SET = ASN_CONTEXT or ASN_CONSTRUCTOR or $3;
SNMP_PDU_V1TRAP = ASN_CONTEXT or ASN_CONSTRUCTOR or $4;
SNMP_PDU_GETBULK = ASN_CONTEXT or ASN_CONSTRUCTOR or $5;
SNMP_PDU_INFORM = ASN_CONTEXT or ASN_CONSTRUCTOR or $6;
SNMP_PDU_TRAP = ASN_CONTEXT or ASN_CONSTRUCTOR or $7;
{$ENDIF} // _INC_WINSNMP
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Simple Syntax Values //
// //
///////////////////////////////////////////////////////////////////////////////
const
ASN_INTEGER = ASN_UNIVERSAL or ASN_PRIMITIVE or $02;
ASN_BITS = ASN_UNIVERSAL or ASN_PRIMITIVE or $03;
ASN_OCTETSTRING = ASN_UNIVERSAL or ASN_PRIMITIVE or $04;
ASN_NULL = ASN_UNIVERSAL or ASN_PRIMITIVE or $05;
ASN_OBJECTIDENTIFIER = ASN_UNIVERSAL or ASN_PRIMITIVE or $06;
ASN_INTEGER32 = ASN_INTEGER;
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Constructor Syntax Values //
// //
///////////////////////////////////////////////////////////////////////////////
ASN_SEQUENCE = ASN_UNIVERSAL or ASN_CONSTRUCTOR or $10;
ASN_SEQUENCEOF = ASN_SEQUENCE;
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Application Syntax Values //
// //
///////////////////////////////////////////////////////////////////////////////
ASN_IPADDRESS = ASN_APPLICATION or ASN_PRIMITIVE or $00;
ASN_COUNTER32 = ASN_APPLICATION or ASN_PRIMITIVE or $01;
ASN_GAUGE32 = ASN_APPLICATION or ASN_PRIMITIVE or $02;
ASN_TIMETICKS = ASN_APPLICATION or ASN_PRIMITIVE or $03;
ASN_OPAQUE = ASN_APPLICATION or ASN_PRIMITIVE or $04;
ASN_COUNTER64 = ASN_APPLICATION or ASN_PRIMITIVE or $06;
ASN_UNSIGNED32 = ASN_APPLICATION or ASN_PRIMITIVE or $07;
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Exception Conditions //
// //
///////////////////////////////////////////////////////////////////////////////
SNMP_EXCEPTION_NOSUCHOBJECT = ASN_CONTEXT or ASN_PRIMITIVE or $00;
SNMP_EXCEPTION_NOSUCHINSTANCE = ASN_CONTEXT or ASN_PRIMITIVE or $01;
SNMP_EXCEPTION_ENDOFMIBVIEW = ASN_CONTEXT or ASN_PRIMITIVE or $02;
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Request Types (used in SnmpExtensionQueryEx) //
// //
///////////////////////////////////////////////////////////////////////////////
SNMP_EXTENSION_GET = SNMP_PDU_GET;
SNMP_EXTENSION_GET_NEXT = SNMP_PDU_GETNEXT;
SNMP_EXTENSION_GET_BULK = SNMP_PDU_GETBULK;
SNMP_EXTENSION_SET_TEST = ASN_PRIVATE or ASN_CONSTRUCTOR or $0;
SNMP_EXTENSION_SET_COMMIT = SNMP_PDU_SET;
SNMP_EXTENSION_SET_UNDO = ASN_PRIVATE or ASN_CONSTRUCTOR or $1;
SNMP_EXTENSION_SET_CLEANUP = ASN_PRIVATE or ASN_CONSTRUCTOR or $2;
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Error Codes //
// //
///////////////////////////////////////////////////////////////////////////////
SNMP_ERRORSTATUS_NOERROR = 0;
SNMP_ERRORSTATUS_TOOBIG = 1;
SNMP_ERRORSTATUS_NOSUCHNAME = 2;
SNMP_ERRORSTATUS_BADVALUE = 3;
SNMP_ERRORSTATUS_READONLY = 4;
SNMP_ERRORSTATUS_GENERR = 5;
SNMP_ERRORSTATUS_NOACCESS = 6;
SNMP_ERRORSTATUS_WRONGTYPE = 7;
SNMP_ERRORSTATUS_WRONGLENGTH = 8;
SNMP_ERRORSTATUS_WRONGENCODING = 9;
SNMP_ERRORSTATUS_WRONGVALUE = 10;
SNMP_ERRORSTATUS_NOCREATION = 11;
SNMP_ERRORSTATUS_INCONSISTENTVALUE = 12;
SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE = 13;
SNMP_ERRORSTATUS_COMMITFAILED = 14;
SNMP_ERRORSTATUS_UNDOFAILED = 15;
SNMP_ERRORSTATUS_AUTHORIZATIONERROR = 16;
SNMP_ERRORSTATUS_NOTWRITABLE = 17;
SNMP_ERRORSTATUS_INCONSISTENTNAME = 18;
///////////////////////////////////////////////////////////////////////////////
// //
// SNMPv1 Trap Types //
// //
///////////////////////////////////////////////////////////////////////////////
SNMP_GENERICTRAP_COLDSTART = 0;
SNMP_GENERICTRAP_WARMSTART = 1;
SNMP_GENERICTRAP_LINKDOWN = 2;
SNMP_GENERICTRAP_LINKUP = 3;
SNMP_GENERICTRAP_AUTHFAILURE = 4;
SNMP_GENERICTRAP_EGPNEIGHLOSS = 5;
SNMP_GENERICTRAP_ENTERSPECIFIC = 6;
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Access Types //
// //
///////////////////////////////////////////////////////////////////////////////
SNMP_ACCESS_NONE = 0;
SNMP_ACCESS_NOTIFY = 1;
SNMP_ACCESS_READ_ONLY = 2;
SNMP_ACCESS_READ_WRITE = 3;
SNMP_ACCESS_READ_CREATE = 4;
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP API Return Code Definitions //
// //
///////////////////////////////////////////////////////////////////////////////
type
SNMPAPI = integer;
// SNMP_FUNC_TYPE = WINAPI;
const
SNMPAPI_NOERROR = TRUE;
SNMPAPI_ERROR = FALSE;
Top
2 楼Kingron(单身走我路……)回复于 2002-04-28 00:41:51 得分 0
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Extension API Prototypes //
// //
///////////////////////////////////////////////////////////////////////////////
function SnmpExtensionInit(dwTimeZeroReference: DWORD; hPollForTrapEvent: HWND;
pFirstSupportedRegion: TAsnObjectIdentifier): Boolean; stdcall; external
Inetmib1 name 'SnmpExtensionInit';
function SnmpExtensionInitEx(pNextSupportedRegion: PAsnObjectIdentifier):
boolean; stdcall; external Inetmib1 name 'SnmpExtensionInitEx';
function SnmpExtensionQuery(bPduType: BYTE; pVarBindList: TSnmpVarBindList;
pErrorStatus: TAsnInteger32; pErrorIndex: TAsnInteger32): boolean; stdcall;
external Inetmib1 name 'SnmpExtensionQuery';
{
//// Under Function Can't Import becouse the DLL File Unknwon
function SnmpExtensionQueryEx(nRequestType: UINT; nTransactionId: UINT;
pVarBindList: TSnmpVarBindList; pContextInfo: TAsnOctetString; pErrorStatus:
TAsnInteger32; pErrorIndex: TAsnInteger32): boolean; stdcall; external Inetmib1
name 'SnmpExtensionQueryEx';
}
function SnmpExtensionTrap(pEnterpriseOid: TAsnObjectIdentifier; pGenericTrapId:
TAsnInteger32; pSpecificTrapId: TAsnInteger32; pTimeStamp: TAsnTimeticks;
pVarBindList: TSnmpVarBindList): boolean; stdcall; external Inetmib1 name
'SnmpExtensionTrap';
procedure SnmpExtensionClose; stdcall; external Igmpagnt name 'SnmpExtensionClose';
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Extension API Type Definitions //
// //
///////////////////////////////////////////////////////////////////////////////
type
PFNSNMPEXTENSIONINIT = function(dwUpTimeReference: DWORD; phSubagentTrapEvent:
THANDLE; pFirstSupportedRegion: TAsnObjectIdentifier): boolean; stdcall;
PFNSNMPEXTENSIONINITEX = function(pNextSupportedRegion: TAsnObjectIdentifier):
boolean; stdcall;
PFNSNMPEXTENSIONQUERY = function(bPduType: BYTE; pVarBindList: TSnmpVarBindList;
pErrorStatus: TAsnInteger32; pErrorIndex: TAsnInteger32): boolean; stdcall;
PFNSNMPEXTENSIONQUERYEX = function(nRequestType: UINT; nTransactionId: UINT;
pVarBindList: TSnmpVarBindList; pContextInfo: TAsnOctetString; pErrorStatus:
TAsnInteger32; pErrorIndex: TAsnInteger32): boolean; stdcall;
PFNSNMPEXTENSIONTRAP = function(pEnterpriseOid: TAsnObjectIdentifier;
pGenericTrapId: TAsnInteger32; pSpecificTrapId: TAsnInteger32; pTimeStamp:
TAsnTimeticks; pVarBindList: TSnmpVarBindList): boolean; stdcall;
PFNSNMPEXTENSIONCLOSE = procedure; stdcall;
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP API Prototypes //
// //
///////////////////////////////////////////////////////////////////////////////
function SnmpUtilOidCpy(pOidDst: TAsnObjectIdentifier; pOidSrc: TAsnObjectIdentifier):
SNMPAPI; stdcall external snmpapidll name 'SnmpUtilOidCpy';
function SnmpUtilOidAppend(pOidDst: TAsnObjectIdentifier; pOidSrc:
TAsnObjectIdentifier): SNMPAPI; stdcall; external snmpapidll name
'SnmpUtilOidAppend';
function SnmpUtilOidNCmp(pOid1: TAsnObjectIdentifier; pOid2: TAsnObjectIdentifier;
nSubIds: UINT): SNMPAPI; stdcall; external snmpapidll name 'SnmpUtilOidNCmp';
function SnmpUtilOidCmp(pOid1: TAsnObjectIdentifier; pOid2: TAsnObjectIdentifier):
SNMPAPI; stdcall; external snmpapidll name 'SnmpUtilOidCmp';
procedure SnmpUtilOidFree(pOid: TAsnObjectIdentifier); stdcall; external snmpapidll
name 'SnmpUtilOidFree';
function SnmpUtilOctetsCmp(pOctets1: TAsnOctetString; pOctets2: TAsnOctetString):
SNMPAPI; stdcall; external snmpapidll name 'SnmpUtilOctetsCmp';
function SnmpUtilOctetsNCmp(pOctets1: TAsnOctetString; pOctets2: TAsnOctetString;
nChars: UINT): SNMPAPI; stdcall; external snmpapidll name 'SnmpUtilOctetsNCmp';
function SnmpUtilOctetsCpy(pOctetsDst: TAsnOctetString; pOctetsSrc: TAsnOctetString):
SNMPAPI; stdcall; external snmpapidll name 'SnmpUtilOctetsCpy';
procedure SnmpUtilOctetsFree(pOctets: TAsnOctetString); stdcall; external snmpapidll
name 'SnmpUtilOctetsFree';
function SnmpUtilAsnAnyCpy(pAnyDst: TAsnAny; pAnySrc: TAsnAny): SNMPAPI; stdcall;
external snmpapidll name 'SnmpUtilAsnAnyCpy';
procedure SnmpUtilAsnAnyFree(pAny: TAsnAny); stdcall; external snmpapidll name
'SnmpUtilAsnAnyFree';
function SnmpUtilVarBindCpy(pVbDst: TSnmpVarBind; pVbSrc: TSnmpVarBind): SNMPAPI;
stdcall; external snmpapidll name 'SnmpUtilVarBindCpy';
procedure SnmpUtilVarBindFree(pVb: TSnmpVarBind); stdcall; external snmpapidll name
'SnmpUtilVarBindFree';
Top
3 楼Kingron(单身走我路……)回复于 2002-04-28 00:42:03 得分 0
function SnmpUtilVarBindListCpy(pVblDst: TSnmpVarBindList; pVblSrc: TSnmpVarBindList):
SNMPAPI; stdcall; external snmpapidll name 'SnmpUtilVarBindListCpy';
procedure SnmpUtilVarBindListFree(pVbl: TSnmpVarBindList); stdcall; external snmpapidll
name 'SnmpUtilVarBindListFree';
procedure SnmpUtilMemFree(pMem: pointer); stdcall; external snmpapidll name
'SnmpUtilMemFree';
function SnmpUtilMemAlloc(nBytes: UINT): pointer; stdcall; external snmpapidll name
'SnmpUtilMemAlloc';
function SnmpUtilMemReAlloc(pMem: pointer; nBytes: UINT): pointer; stdcall; external
snmpapidll name 'SnmpUtilMemReAlloc';
function SnmpUtilOidToA(Oid: TAsnObjectIdentifier): pchar; stdcall; external snmpapidll
name 'SnmpUtilOidToA';
function SnmpUtilIdsToA(Ids: UINT; IdLength: UINT): pchar; stdcall; external snmpapidll
name 'SnmpUtilIdsToA';
procedure SnmpUtilPrintOid(Oid: TAsnObjectIdentifier); stdcall; external snmpapidll
name 'SnmpUtilPrintOid';
procedure SnmpUtilPrintAsnAny(pAny: TAsnAny); stdcall; external snmpapidll name
'SnmpUtilPrintAsnAny';
function SnmpSvcGetUptime: DWORD; stdcall; external snmpapidll name
'SnmpSvcGetUptime';
procedure SnmpSvcSetLogLevel(nLogLevel: integer); stdcall; external snmpapidll name
'SnmpSvcSetLogLevel';
procedure SnmpSvcSetLogType(nLogType: integer); stdcall; external snmpapidll name
'SnmpSvcSetLogType';
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Debugging Definitions //
// //
///////////////////////////////////////////////////////////////////////////////
const
SNMP_LOG_SILENT = $0;
SNMP_LOG_FATAL = $1;
SNMP_LOG_ERROR = $2;
SNMP_LOG_WARNING = $3;
SNMP_LOG_TRACE = $4;
SNMP_LOG_VERBOSE = $5;
SNMP_OUTPUT_TO_CONSOLE = $1;
SNMP_OUTPUT_TO_LOGFILE = $2;
SNMP_OUTPUT_TO_EVENTLOG = $4; // no longer supported
SNMP_OUTPUT_TO_DEBUGGER = $8;
///////////////////////////////////////////////////////////////////////////////
// //
// SNMP Debugging Prototypes //
// //
///////////////////////////////////////////////////////////////////////////////
procedure SnmpUtilDbgPrint(nLogLevel: integer; // see log levels above...
szFormat: pchar); stdcall; external snmpapidll name 'SnmpUtilDbgPrint';
{$IFDEF DBG}
{$DEFINE SNMPDBG(_x_)SnmpUtilDbgPrint _x_}
{$ELSE}
{$DEFINE SNMPDBG(_x_)}
{$ENDIF}
///////////////////////////////////////////////////////////////////////////////
// //
// Miscellaneous definitions //
// //
///////////////////////////////////////////////////////////////////////////////
const
// DEFINE_SIZEOF=(array)(sizeof(array) / sizeof((array)[0]))
// DEFINE_OID(SubIdArray) {DEFINE_SIZEOF(SubIdArray),(SubIdArray)}
// DEFINE_NULLOID() {0,NULL}
// DEFINE_NULLOCTETS() {NULL,0,FALSE}
DEFAULT_SNMP_PORT_UDP = 161;
DEFAULT_SNMP_PORT_IPX = 36879;
DEFAULT_SNMPTRAP_PORT_UDP = 162;
DEFAULT_SNMPTRAP_PORT_IPX = 36880;
SNMP_MAX_OID_LEN = 128;
///////////////////////////////////////////////////////////////////////////////
// //
// API Error Code Definitions //
// //
///////////////////////////////////////////////////////////////////////////////
SNMP_MEM_ALLOC_ERROR = 1;
SNMP_BERAPI_INVALID_LENGTH = 10;
SNMP_BERAPI_INVALID_TAG = 11;
SNMP_BERAPI_OVERFLOW = 12;
SNMP_BERAPI_SHORT_BUFFER = 13;
SNMP_BERAPI_INVALID_OBJELEM = 14;
SNMP_PDUAPI_UNRECOGNIZED_PDU = 20;
SNMP_PDUAPI_INVALID_ES = 21;
SNMP_PDUAPI_INVALID_GT = 22;
SNMP_AUTHAPI_INVALID_VERSION = 30;
SNMP_AUTHAPI_INVALID_MSG_TYPE = 31;
SNMP_AUTHAPI_TRIV_AUTH_FAILED = 32;
///////////////////////////////////////////////////////////////////////////////
// //
// Support for old definitions (support disabled via SNMPSTRICT) //
// //
///////////////////////////////////////////////////////////////////////////////
{$IFNDEF SNMPSTRICT}
const
ASN_RFC1155_IPADDRESS = ASN_IPADDRESS;
ASN_RFC1155_COUNTER = ASN_COUNTER32;
ASN_RFC1155_GAUGE = ASN_GAUGE32;
ASN_RFC1155_TIMETICKS = ASN_TIMETICKS;
ASN_RFC1155_OPAQUE = ASN_OPAQUE;
ASN_RFC1213_DISPSTRING = ASN_OCTETSTRING;
ASN_RFC1157_GETREQUEST = SNMP_PDU_GET;
ASN_RFC1157_GETNEXTREQUEST = SNMP_PDU_GETNEXT;
ASN_RFC1157_GETRESPONSE = SNMP_PDU_RESPONSE;
ASN_RFC1157_SETREQUEST = SNMP_PDU_SET;
ASN_RFC1157_TRAP = SNMP_PDU_V1TRAP;
ASN_CONTEXTSPECIFIC = ASN_CONTEXT;
ASN_PRIMATIVE = ASN_PRIMITIVE;
type
RFC1157VarBindList = TSnmpVarBindList;
RFC1157VarBind = TSnmpVarBind;
AsnInteger = TAsnInteger32;
AsnCounter = TAsnCounter32;
AsnGauge = TAsnGauge32;
{$ENDIF} // SNMPSTRICT
implementation
end.Top
4 楼dong163(再见理想)回复于 2002-04-28 00:59:56 得分 0
收藏了Top
5 楼Kingron(单身走我路……)回复于 2002-04-28 01:01:54 得分 0
///下面单元是获取远程机器MAC的,但是有错误,请指点一下....
///测试调用代码:Caption:=GetRemoteMac('127.0.0.1');
unit RemoteMac;
interface
uses windows, sysutils, snmp, Winsock;
function GetRemoteMac(IP: pchar): pchar;
implementation
const
MIB_NULL : TAsnObjectIdentifier = (idLength: 0; ids: nil);
var
OID_ifEntryType : array[0..9] of UINT = (1, 3, 6, 1, 2, 1, 2, 2, 1, 3);
OID_ifEntryNum : array[0..7] of UINT = (1, 3, 6, 1, 2, 1, 2, 1);
OID_ipMACEntAddr : array[0..9] of UINT = (1, 3, 6, 1, 2, 1, 2, 2, 1, 6);
function GetRemoteMac(IP: pchar): pchar;
var
WinSockData : WSADATA;
MIB_ifMACEntAddr : TAsnObjectIdentifier;
MIB_ifEntryType : TAsnObjectIdentifier;
MIB_ifEntryNum : TAsnObjectIdentifier;
varBindList : TSnmpVarBindList;
varBind : array[0..1] of TSnmpVarBind;
errorStatus : AsnInteger;
errorIndex : AsnInteger;
ret : boolean;
dtmp : integer;
j : integer;
buff : string;
TempEthernet : string[13];
begin
result := 'FF.FF.FF.FF';
j := 0;
errorStatus := 0;
errorIndex := 0;
if WSAStartup(MakeWord(2, 0), WinSockData) <> 0 then
begin
MessageBox(0, '程序需要Winsock2以上版本', '信息', MB_OK + MB_ICONINFORMATION);
exit;
end;
MIB_ifMACEntAddr.idLength := sizeof(OID_ipMACEntAddr) div sizeof(UINT);
MIB_ifMACEntAddr.ids := @OID_ipMACEntAddr;
MIB_ifEntryType.idLength := sizeof(OID_ifEntryType) div sizeof(UINT);
MIB_ifEntryType.ids := @OID_ifEntryType;
MIB_ifEntryNum.idLength := sizeof(OID_ifEntryNum) div sizeof(UINT);
MIB_ifEntryNum.ids := @OID_ifEntryNum;
varBindList.len := 2;
// SetLength(varbindlist.List, varBindList.len);
VarBindList.list := @varBind;
varBind[0].name := MIB_NULL;
varBind[1].name := MIB_NULL;
// varBindList.len := 1; // Only retrieving one item
SnmpUtilOidCpy(varBind[0].name, MIB_ifEntryNum);
SnmpExtensionQuery(ASN_RFC1157_GETNEXTREQUEST, varBindList,
errorStatus, errorIndex);
Buff := Format('# of adapters in this system : %d',
[varBind[0].value.asnValue.number]);
MessageBox(0, pchar(Buff), '信息', MB_OK + MB_ICONINFORMATION);
varBindList.len := 2;
// Copy in the OID of ifType, the type of interface
SnmpUtilOidCpy(varBind[0].name, MIB_ifEntryType);
// Copy in the OID of ifPhysAddress, the address */
SnmpUtilOidCpy(varBind[1].name, MIB_ifMACEntAddr);
repeat
ret := SnmpExtensionQuery(ASN_RFC1157_GETNEXTREQUEST, varBindList,
errorStatus, errorIndex);
if not ret then
ret := True
else
{ Confirm that the proper type has been returned }
ret := boolean(SnmpUtilOidNCmp(varBind[0].name, MIB_ifEntryType,
MIB_ifEntryType.idLength));
if not ret then
begin
inc(j);
dtmp := varBind[0].value.asnValue.number;
Buff := Format('Interface #%d type : %d', [j, dtmp]);
MessageBox(0, pchar(buff), '信息', MB_OK + MB_ICONINFORMATION);
// Type 6 describes ethernet interfaces
if dtmp = 6 then
begin
// Confirm that we have an address here
ret := boolean(SnmpUtilOidNCmp(varBind[1].name, MIB_ifMACEntAddr,
MIB_ifMACEntAddr.idLength));
if (not ret) and (@varBind[1].value.asnValue.address.stream <> nil) then
begin
if (varBind[1].value.asnValue.address.stream[0] = $44) and
(varBind[1].value.asnValue.address.stream[1] = $45) and
(varBind[1].value.asnValue.address.stream[2] = $53) and
(varBind[1].value.asnValue.address.stream[3] = $54) and
(varBind[1].value.asnValue.address.stream[4] = $00) then
begin
buff := Format('Interface #%i is a DUN adapter', [j]);
MessageBox(0, pchar(buff), '信息', MB_OK + MB_ICONINFORMATION);
continue;
end;
if (varBind[1].value.asnValue.address.stream[0] = $00) and
(varBind[1].value.asnValue.address.stream[1] = $00) and
(varBind[1].value.asnValue.address.stream[2] = $00) and
(varBind[1].value.asnValue.address.stream[3] = $00) and
(varBind[1].value.asnValue.address.stream[4] = $00) and
(varBind[1].value.asnValue.address.stream[5] = $00) then
begin
/// Ignore NULL addresses returned by other network interfaces
Buff := Format('Interface #%i is a NULL address', [j]);
MessageBox(0, pchar(Buff), '信息', MB_OK + MB_ICONINFORMATION);
continue;
end;
TempEthernet := Format('%02x%02x%02x%02x%02x%02x',
[varBind[1].value.asnValue.address.stream[0],
varBind[1].value.asnValue.address.stream[1],
varBind[1].value.asnValue.address.stream[2],
varBind[1].value.asnValue.address.stream[3],
varBind[1].value.asnValue.address.stream[4],
varBind[1].value.asnValue.address.stream[5]]);
Buff := Format('MAC Address of interface #%i: %s', [j, TempEthernet]);
MessageBox(0, pchar(buff), '信息', MB_OK + MB_ICONINFORMATION);
end;
end;
end;
until ret;
SnmpUtilVarBindFree(varBind[0]);
SnmpUtilVarBindFree(varBind[1]);
end;
end.
Top
6 楼NetFair(2006,成功转型!从事市场工作!坚持技术市场两手抓,两手都要硬方针!)回复于 2002-04-28 01:34:09 得分 50
你为什么不看一下JEDI提供jclsysinfo.pas,里面有如何获得mac号,Top
7 楼Kingron(单身走我路……)回复于 2002-04-28 01:36:56 得分 0
哎,不是本地机器MAC,是远程机器MAC,支持TCP/IP的,不是LAN的。Top
8 楼xxmmmx(踢踏)回复于 2002-04-28 12:31:13 得分 0
/uuuuu..ppTop
9 楼hxshanji(洪兴山鸡)回复于 2002-04-28 12:55:19 得分 0
啊,老大的贴,帮不上忙。:(
只能收藏。。。。:)Top
10 楼CoolSlob()回复于 2002-04-28 13:07:36 得分 0
谢谢,收藏Top
11 楼ferrytang(欢迎你)回复于 2002-04-28 13:13:34 得分 50
www.myvc.net编程好望角征集斑竹
斑竹为admin的板块斑竹空缺中!
要求如下:
1.每天有一定的上网时间
2.对负责板块的技术有一定的解决问题的能力
3.有天天向上的学习精神
如发现本论坛由缺少的板块可留言给我
qq:13275013
mail:kayakat@sina.com
谢谢大家的捧场
欢迎你去www.myvc.net编程技术论坛
你可以在那里交流编程技术
注册用户请去以下帖子领分
http://www.csdn.net/expert/topic/682/682036.xml?temp=.5972101
http://www.csdn.net/expert/topic/681/681917.xml?temp=.5434992
http://www.csdn.net/expert/topic/676/676074.xml?temp=.9520075
http://www.csdn.net/expert/topic/641/641938.xml?temp=5.826968E-02Top
12 楼redwoodnymph(new)回复于 2002-04-28 13:34:20 得分 0
帮不上
收藏Top
13 楼firstshine(黑里透红)回复于 2002-04-28 16:42:10 得分 0
对这个问题思索中......Top
14 楼huang_2(叽叽喳喳)回复于 2002-05-02 08:41:46 得分 0
MAC是什么,苹果机?Top
15 楼shengs(你想猜赢我啊,边有禁鬼易,我猜!)回复于 2002-05-02 10:10:47 得分 0
我没有看你的代码,不如给个简单可行的代码你Top
16 楼chinakiss8848(似乎明白了)回复于 2002-05-02 12:02:03 得分 50
这有一个,你看看,我试了一下,如果对方机器没防火墙的话,可以反回完整的MAC及其他信息!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, winsock,
StdCtrls;
const
WM_SOCK = WM_USER + 1; //自定义windows消息
UDPPORT = 6767; //设定UDP端口号
NBTPORT = 137;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
s: TSocket;
addr: TSockAddr;
FSockAddrIn : TSockAddrIn; //利用消息实时获知UDP消息
procedure ReadData(var Message: TMessage); message WM_SOCK;
public
{ Public declarations }
procedure SendData(b:array of byte);
procedure GetInfo(buffer: Array of byte;len:integer);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
TempWSAData: TWSAData;
//optval: integer;
begin
// 初始化SOCKET
if WSAStartup($101, TempWSAData)=1 then
showmessage('StartUp Error!');
s := Socket(AF_INET, SOCK_DGRAM, 0);
if (s = INVALID_SOCKET) then //Socket创建失败
begin
showmessage(inttostr(WSAGetLastError())+' Socket创建失败');
CloseSocket(s);
end;
//本机SockAddr绑定
addr.sin_family := AF_INET;
addr.sin_addr.S_addr := INADDR_ANY;
addr.sin_port := htons(UDPPORT);
if Bind(s, addr, sizeof(addr)) <> 0 then
begin
showmessage('bind fail');
end;
WSAAsyncSelect(s, Form1.Handle , WM_SOCK, FD_READ);
//对方SockAddrIn设定
FSockAddrIn.SIn_Family := AF_INET;
FSockAddrIn.SIn_Port := htons(NBTPORT);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseSocket(s);
end;
procedure TForm1.GetInfo(buffer: Array of byte;len:integer);
var
str:string;
i,j,pos,name_num: integer;
begin
name_num:=0;
for i:=1 to len do
begin
if((buffer[i]=$21)and(buffer[i+1]=$00)and(buffer[i+2]=$01))
then
begin
name_num:=buffer[i+9];
break;
end;
end;
if name_num=0 then exit;
pos:=i+10;
str:='';
for i:=pos to (pos+18*name_num-1) do
begin
if (((i-pos)mod 18) =0) then
begin
for j:=0 to 14 do
begin
if trim(char(buffer[i+j]))='' then buffer[i+j]:=ord(' ');
str:=str+char(buffer[i+j]);
end;
if (buffer[i+16] and $80)=$80 then
begin
str:=str+format('<%x>',[buffer[i+15]]);
str:=str+'<GROUP>';
ListBox1.Items.Add(str);
end
else
begin
str:=str+format('<%x>',[buffer[i+15]]);
str:=str+'<UNIQUE>';
ListBox1.Items.Add(str);
end;
str:='';
end;
end;
for i:=0 to 5 do
begin
str:=str+format('%.2x.',[buffer[i+pos+18*name_num]]);
end;
delete(str,length(str),1);
str:='MAC:'+str;
ListBox1.Items.Add(str);
ListBox1.Items.Add('------------------------------------------------------');
ListBox1.TopIndex :=ListBox1.Items.count-1;
end;
procedure TForm1.ReadData(var Message: TMessage);
var
buffer: Array [1..500] of byte;
len{,i}: integer;
flen: integer;
Event: word;
value: string;
begin
value:='';
flen:=sizeof(FSockAddrIn);
FSockAddrIn.SIn_Port := htons(NBTPORT);
Event := WSAGetSelectEvent(Message.LParam);
if Event = FD_READ then
begin
len := recvfrom(s, buffer, sizeof(buffer), 0, FSockAddrIn, flen);
{for i:=1 to len do value:=value+format('%x',[buffer[i]]);
ListBox1.items.add(value);
value:='';
for i:=1 to len do if char(buffer[i])<>#0 then value:=value+char(buffer[i]);
ListBox1.items.add(value);}
if len<> 0 then GetInfo(buffer,len);
end;
end;
procedure TForm1.SendData(b:array of byte);
var
len: integer;
begin
FSockAddrIn.SIn_Addr.S_addr := inet_addr(pchar(edit1.text));
len := sendto(s, b[0],50, 0, FSockAddrIn, sizeof(FSockAddrIn));
//if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then showmessage(inttostr(WSAGetLastError()));
if len = SOCKET_ERROR then
showmessage('send fail');
if len <> 50 then
showmessage('Not Send all');
end;
procedure TForm1.Button1Click(Sender: TObject);
const NbtstatPacket:array[0..49]of byte
=($0,$0,$0,$10,$0,$1,
$0,$0,$0,$0,$0,$0,$20,$43,$4b,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$0,$0,$21,$0,$1);
begin
senddata(NbtstatPacket);
end;
end.
窗口加这三个控件:TButton;TListBox;TEdit;
Button1: TButton; ListBox1: TListBox; Edit1: TEdit;
联上3个过程:
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);Top
17 楼Kingron(单身走我路……)回复于 2002-05-02 12:12:39 得分 0
谢谢你!
UDP的我知道.......现在问题是SNMP的.........Top
18 楼chinakiss8848(似乎明白了)回复于 2002-05-02 12:16:35 得分 0
哦,那一起研究吧:)Top
19 楼erp2(天涯劍)回复于 2002-05-03 10:36:52 得分 0
gzTop
20 楼DJ_KK(想了很久@恋了很久)回复于 2002-05-03 21:04:15 得分 0
to:楼上
可以介绍一下erp吗Top
21 楼sonicdater(事过境迁,除了技术,我什么都没有了)回复于 2002-05-03 21:38:53 得分 50
下面是当年 VB 版讨论的帖子, 你去看看:
用什么方法可以获得远程机的MAC?
http://www.csdn.net/expert/topic/540/540347.xml?temp=.3365595
里面的难点是 如果用户使用 proxy ,如何 获得MAC 的问题。
帖子上没有解决这个问题。
最后,帖主是 通过写 在客户端 写 APPLET 来完成的 。
希望对你有帮助!
Top
22 楼xiaoxingchi(笨鸟)回复于 2002-05-04 09:32:03 得分 0
高手!Top
23 楼shengs(你想猜赢我啊,边有禁鬼易,我猜!)回复于 2002-05-04 11:38:41 得分 50
var
command:string;
begin
memo1.Lines.Clear ;
if fileexists(temp) then
deletefile(temp);
case radiogroup1.ItemIndex of
0: command:='command.com /C nbtstat '+'-a '+edit1.text+' > '+temp;
1: command:='command.com /C nbtstat '+'-A '+edit2.text+' > '+temp;
2: command:='command.com /C nbtstat '+'-n > '+temp;
end;
winexec(pchar(command),sw_hide);
while not fileexists(temp) do
sleep(3000);
try
memo1.lines.loadfromfile(temp);
end;Top
24 楼jockywin(好学友)回复于 2002-05-04 20:26:49 得分 0
very goodTop
25 楼smhpnuaa(天将降大任于斯人也!)回复于 2002-05-04 20:54:14 得分 0
做个记号!Top
26 楼kindman(清风)回复于 2002-05-06 08:56:08 得分 0
U P
* *
-Top
27 楼make11111(孙少平)回复于 2002-05-06 15:08:05 得分 0
gz!Top
28 楼cbyhenan(chen)回复于 2002-05-06 23:25:25 得分 0
我来看看
不错啊Top
29 楼ztg(小夭)回复于 2002-05-08 10:12:23 得分 50
SendArp 来获取Top
30 楼lz_0618(lz_0618)回复于 2002-05-08 16:30:06 得分 0
学习Top
31 楼victorchen_2000(微力)回复于 2002-05-08 20:10:21 得分 0
不要那么迂腐嘛。
干脆自己写个ping 不就得到了。Top
32 楼Kingron(单身走我路……)回复于 2002-05-10 18:35:04 得分 0
用Ping可以得到远程机器的MAC吗?Top
33 楼Kingron(单身走我路……)回复于 2002-05-28 16:31:43 得分 0
哎,算了,结贴.........Top




