Domino9下通过代理实现WEB方式重置Internet密码

说到密码重置工作,最让管理员头疼,尤其每天需要修改或重置大量的密码;大家都了解,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

p_w_picpath

测试用户

Iio-mail01:user01

Iio-mail02:user02

p_w_picpath

启用web邮箱登陆:

通过iwariedir.ntf模板创建iwaredir.nsf

通过domcfg5.ntf模板创建domcfg.nsf

p_w_picpath

设置HTTP映射,指向iwaredir.nsf

p_w_picpath

设置服务器单点登陆

p_w_picpath

通过服务器的FQDN就可以正常访问了;因为我通过desinger编写了domcfg.nsf这个数据库,添加图片及文字信息;具体配置见本文博客中

p_w_picpath

Domino更改密码链接

http://iio-mail01.iiosoft.com/names.nsf?changepassword

p_w_picpath

更改密码时需要输入旧密码才能输入新密码;

p_w_picpath

更改密码时需要验证

二、我们需要通过代理实现web方式重置密码链接

我们的思路是创建一个单独的数据库,然后在数据库上创建代理、表单等;当然也可以直接在names.nsf数据库上直接操作,但是这样不保险,所以建议还是在单独的数据库上操作;

在此我们通过desinger创建新的数据库进行操作,具体见下:

通过desinger控制台----文件---应用程序---新建

该操作也可以通过names.nsf控制台下用同样的方式创建,创建完后,只需要通过desinger打开即可;

p_w_picpath

创建一个名为:ChgUpwd.nsf,类型为空的数据库

p_w_picpath

接下来在该数据库下创建表单:

p_w_picpath

表单名称:internetpwd

p_w_picpath

p_w_picpath

接下来,我们需要创建表单下的显示信息:新建域值:

创建----域

p_w_picpath

域名称:Form

p_w_picpath

在Form域下的Default value:---“internetpwd”(填写表单名称)    
p_w_picpath

再新建用户名及密码的域值,方法同上

用户名:Username

新密码:Userpassword

p_w_picpath

接下来再创建一个重置密码的按钮

创建----热点---按钮  
p_w_picpath

运行类型选择:web---script

然后在onclick填写:document.forms[0].submit()

p_w_picpath

显示的表单已创建完成;

同时修改对象信息:

webquerySave=====填写代理名称:ChgUserpwdAgent

p_w_picpath

为了显示页面好看,我们排版格式:

填写以下字段即可

p_w_picpath

编辑好模板后,我们需要将代码编辑成内置的HTML,不然会在页面下显示;

所以选择代码后----文本---勾选内置HTML

p_w_picpath

该改后,样式变成以下状态

p_w_picpath

为了显示时间,我在该表单继续添加时间域

Default value:@Text (@Now)

p_w_picpath

p_w_picpath

表单创建完后,我们开始创建代理程序:

代码---代理---新建代理

p_w_picpath

代理名称:修改用户名密码------一定要注意别名的名称,会在代码中用到

别名:ChgUserPwdAgent

注释:ChgUserPwdAgent

p_w_picpath

代理创建完成

p_w_picpath

在Declaration下添加以下代码:

Dim session As NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim namesdb As NotesDatabase
Dim namesdoc As NotesDocument
Dim namesview As NotesView

p_w_picpath

然后将以下代码添加到Initialize处即可;

代码解释:通过username、shortname来判断用户是否在names.nsf数据中下;

如果用户不在数据库中,就会提示找不到用户,重置失败;、

如果用户在数据库中,就会提示重置成功。

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

p_w_picpath

代码编辑好后,---属性---基本----目标---选择无

p_w_picpath

代码下安全---选择不允许首先操作

p_w_picpath

因为考虑到安全性,所以需要为执行该操作的人员添加权限;

权限的添加就是数据库(ChgUpwd)ACL的访问控制;将需要有操作权限的用户添加---个人---管理员即可

p_w_picpath

同时修改服务器配置,服务器默认不允许任何代理程序运行;

服务器文档配置---安全----* (星号)即可

p_w_picpath

三、测试web方式重置邮箱密码

p_w_picpath

因为刚才看见数据库权限,gavin、administrator有重置的权限;

所以在重置前需要验证一次;在此我通过administator验证

p_w_picpath

p_w_picpath

验证通过;现在我们看见的页面就是web方式重置邮箱密码的页面;我们只需要在用户名下输入需要重置密码的用户、同时在新密码处填写需要重置的密码,然后单击重置密码即可

p_w_picpath

因为我们环境内创建了user01、user02用户,这些用户分别在不同的服务器上

p_w_picpath

接下来我们将用户user01的密码重置为12345678;

单击重置密码---提示成功

p_w_picpath

接下来我们测试看用户的密码重置是否有效;

通过telnet iio-mail01.iiosoft.com 110

User user01

Pass 12345678

如果显示ok说明用户验证通过,及显示该用户所有的邮件数量

p_w_picpath

因为在工作中有邮箱别名的问题;所以我们还需要对别名做验证、搜索等,脚本内已经添加该功能;日常中我们别名的做法是;

User01用户新建别名testuser01,以至testuser01可以通过user01、testuser01等信息验证

p_w_picpath

其实通过testuser01也可以通过密码12345678也能通过验证及访问:

因为testuser01是user01的邮箱别名

p_w_picpath

接下来我们再通过重置别名进行测试;testuser01

p_w_picpath

重置成功

p_w_picpath

验证登陆

p_w_picpath

同时通过搜索的方式在names下查找用户;如果用户不存在就会提示用户不存在,密码修改失败;

p_w_picpath

p_w_picpath

我们发现重置密码的时候所输入的密码是明文的,我们也可以修改该密码域值进行实现密码隐藏;需要将该域值的属性—类型从文本----密码即可

p_w_picpath

p_w_picpath

密码不显示了

p_w_picpath

p_w_picpath

四、通过web方式统计重置密码次数的用户

接下来统计重置密码的时间及次数

1.打开试图------无标题;默认的试图;

所以我们需要重命名利用即可

p_w_picpath

试图名称:ListView

p_w_picpath

p_w_picpath

双击#处,可添加内容

p_w_picpath

我们填写用户名

p_w_picpath

名称写username

p_w_picpath

列值—选择域

p_w_picpath

试图选择-----选择公式--------------Select Form=“intnetpwd” (表单名称)

p_w_picpath

然后用同样的方法添加时间:Time

p_w_picpath

p_w_picpath

为了方便维护统计信息,重新创建一个表单:RTPTable

p_w_picpath

样式:dsiplay:none

p_w_picpath

然后在该表单下填写:统计信息的代理名称:GetUserTotalAgent

p_w_picpath

document.getElementById("divshow").innerHTML = document.getElementById("RTFTable").value

p_w_picpath

在创建用户次数代理程序:

p_w_picpath

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

p_w_picpath

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

p_w_picpath

通过测试结果如下:

p_w_picpath