征询解决方法 ( 积分: 300 )

  • 主题发起人 主题发起人 yaya8163
  • 开始时间 开始时间
http://javascript.internet.com/user-details/ip-address.html
 
自己作个程序,里面放个WEBBROWSER,然后用你的程序登录。
 
@ECHO OFF

REM Get IP Address
IPCONFIG /ALL | FIND "Physical Address" > TMP.TXT
FOR /F "TOKENS=1,2* DELIMS=:" %%A IN ('MORE TMP.TXT') DO (
SET IP=%%B
)
SET IP=%IP: =%
ECHO %IP%

HOSTNAME > TMP.TXT
FOR /F "TOKENS=1,2* DELIMS= " %%A IN ('MORE TMP.TXT') DO (
SET HOST=%%A
)
ECHO %HOST%

REM Delete Tmplate
IF EXIST TMP.TXT (
DEL TMP.TXT
)

SET IP=''
SET HOST=''
 
首先声明下,我不懂任何WEB语言.
1.公司每台内部电脑分配一个唯一的验证码,规定此验证码只能用于对应的机器.
2.利用cookie在对应的机器上保存此次登陆的IP, 同时网站数据库中也存下对应验证码的此次登陆IP;
3.下次登陆时,核对验证码,机器上保存的上次登陆IP,网站数据库保存的IP,正确则通过验证,否则记录下来,对不守规定的用户进行处罚.
4.如果 cookie被清除导致三个数据对不上号,可以先通过,并记录登陆时间等相关信息,如果员工不是在内部电脑中登陆,这会导致他下次在内部电脑上无法登陆.发现内部电脑无法登陆的,就查核上次登陆的相关信息.
当然,如果事后处罚已经过迟的话,发现Cookie被清除的现象,就要求用户安装一个插件来进行另一种验证了.这样要求安装插件的机率就小了很多很多了.
 
不知道我的理解对不对。
楼主说的问题是,公司的网站,处于一个网关或者NAT服务器上,公有网络可以访问,同时公司内部的私有网络也可以访问,现在的问题是区别公司内部的员工和公有网络上的访客,是这样吗?

如果是这样,据我所知,无法通过任何脚本语言来实现,因为浏览器的安全设置限制了。唯一的办法还是你最先用的2个版本,要么使用密码登录,要么使用ActiveX控件来获取相关信息并判断(当然了,这个问题和脚本的问题一样)。获取IP的意义好像不大,因为我猜的话,估计其他部门并非在一个私有网络内(LAN或其他),所以意义不大,ADSL的IP地址是随机变化的,即使采用IP段来判断,也有可能误判。

所以,最好的办法还是使用密码。我不知道为什么你们公司的领导不允许设置密码呢?[?]
 
"请误灌水"什么意思?
 
Delphi编写组件封装asp代码的基本步骤
如果你想脱离asp爱好者的水平,那么你就应该学会为asp编写组件。我在google上搜索了一下,Delphi编写asp组件的文章一共就几篇,所以今天写了这篇Delphi编写asp组件的基础文章,希望对新手有点帮助。
开始吧,让我们一起编写一个”hello world!”的示例。我这里用的是Delphi 7。
1.文件->新建->其他->ActiveX->ActiveX Library,然后保存成showdll.dpr
2.再次,文件->新建->其他->ActiveX->ActiveX Server Object,填写CoClassName:showhello,其他不变,点击ok。
3.现在开始写程序,先添加一个方法。选择Ishowhello->右键->New->Method,填写方法名称:sayworld。
4.现在开始写程序,将Unit1保存成show.pas,然后添加方法sayworld的代码
show.pas的全部代码如下:
unit show;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, AspTlb, showdll_TLB, StdVcl;
type
Tshowhello = class(TASPObject, Ishowhello)
protected
procedure OnEndPage; safecall;
procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
procedure sayworld; safecall; //sayworld方法
end;
implementation
uses ComServ;
procedure Tshowhello.OnEndPage;
begin
inherited OnEndPage;
end;
procedure Tshowhello.OnStartPage(const AScriptingContext: IUnknown);
begin
inherited OnStartPage(AScriptingContext);
end;
procedure Tshowhello.sayworld(); //定义sayworld方法
begin
response.Write('Hello world'); //里边的语法和asp一样的写法了,就在这里封装了。
end;
initialization
TAutoObjectFactory.Create(ComServer, Tshowhello, Class_showhello,
ciMultiInstance, tmApartment);
end.
4.点击运行,编译成dll, 并自动注册了。这时候会提示:
让你放到web服务器上运行,好了现在写个asp文件调用一下吧,注意Delphi已经生成了一个asp文件,我们改一下调用的方法就可以了。
修改后的showhello.asp代码如下:
<HTML>
<BODY>
<TITLE> Testing Delphi ASP </TITLE>
<CENTER>
<H3> You should see the results of your Delphi Active Server method below </H3>
</CENTER>
<HR>
<% Set DelphiASPObj = Server.CreateObject("showdll.showhello")
DelphiASPObj.sayworld
%>
<HR>
</BODY>
</HTML>
在iis的站点下运行看看效果吧:
5.其他:
Delphi编写的组件,用win2000的组件服务注册后可以看该组件的接口的方法
6.还有asp页面和组件间传递参数,其实就是给调用的方法(函数)传递参数,注意Delphi里定义的时候要和vbs 的数据类型一致。这些还是大家多实践吧。这里主要是想大家学会封装asp核心代码的方法,起个抛砖引玉的作用。
 
然後根據函數放到ASP組件,再調用你的標識:
{=================================================================
功 能: 取得電腦名稱
參 數: 無
返回值: 取得電腦名稱
=================================================================}
Function GetYouComputerName:String;
var
buffer : array[0..255] of char;
buffSize : DWORD;
Begin
buffSize := sizeOf(buffer);
GetComputerName(@buffer, buffSize);
Result:=Buffer;
End;

{=================================================================
功 能: 獲取IDE硬盤序列號
參 數: 無
返回值: 無
=================================================================}
Function GetHDDID : String;
type
TSrbIoControl = packed record
HeaderLength : ULONG;
Signature : Array[0..7] of Char;
Timeout : ULONG;
ControlCode : ULONG;
ReturnCode : ULONG;
Length : ULONG;
end;
SRB_IO_CONTROL = TSrbIoControl;
PSrbIoControl = ^TSrbIoControl;
TIDERegs = packed record
bFeaturesReg : Byte; // Used for specIfying SMART "commAnds".
bSectorCountReg : Byte; // IDE sector count register
bSectorNumberReg : Byte; // IDE sector number register
bCylLowReg : Byte; // IDE low order cylinder value
bCylHighReg : Byte; // IDE high order cylinder value
bDriveHeadReg : Byte; // IDE drive/head register
bCommAndReg : Byte; // Actual IDE commAnd.
bReserved : Byte; // reserved. Must be zero.
end;
IDEREGS = TIDERegs;
PIDERegs = ^TIDERegs;
TSendCmdInParams = packed record
cBufferSize : DWORD;
irDriveRegs : TIDERegs;
bDriveNumber : Byte;
bReserved : Array[0..2] of Byte;
dwReserved : Array[0..3] of DWORD;
bBuffer : Array[0..0] of Byte;
end;
SENDCMDINPARAMS = TSendCmdInParams;
PSendCmdInParams = ^TSendCmdInParams;
TIdSector = packed record
wGenConfig : Word;
wNumCyls : Word;
wReserved : Word;
wNumHeads : Word;
wBytesPerTrack : Word;
wBytesPerSector : Word;
wSectorsPerTrack : Word;
wVendorUnique : Array[0..2] of Word;
sSerialNumber : Array[0..19] of Char;
wBufferType : Word;
wBufferSize : Word;
wECCSize : Word;
sFirmwareRev : Array[0..7] of Char;
sModelNumber : Array[0..39] of Char;
wMoreVendorUnique : Word;
wDoubleWordIO : Word;
wCapabilities : Word;
wReserved1 : Word;
wPIOTiming : Word;
wDMATiming : Word;
wBS : Word;
wNumCurrentCyls : Word;
wNumCurrentHeads : Word;
wNumCurrentSectorsPerTrack : Word;
ulCurrentSectorCapacity : ULONG;
wMultSectorStuff : Word;
ulTotalAddressableSectors : ULONG;
wSingleWordDMA : Word;
wMultiWordDMA : Word;
bReserved : Array[0..127] of Byte;
end;
PIdSector = ^TIdSector;
const
IDE_ID_FUNCTION = $EC;
IDENTIfY_BUFFER_SIZE = 512;
DFP_RECEIVE_DRIVE_DATA = $0007c088;
IOCTL_SCSI_MINIPORT = $0004d008;
IOCTL_SCSI_MINIPORT_IDENTIfY = $001b0501;
DataSize = sizeof(TSendCmdInParams)-1+IDENTIfY_BUFFER_SIZE;
BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
W9xBufferSize = IDENTIfY_BUFFER_SIZE+16;
var
hDevice : THAndle;
cbBytesReturned : DWORD;
pInData : PSendCmdInParams;
pOutData : Pointer; // PSendCmdOutParams
Buffer : Array[0..BufferSize-1] of Byte;
srbControl : TSrbIoControl absolute Buffer;

Procedure ChangeByteOrder( var Data; Size : Integer );
var
ptr : PChar;
i : Integer;
c : Char;
Begin
ptr := @Data;
for i := 0 to (Size shr 1)-1 do
Begin
c:= ptr^;
ptr^ := (ptr+1)^;
(ptr+1)^ := c;
Inc(ptr,2);
end;
end;

Begin
Result := '';
FillChar(Buffer,BufferSize,#0);
If Win32Platform=VER_PLATFORM_WIN32_NT Then
Begin // Windows NT, Windows 2000
// Get SCSI port hAndle
hDevice := CreateFile( '//./Scsi0:',
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0 );
If hDevice=INVALID_HAndLE_VALUE Then Exit;
try
srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
System.Move('SCSIDISK',srbControl.Signature,8);
srbControl.Timeout := 2;
srbControl.Length := DataSize;
srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIfY;
pInData := PSendCmdInParams(PChar(@Buffer)
+SizeOf(SRB_IO_CONTROL));
pOutData := pInData;
with pInData^ do
Begin
cBufferSize := IDENTIfY_BUFFER_SIZE;
bDriveNumber := 0;
with irDriveRegs do
Begin
bFeaturesReg := 0;
bSectorCountReg := 1;
bSectorNumberReg := 1;
bCylLowReg := 0;
bCylHighReg := 0;
bDriveHeadReg := $A0;
bCommAndReg := IDE_ID_FUNCTION;
end;
end;
If not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT,
@Buffer, BufferSize, @Buffer, BufferSize,
cbBytesReturned, nil ) Then Exit;
finally
CloseHAndle(hDevice);
end;
end else
Begin // Windows 95 OSR2, Windows 98
hDevice := CreateFile( '//./SMARTVSD', 0, 0, nil,
CREATE_NEW, 0, 0 );
If hDevice=INVALID_HAndLE_VALUE Then Exit;
try
pInData := PSendCmdInParams(@Buffer);
pOutData := @pInData^.bBuffer;
with pInData^ do
Begin
cBufferSize := IDENTIfY_BUFFER_SIZE;
bDriveNumber := 0;
with irDriveRegs do
Begin
bFeaturesReg := 0;
bSectorCountReg := 1;
bSectorNumberReg := 1;
bCylLowReg := 0;
bCylHighReg := 0;
bDriveHeadReg := $A0;
bCommAndReg := IDE_ID_FUNCTION;
end;
end;
If not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA,
pInData, SizeOf(TSendCmdInParams)-1, pOutData,
W9xBufferSize, cbBytesReturned, nil ) Then Exit;
finally
CloseHAndle(hDevice);
end;
end;
with PIdSector(PChar(pOutData)+16)^ do
Begin
ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));
SetString(Result,sSerialNumber,SizeOf(sSerialNumber));
end;
end;

{=================================================================
功 能: 返回本機的局域網Ip地址
參 數: 無
返回值: 成功: True, 並填充LocalIp 失敗: False
=================================================================}
function GetLocalIP(var LocalIp: string): Boolean;
var
HostEnt: PHostEnt;
Ip: string;
addr: pchar;
Buffer: array [0..63] of char;
GInitData: TWSADATA;
begin
Result := False;
try
WSAStartup(2, GInitData);
GetHostName(Buffer, SizeOf(Buffer));
HostEnt := GetHostByName(buffer);
if HostEnt = nil then Exit;
addr := HostEnt^.h_addr_list^;
ip := Format('%d.%d.%d.%d', [byte(addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
LocalIp := Ip;
Result := True;
finally
WSACleanup;
end;
end;
 
yaya8163:

  已經做了一個實例發到你的郵箱裡。
 
后退
顶部