PDA

View Full Version : 请教:如何获得访问服务器客户机的ip地址


网上邻居
02-08-06, 10:28 AM
如题,谢谢,谢谢,谢谢,字数不知道够不够

网上邻居
02-08-06, 01:13 PM
长颈同志骗人,根本木有热心会员回复,billingclass?记帐,能记下ip吗?

[ 本帖最后由 网上邻居 于 2006-8-2 01:15 PM 编辑 ]

死扛Lotus
02-08-06, 02:27 PM
用这个域吧
Remote_Addr

网上邻居
02-08-06, 03:38 PM
原帖由 死扛Lotus 于 2006-8-2 02:27 PM 发表
用这个域吧
Remote_Addr
传说中,高人总是一语道破天机.
只是,俺资质愚钝,只能看图索冀或者按照1,2,3步骤做事,还请楼上详细讲解,十分谢谢,:L

长颈叔叔
02-08-06, 09:24 PM
建一个计算域,计算域值为Remote_Addr ,这样就会在客户端访问时,自动记录客户IP。这个功能只在B/S下生效。

ps: 俺不是出家人,但也不打诳语

网上邻居
02-08-06, 10:37 PM
谢谢啦!长颈“上小又上小又”,等我明天试了,在向您汇报
ps:顺便拍拍版主马屁,如下图

网上邻居
02-08-06, 11:42 PM
c/s模式不行?晕~~~~~~~~~~~~~~~~

dsieyx
03-08-06, 09:01 AM
c/s下还要取得ip干吗.....?不都是局域网吗..... :L

网上邻居
03-08-06, 10:40 AM
原帖由 dsieyx 于 2006-8-3 09:01 AM 发表
c/s下还要取得ip干吗.....?不都是局域网吗..... :L
局域网里N(N>=1000)多机器。一个部门用一个id,本部门员工pc机上都有本部门的id,想知道从某个部门发的邮件,具体来自哪台pc。不查询p地址,能返回主机名也行。看到网上说用java代理实现,不知道是否可以?
又差点忘了版规,谢谢!

[ 本帖最后由 网上邻居 于 2006-8-3 10:41 AM 编辑 ]

网上邻居
03-08-06, 11:45 PM
论坛里外翻个遍,结果如下
1:Q: 我们公司有人盗用了IDS文件冒充别人乱发邮件,请问如何能查到发送邮件者的IP地址阿?
A:直接查ip我不清楚,不過在服務器上的個人文檔中的管理頁面,可以看到用戶端的電腦名稱,notes版本等相關信息.根據這些,應該可以查到相應的電腦吧.
如果此用户正在使用的话,管理员可以在控制台上录入:sh user debug 回车,然后打开log.nsf 文件,按姓名查找就可以看到使用此ID文件的IP地址。

例如:
[01333] *****/user/*****(11) TCPIP: 10.221.2.59:1191
mail/*****.nsf 11
[01334] *****/user/*****(15) TCPIP: 10.227.1.40:1158
mail/*****.nsf 15
[01335] *****/user/*****(4) TCPIP: 10.11.82.246:1116
mail/*****.nsf 4
[01336] *****/user/*****(166) TCPIP: 10.68.8.211:1590
Q:Lotus Domino server控制台中,那些记录可以自动保存下来的吗?应该怎样做呢?
A:我用过命令:sh user debug 真的可以把 IP找出来了。但有没有方法做到:每隔十分钟就执行一次那命令呢?然后把Lotus Domino server中的结果全部自动地保存下来呢??
打开log.nsf(数据库-打开,)可以看到(真的吗,待定)
3:用代理写的一段Java程序来实现的,查询ip,(这个是在b/s模式下还是c/s模式下,我不知道)import lotus.domino.*;
import java.net.*;

public class JavaAgent extends AgentBase {

public void NotesMain() {

try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
//获取IP
String address=InetAddress.getLocalHost().getHostAddress();
//将IP写入IPaddress
Database db = agentContext.getCurrentDatabase();
Document doc = db.createDocument();
doc.replaceItemValue("Form", "MySecondForm");
doc.replaceItemValue("IPaddress","你的IP地址是:" + address);
doc.save();
} catch(Exception e) {
e.printStackTrace();
}
}
}
4: 有个billingClass 的ini参数,

语法:BillingClass=类
描述:指定下列六类记帐活动中的一个或多个:
代理
数据库
文档
HttpRequest
邮件
复制
会话
记帐进程仅跟踪您在 BillingClass 变量中指定的活动。
适用于:服务器
缺省:无
等价的用户界面:无,但可以在 Domino 目录的“配置设置”文档的“NOTES.INI 设置”附签中指定此设置。
另请参阅
設定計費功能

您可編輯 NOTES.INI 檔以設定計費功能。在 NOTES.INI 檔中,輸入指令以啟動「計費」作業、指定要追蹤的計費類型及指定將計費記錄儲存在何處。

您可以指示 Domino 將計費記錄儲存在 Notes 資料庫、二進位檔或兩者中。若指定 Notes 資料庫,Domino 會使用範本 BILLING.NTF 來建立資料庫,並將其命名為 BILLING.NSF。「計費」作業會將計費記錄從訊息等待佇列中傳送到計費資料庫中的文件。若指定二進位檔,Domino 會建立 BILLING.NBF 檔。「計費」作業會將計費記錄以串列格式,從訊息等待佇列傳送到 BILLING.NBF。因為每一筆計費記錄都以長度及結構類型起首,所以您用來讀取計費記錄的程式便能輕易地剖析檔案。

1. 編輯在 NOTES.INI 檔中的 ServerTasks 設定值,以納入「計費」作業。例如,指令行可寫成:
ServerTasks=Replica,Router,Update,Stats,Billing
2. 將此行新增到 NOTES.INI 檔中,以指定要追蹤的計費類別:
BillingClass=list(list具体应该是?) 其中 list 包含下列一或多項:代理程式、資料庫、文件、HTTPRequest、郵件、抄寫、階段作業。
3. 將此行新增到 NOTES.INI 檔中,以指定儲存計費資訊的位置:
BillingAddinOutput=n
其中 n 是下列其中一項:
1 是將記錄儲存在 Notes 資料庫
2 是將記錄顯示在伺服器控制台
8 是將記錄儲存在二進位檔
9 是將記錄儲存在資料庫及二進位檔
您可將 2 加到各個號碼中,以合併該選項和在伺服器控制台中顯示記錄。例如,3 是將記錄儲存在 Notes 資料庫,並同時在伺服器的控制台中顯示記錄。

但有观众说
以上是Notes 的说明,按照三个步骤设定后.只是产生了BILLING.NSF 但是里面一直都没有一笔记录.查看服务器的活动: billing 好像一直都是idle.




原创)C/S结构下用Java代理获取客户端的IP地址,供大家参考并欢迎补充或优化!(若需装载请注明作者:tianzl)
Java代理名称:getIP
代理的作用:当某一用户提交一个新文档后,在文档里面记录该用户的IP地址!
测试环境: C/S结构;Domino/Notes5.07中文版;调试成功!(真的?怎么测试,在哪里运行此程序啊)
表单里面设一文本域ipaddress,初始值设为0,提交时将其值设为1(提交时设为1是为了java代理能够找到并定位到该文档)。文档保存后调用代理getIP。
//Java代理gatIP
import lotus.domino.*;
import java.net.*;
public class JavaAgent extends AgentBase {
InetAddress IP=null;
String ipaddress;
//取得本机IP地址的函数
public String getIP(){
try { IP=InetAddress.getLocalHost();}
catch (UnknownHostException e) {}
ipaddress=IP.getHostAddress();
return(ipaddress);
}
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
// (Your code goes here)
JavaAgent localIP;
localIP=new JavaAgent();
//定位到刚提交的文档并写入IP地址
Database db = agentContext.getCurrentDatabase();
DocumentCollection collection=db.search("@IsAvailable(ipaddress)");
Document doc=collection.getFirstDocument();
while(doc !=null){
ipaddress = doc.getItemValueString("ipaddress");
if( ipaddress=="1" ){
ipaddress=localIP.getIP();
doc.replaceItemValue("ipaddress",ipaddress);
doc.save();}
doc = collection.getNextDocument();
}
} catch(Exception e) {
e.printStackTrace();}
}
}
4: 可以启动BILLING,进行实施监控,在管理下选择"服务器"->"状态"->"服务器任务"选择数据库任务,点击右边工具下的任务->开始 就OK了。
5: 如何取得访问的IP地址?在C/S模式下有人用过吗?谢谢
用 VB 或 Delphi 等等写个小程序
然后下载到 Client 本地执行,回写到服务器文档中,读文档……
好像笨了点 :(
可以取得IP地址,但必须要在客户端放置一个文件。(每个客户端都要放吗,工作量也挺大啊)


网上找的
CODE:
贴出我的全程序:
1)申明:
Private Const WS_VERSION_REQD = &H101
Private Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF&
Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
Private Const MIN_SOCKETS_REQD = 1
Private Const SOCKET_ERROR = -1
Private Const WSADescription_Len = 256
Private Const WSASYS_Status_Len = 128
Private Type HOSTENT
hName As Long
hAliases As Long
hAddrType As Integer
hLength As Integer
hAddrList As Long
End Type
Private Type WSADATA
wversion As Integer
wHighVersion As Integer
szDescription(0 To WSADescription_Len) As Byte
szSystemStatus(0 To WSASYS_Status_Len) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpszVendorInfo As Long
End Type
Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
Declare Function WSAStartup Lib "WSOCK32.DLL" (Byval wVersionRequired&, lpWSAData As WSADATA) As Long
Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
Declare Function gethostbyname Lib "WSOCK32.DLL" (Byval hostname$) As Long
Declare Sub RtlMoveMemory Lib "KERNEL32" (hpvDest As Any, Byval hpvSource&, Byval cbCopy&)
2)方法:
Function hibyte(Byval wParam As Integer)
hibyte = wParam \ &H100 And &HFF&
End Function
Function lobyte(Byval wParam As Integer)
lobyte = wParam And &HFF&
End Function
Sub SocketsInitialize()
Dim WSAD As WSADATA
Dim iReturn As Integer
Dim sLowByte As String, sHighByte As String, sMsg As String
iReturn = WSAStartup(WS_VERSION_REQD, WSAD)
If iReturn <> 0 Then
Msgbox "Winsock.dll is not responding."
End
End If
If lobyte(WSAD.wversion) < WS_VERSION_MAJOR Or (lobyte(WSAD.wversion) = WS_VERSION_MAJOR And hibyte(WSAD.wversion) < WS_VERSION_MINOR) Then
sHighByte = Trim$(Str$(hibyte(WSAD.wversion)))
sLowByte = Trim$(Str$(lobyte(WSAD.wversion)))
sMsg = "Windows Sockets version " & sLowByte & "." & sHighByte
sMsg = sMsg & " is not supported by winsock.dll "
Msgbox sMsg
End
End If
If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then
sMsg = "This application requires a minimum of "
sMsg = sMsg & Trim$(Str$(MIN_SOCKETS_REQD)) & " supported sockets."
Msgbox sMsg
End
End If
End Sub
Sub SocketsCleanup()
Dim lReturn As Long
lReturn = WSACleanup()
If lReturn <> 0 Then
Msgbox "Socket error " & Trim$(Str$(lReturn)) & " occurred in Cleanup "
End
End If
End Sub
3)、获得IP
Sub Click(Source As Button)
Dim hostent_addr As Long
Dim host As HOSTENT
Dim hostip_addr As Long
Dim temp_ip_address() As Byte
Dim i As Integer
Dim ip_address As String
hostent_addr = gethostbyname(Text1)
If hostent_addr = 0 Then
Msgbox "Can't resolve name."
Exit Sub
End If
RtlMoveMemory host, hostent_addr, Lenb(host)
RtlMoveMemory hostip_addr, host.hAddrList, 4
Redim temp_ip_address(1 To host.hLength)
RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength
For i = 1 To host.hLength
ip_address = ip_address & temp_ip_address(i) & "."
Next
ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)
Msgbox ip_address
End Sub

以上方法有可行的吗?

[ 本帖最后由 网上邻居 于 2006-8-3 11:50 PM 编辑 ]

renxiao2
08-08-07, 02:11 PM
偶是个菜鸟,看你们讨论过来学习学习 谢谢了