说到密码重置工作,最让管理员头疼,尤其每天需要修改或重置大量的密码;大家都了解,Domino密码分为notes密码和Internet密码;两个密码是不一样的,但是可以设置让两个密码同步;默认是不同步的;我们公司使用的是Domino8.5.1,但是收发邮件是通过outlook进行配置收发,而不是notes client,所以呢,管理员重置密码需要通过notes 控制台打开names.nsf,搜索到需要重置密码的人员,然后编辑---Internet密码---输入新的密码确认保存就可以了;我们公司的人员太多,而且比较乱,很多人老忘记自己的邮箱密码,几乎每天管理员重置20个用户密码;
公司有AD域用户密码和Domino邮箱密码,导致很多用户分不清两个密码的用途,经常打电话、发邮件咨询,并且有大多数用户直接发邮件重置密码,这样以来就给管理员的工作带来很大负担,所以呢,我们就想通过其他方式来减轻管理员的日常维护工作;想让域的密码和domino密码同步,当用户更改域密码后,邮箱密码随之也更改,之前试过很多方法(ADSync不自动同步密码、AD单点登录解决不了邮箱别名问题)最后都失败了,最终通过web方式觉得还是可行的。
大概思路是这样的:
1. 部署web方式重置Domino的Internet密码URL
2. 部署web方式修改域用户的密码URL
3. 禁用邮箱inotes功能----internet密码更改功能;
4. 将域密码更改URL跟Domino的web方式重置密码的URL关联,当用户通过web方式更改完域密码后,后台自动重置对应的邮箱密码,这样就统一了
今天主要介绍第一步;域密码和邮箱密码的统一将在下一章介绍。
一、环境介绍
1. 通过3台服务器来实现该功能(一台服务器也行)
2. 通过web方式重置不同邮件服务器上的用户密码;
二、操作过程
1.启用服务器的web邮箱登陆功能;需要创建iwaredir.nsf、domcfg.nsf数据库进行配置
2.创建类型为空的数据库,同时创建表单、代理程序(为了安全起见,也可以直接在names.nsf数据库上进行配置)
3.测试web方式重置邮箱密码功能
4.统计通过web方式重置用户密码的次数;
三、测试结果
1.测试web方式重置密码功能的稳定性、可执行性
2.测试web方式重置用户密码的次数的可用性
一、环境介绍:
Hostname:iio-dc.iiosoft.com
Ip:10.1.1.254
Domain:iiosoft.com
Roles:DC、dns、dhcp
Hostname:iio-mail01.iiosoft.com
Ip:10.1.1.11
Roles:Domino9 server
Hostname:iio-mail02. iiosoft.com
Ip:10.1.1.12
Roles:Domino9 server
两台Domino server
测试用户
Iio-mail01:user01
Iio-mail02:user02
启用web邮箱登陆:
通过iwariedir.ntf模板创建iwaredir.nsf
通过domcfg5.ntf模板创建domcfg.nsf
设置HTTP映射,指向iwaredir.nsf
设置服务器单点登陆
通过服务器的FQDN就可以正常访问了;因为我通过desinger编写了domcfg.nsf这个数据库,添加图片及文字信息;具体配置见本文博客中
Domino更改密码链接
http://iio-mail01.iiosoft.com/names.nsf?changepassword
更改密码时需要输入旧密码才能输入新密码;
更改密码时需要验证
二、我们需要通过代理实现web方式重置密码链接
我们的思路是创建一个单独的数据库,然后在数据库上创建代理、表单等;当然也可以直接在names.nsf数据库上直接操作,但是这样不保险,所以建议还是在单独的数据库上操作;
在此我们通过desinger创建新的数据库进行操作,具体见下:
通过desinger控制台----文件---应用程序---新建
该操作也可以通过names.nsf控制台下用同样的方式创建,创建完后,只需要通过desinger打开即可;
创建一个名为:ChgUpwd.nsf,类型为空的数据库
接下来在该数据库下创建表单:
表单名称:internetpwd
接下来,我们需要创建表单下的显示信息:新建域值:
创建----域
域名称:Form
在Form域下的Default value:---“internetpwd”(填写表单名称)
再新建用户名及密码的域值,方法同上
用户名:Username
新密码:Userpassword
接下来再创建一个重置密码的按钮
运行类型选择:web---script
然后在onclick填写:document.forms[0].submit()
显示的表单已创建完成;
同时修改对象信息:
webquerySave=====填写代理名称:ChgUserpwdAgent
为了显示页面好看,我们排版格式:
填写以下字段即可
编辑好模板后,我们需要将代码编辑成内置的HTML,不然会在页面下显示;
所以选择代码后----文本---勾选内置HTML
该改后,样式变成以下状态
为了显示时间,我在该表单继续添加时间域
Default value:@Text (@Now)
表单创建完后,我们开始创建代理程序:
代码---代理---新建代理
代理名称:修改用户名密码------一定要注意别名的名称,会在代码中用到
别名:ChgUserPwdAgent
注释:ChgUserPwdAgent
代理创建完成
在Declaration下添加以下代码:
1
2
3
4
5
6
|
Dim session As NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim namesdb As NotesDatabase
Dim namesdoc As NotesDocument
Dim namesview As NotesView
|
然后将以下代码添加到Initialize处即可;
代码解释:通过username、shortname来判断用户是否在names.nsf数据中下;
如果用户不在数据库中,就会提示找不到用户,重置失败;、
如果用户在数据库中,就会提示重置成功。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
Sub Initialize
On Error GoTo err_handle
Dim flag As
Boolean
Dim mstring As
String
Dim arr As Variant
Set session = New NotesSession
Set db = session.Currentdatabase
Set doc = session.Documentcontext
Set namesdb = New NotesDatabase(
""
,
"names.nsf"
)
flag = False
If Not namesdb.Isopen Then
MsgBox
"您无权限修改,请联系管理员"
Print |<script type=
'text/javascript'
>
alert(
"您无权限修改,请联系管理员"
");
window.location =
"http://iio-mail01.iiosoft.com/ChgUpwd.nsf/|+doc.Form(0)+|?OpenForm"
;
</script>|
Exit sub
End If
Set namesview = namesdb.Getview(
"People"
)
Set namesdoc = namesview.Getfirstdocument()
While Not namesdoc Is Nothing
arr = namesdoc.Getitemvalue(
"ShortName"
)
MsgBox join(arr,
"=="
)
MsgBox IsNull(ArrayGetIndex(arr,doc.UserName(
0
),
0
))
If not isnull(arraygetindex(arr,doc.UserName(
0
))) then
'If namesdoc.ShortName(0) = doc.UserName(0) Then '
判断names库中的shortname和输入的用户名是否相同
flag = True
mstring =
"@Password("
""
+ doc.UserPassword(
0
) +
""
")"
'使用Domino公式给输入密码进行加密处理
namesdoc.HTTPPassword = Evaluate(mstring)
namesdoc.HTTPPassword = Now
Call namesdoc.save(True,True)
Call doc.save(True,True)
End If
Set namesdoc = namesview.Getnextdocument(namesdoc)
Wend
If flag Then
Print |<script type=
'text/javascript'
>
alert(
"密码修改成功,5分钟左右生效"
);
window.location =
"http://iio-mail01.iiosoft.com/ChgUpwd.nsf/|+doc.Form(0)+|?OpenForm"
;
//window.close();
//var url = "http://iio-mail01.iiosoft.com/ChgUpwd.nsf/|+doc.Form(0)+|?OpenForm";
//window.open(url);
</script>|
Else
Print |<script type=
'text/javascript'
>
alert(
"用户名不存在,修改失败!"
);
window.location =
"http://iio-mail01.iiosoft.com/ChgUpwd.nsf/|+doc.Form(0)+|?OpenForm"
</script>|
End If
Exit Sub
err_handle:
MsgBox session.Currentdatabase.Filepath + session.Currentagent.name
MsgBox Error
MsgBox Erl
End Sub
|
代码编辑好后,---属性---基本----目标---选择无
代码下安全---选择不允许首先操作
因为考虑到安全性,所以需要为执行该操作的人员添加权限;
权限的添加就是数据库(ChgUpwd)ACL的访问控制;将需要有操作权限的用户添加---个人---管理员即可
同时修改服务器配置,服务器默认不允许任何代理程序运行;
服务器文档配置---安全----* (星号)即可
三、测试web方式重置邮箱密码
因为刚才看见数据库权限,gavin、administrator有重置的权限;
所以在重置前需要验证一次;在此我通过administator验证
验证通过;现在我们看见的页面就是web方式重置邮箱密码的页面;我们只需要在用户名下输入需要重置密码的用户、同时在新密码处填写需要重置的密码,然后单击重置密码即可
因为我们环境内创建了user01、user02用户,这些用户分别在不同的服务器上
接下来我们将用户user01的密码重置为12345678;
单击重置密码---提示成功
接下来我们测试看用户的密码重置是否有效;
通过telnet iio-mail01.iiosoft.com 110
User user01
Pass 12345678
如果显示ok说明用户验证通过,及显示该用户所有的邮件数量
因为在工作中有邮箱别名的问题;所以我们还需要对别名做验证、搜索等,脚本内已经添加该功能;日常中我们别名的做法是;
User01用户新建别名testuser01,以至testuser01可以通过user01、testuser01等信息验证
其实通过testuser01也可以通过密码12345678也能通过验证及访问:
因为testuser01是user01的邮箱别名
接下来我们再通过重置别名进行测试;testuser01
重置成功
验证登陆
同时通过搜索的方式在names下查找用户;如果用户不存在就会提示用户不存在,密码修改失败;
我们发现重置密码的时候所输入的密码是明文的,我们也可以修改该密码域值进行实现密码隐藏;需要将该域值的属性—类型从文本----密码即可
密码不显示了
四、通过web方式统计重置密码次数的用户
接下来统计重置密码的时间及次数
1.打开试图------无标题;默认的试图;
所以我们需要重命名利用即可
试图名称:ListView
双击#处,可添加内容
我们填写用户名
名称写username
列值—选择域
试图选择-----选择公式--------------Select Form=“intnetpwd” (表单名称)
然后用同样的方法添加时间:Time
为了方便维护统计信息,重新创建一个表单:RTPTable
样式:dsiplay:none
然后在该表单下填写:统计信息的代理名称:GetUserTotalAgent
document.getElementById("divshow").innerHTML = document.getElementById("RTFTable").value
在创建用户次数代理程序:
Dim session As NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim namesdb As NotesDatabase
Dim olddoc As NotesDocument
Dim view As NotesView
Dim strhtml AsString
Dim namesdoc As NotesDocument
Dim namesview As NotesView
Dim dc As NotesDocumentCollection
Sub Initialize
OnErrorGoTo err_handle
Dim arr AsVariant
Dim i AsInteger
Dim tmp AsInteger
Set session = New NotesSession
Set db = session.Currentdatabase
Set doc = session.Documentcontext
strhtml = ""
Set namesdb = New NotesDatabase("","names.nsf")
Set view = db.Getview("ListByPsnView")
Set olddoc = view.Getfirstdocument()
Set namesview = namesdb.Getview("People")
Set namesdoc = namesview.Getfirstdocument()
WhileNot namesdoc IsNothing
tmp = 0
arr = namesdoc.Getitemvalue("ShortName")
For i = 0ToUBound(arr)
If arr(i) <> ""Then
Set dc = view.Getalldocumentsbykey(arr(i), true)
tmp = tmp + dc.Count
EndIf
Next
strhtml = strhtml +|<tr><td>|+Join(arr,",")+|</td><td>|+CStr(tmp)+|</td></tr>|
Set namesdoc = namesview.Getnextdocument(namesdoc)
Wend
strhtml = |<table><tr><td>用户名</td><td>次数</td></tr>|+strhtml+|</table>|
Call doc.Replaceitemvalue("RTFTable", strhtml)
ExitSub
err_handle:
MsgBox session.Currentdatabase.Filepath + session.Currentagent.name
MsgBoxError
MsgBoxErl
EndSub
通过测试结果如下:
本文转自 高文龙 51CTO博客,原文链接:http://blog.51cto.com/gaowenlong/1341149,如需转载请自行联系原作者