我将以前写的一个logo函数unit给你吧,可以抓IP,网卡号,用户名,机器名称,呵呵,你想要的
都有,但是登录时间和退出时间是登录,退出自己系统而不是WINDOWS的.以面有用到其他单元
的,所以你得稍微改一下,将那几个去掉即可.以前写的,很烂,有的地方本有更好的方法,可我
懒得改了,若你改进后更好,麻烦贴出来,我好拿回去改掉.
unit uLogo;
interface
uses windows,classes,nb30,winsock,db,dbtables,Sysutils,mCommon;
const DataName = 'DM';
var QryLogin:TQuery;
LoginInTime:TDateTime;
function GetComputerName: string;
function GetCurIP: string;
function GetCurrentUserName : string;
procedure WriteLogin(LoginTimes:integer);
procedure WriteLogout;
Function HexBL(by:Byte):string;
procedure NBGetMac(Strings:TStrings);
implementation
uses DM,MyFunction;
Function GetCurrentUserName : string;
var
User : PChar;
Size : DWord;
begin
Size := 128;
GetMem(User, Size);
GetUserName(User, Size);
Result := Trim(StrPas(User));
FreeMem(User);
end;
function GetCurIP: string;
var
ch : ARRAY[1..32] OF Char;
i : Integer;
WSData: TWSAData;
MyHost: PHostEnt;
begin
IF WSAstartup(2,wsdata)<>0 then
begin
Result:='抓IP地址出錯';
Halt(2);
end;
try
IF getHostName(@ch[1],32)<>0 then
begin
Result:='抓IP地址出錯';
Halt(3);
end;
except
halt(3);
end;
MyHost:=GetHostByName(@ch[1]);
IF MyHost=NIL then
begin
Result:='抓IP地址出錯';
END
else
FOR i:=1 TO 4do
begin
Result:=Result+IntToStr(Ord(MyHost.h_addr^[i-1]));
IF i<4 then
Result:=Result+'.'
else
Result:=Result;
end;
end;
function GetComputerName: string;
var
ch : ARRAY[1..32] OF Char;
WSData: TWSAData;
begin
IF WSAstartup(2,wsdata)<>0 then
begin
Result:='抓IP地址出錯';
Halt(2);
end;
try
IF getHostName(@ch[1],32)<>0 then
begin
Result:='抓IP地址出錯';
Halt(3);
end;
except
halt(3);
end;
Result:= StrPas(@ch[1]);
end;
Function HexBL(by:Byte):string;
begin
Result:=Format('%x',[by]);
if Length(Result)<2 then
Result:='0'+Result;
end;
procedure NBGetMac(Strings:TStrings);
var
NCB:TNCB;
Adapter:TAdapterStatus;
LanaEnum:TLanaEnum;
I,J:integer;
Str:String;
begin
Strings.clear;
ZeroMemory(@NCB,SizeOf(NCB));
NCB.ncb_command:=Chr(NCBENUM);
NetBios(@NCB);
NCB.ncb_buffer:=@LanaEnum;
NCB.ncb_Length:=SizeOf(LanaEnum);
NCB.ncb_command:=Chr(NCBENUM);
NetBios(@NCB);
for i:=0 to Ord(LanaEnum.length)-1do
begin
ZeroMemory(@NCB,SizeOf(NCB));
NCB.ncb_command:=Chr(NCBRESET);
NCB.ncb_Lana_num:=LanaEnum.lana;;
NetBios(@NCB);
ZeroMemory(@NCB,SizeOf(NCB));
NCB.ncb_command:=Chr(NCBASTAT);
NCB.ncb_lana_num:=LanaEnum.lana;
StrPCopy(NCB.ncb_callname,'*');
NCB.ncb_buffer:=@Adapter;
NCB.ncb_length:=SizeOf(Adapter);
NetBios(@NCB);
str:='';
for j:=0 to 5do
begin
if j>0 then
Str:=Str+'-';
Str:=Str+HEXBL(Byte(Adapter.adapter_address[j]));
end;
Strings.add(str);
end;
end;
procedure WriteLogin(LoginTimes:integer);
var SysUserName:String;
IPAddress:string;
LogTime:string;
ComputerName:String;
sSQL:string;
AddressList:TStringList;
begin
AddressList:= TStringlist.Create;
NBGetMac(AddressList);
Address:=AddressList.Strings[0];
SysUserName:=GetCurrentUserName;
IPAddress:=GetCurIP;
ComputerName:=GetComputerName;
LoginInTime:=GetServerTime;
LogTime:=FormatDateTime('yyyy/mm/dd HH:MM:SS',LoginInTime);
sSQL:='insert into loginuser(user_name,sys_name,log_time,ip_address,net_address,log_name,com_name,status) values(';
sSQL:=sSQL+''''+UserName+''',';
sSQL:=sSQL+''''+UpperCase(CurSysID)+''''+',';
sSQL:=sSQL+'to_date('+''''+LogTime+''','+'''yyyy/mm/dd HH24:MI:SS'''+'),';
sSQL:=sSQL+''''+IPAddress+''''+',';
sSQL:=sSQL+''''+Address+''''+',';
sSQL:=sSQL+''''+SysUserName+''''+',';
sSQL:=sSQL+''''+Copy(ComputerName,1,15)+''''+',';
sSQL:=sSQL+''''+IntToStr(LoginTimes)+''''+')';
QryLogin:=TQuery.Create(nil);
QryLogin.DatabaseName:=DataName;
QryLogin.SQL.Add(sSQL);
try
QryLogin.ExecSQL;
finally
QryLogin.SQL.Clear;
QryLogin.Free;
end;
end;
procedure WriteLogout;
var LoginOutTime:TDateTime;
StrLTime,StrETime,UseTime:String;
sSQL:string;
begin
LoginOutTime:=GetServerTime;
StrETime:=FormatDateTime('yyyy/mm/dd hh:nn:ss',LoginOutTime);
StrLTime:=FormatDateTime('yyyy/mm/dd hh:nn:ss',LoginInTime);
UseTime:=FormatDateTime('hh:nn:ss',(LoginOutTime-LoginInTime));
sSQL:='update loginuser set exit_time=';
sSQL:=sSQL+'to_date('+''''+StrETime+''','+'''yyyy/mm/dd HH24:MI:SS'''+'),';
sSQL:=sSQL+'use_time='+''''+UseTime+'''';
sSQL:=sSQL+' where user_name='+''''+UserName+'''';
sSQL:=sSQL+' and log_Time=to_date('+''''+StrLTime+''','+'''yyyy/mm/dd HH24:MI:SS'''+')';
sSQL:=sSQL+' and net_Address='+''''+address+'''';
QryLogin:=TQuery.Create(nil);
QryLogin.DatabaseName:=DataName;
QryLogin.SQL.Add(sSQL);
if DM.PDM.DataBase.InTransaction then
DM.PDM.DataBase.Commit;
DM.PDM.DataBase.StartTransaction;
try
try
QryLogin.ExecSQL;
finally
QryLogin.SQL.Clear;
QryLogin.Free;
end;
except
DM.PDM.DataBase.Rollback;
exit;
end;
DM.PDM.DataBase.Commit;
end;
end.