Domino 9下通过程序删除并记录未知用户及邮件组

说道domino相信大家都很熟悉了,而我们今天呢,主要介绍在Domino 9下通过程序删除并记录未知用户及邮件组,是什么意思呢,我们都知道Domino提供的邮件服务是个人数据库文件系统,每个邮箱用户都有一个独立的数据库存放邮件信息,跟其他提供邮件服务的系统不一样,当然Domino使用起来比较灵活,可以根据自己的需求开发自定义功能,由此可见使用起来相当灵活了,但是同时也会有另外一个问题产生,那就是邮件管理员可以误操作导致邮件信息错误。比如邮件组,定义一个邮件组,然后添加邮件组成员,管理员可以手动自定义任何内容然后保存,这样会导致给邮件组发送邮件时导致退信的问题,所以呢,我们今天就为了解决该问题部署了一个判断程序。具体见下:

首先是环境介绍:

邮件组:

我们再次在group_01 group_02下添加在domino目录下不存在的用户级邮件组进行程序判断,添加一些无效的用户

同样在group_02下添加无效用户

我们是需要创建一个空的数据库文件AutoDealgroup.nsf

打开Domino控制台---单击文件---应用程序----新建--------

我们选择数据库的应用服务器,然后选择模板---空---确认

然后我们定以后通过desinger工具打开该数据库即可;

同时因为我们需要把操作的字段记录下来,所以我们需要定义一个表单;定义需要显示的字段,然后填写传输字段即可:strDate字段显示日期及时间

类别strType

StrGroupName

StrContent

stRestoe

表单定义完后,我们接下来定义代理程序了

代理内容:

注:对Localdomainadmin、localdomainserver、等服务器组不做检查判断

%REM
Agent 定时处理群组
%END REM
Option Public
Option Declare
Dim session As NotesSession
Dim agt As NotesAgent
Dim dbcur As NotesDatabase
Dim namedb As NotesDatabase
Dim vwpsn As NotesView
Dim vwpsnbylname As NotesView
Dim vwgroup As NotesView
Sub Initialize
On Error Goto err_line
Dim entries As NotesViewEntryCollection
Dim entry As NotesViewEntry
Dim docGp As NotesDocument
Dim blnInit As Boolean
Dim i As Integer
Dim intLen As Integer
Dim vntMembers As Variant
Dim ind As Integer
Dim strContent As String
MsgBox "*********定时处理群组**********Start"
‘初始化
blnInit = fnInit()
‘初始化完成
If blnInit Then
‘遍历群组
Set entries = vwgroup.Allentries
intLen = entries.Count
For i=1 To intLen
Set entry = entries.Getnthentry(i)
If Not entry Is Nothing Then
If entry.Isvalid Then
If entry.Isdocument Then
Set docGp = entry.Document
If Not docGp Is Nothing Then
If fnIsDealGroup(docGp.listname(0)) Then
strContent = ""
vntMembers = docGp.Members
For ind=0 To UBound(vntMembers)
If vntMembers(ind) <> "" Then
‘判断成员是否为有效用户
If Not checkIsUser(vntMembers(ind)) Then
‘判断成员是否为有效群组
If Not checkIsGroup(vntMembers(ind)) Then
strContent = strContent + "," + vntMembers(ind)
vntMembers(ind) = ""
End If
End If
End If
Next
‘成员有更新,则保存群组文档
If strContent <> "" Then
docGp.Members = FullTrim(ArrayUnique(vntMembers))
Call docGp.Computewithform(False , False)
If docGp.Save(False,False) Then
‘记录操作日志
Call fnSetOptLog(docGp.listname(0),strContent)
End If
End If
End If
End If
End If
End If
End If
Next
End If
MsgBox "*********定时处理群组**********End"
Exit Sub
err_line:
Call showError("Initialize")
End Sub
%REM
Description: 判断群组是否需要处理
%END REM
Function fnIsDealGroup(gpname As String) As Boolean
On Error GoTo err_line
fnIsDealGroup = True
Select Case LCase(gpname)
Case "localdomainservers","otherdomainservers","localdomainadmins" :
fnIsDealGroup = False
End Select
Exit Function
err_line:
Call showError("fnIsDealGroup")
MsgBox "判断群组【"+gpname+"】是否允许处理时出错,不处理"
fnIsDealGroup = False
End Function
Function fnInit() As Boolean
On Error GoTo err_line
Set session = New NotesSession
Set agt = session.Currentagent
Set dbcur = session.Currentdatabase
Set namedb = session.Getdatabase("","names.nsf",False)
If Not namedb Is Nothing Then
Set vwpsn = namedb.Getview("($VIMPeople)")
Set vwpsnbylname = namedb.Getview("($VIMPeopleByLastName)")
Set vwgroup = namedb.Getview("($VIMGroups)")
If (vwpsn Is Nothing Or vwpsnbylname Is Nothing Or vwgroup Is Nothing) Then
fnInit = False
Exit Function
End If
Else
fnInit = False
Exit Function
End If
fnInit = True
Exit Function
err_line:
Call showError("fnInit")
fnInit = False
End Function
Sub showError(errmsg As String)
MsgBox agt.Name + " >> " + errmsg + " Error : " + Error + " at line : " & Erl
End Sub
%REM
Description: 记录操作日志
%END REM
Function fnSetOptLog(gpname As String,strContent As String)
On Error GoTo err_line
Dim doclog As NotesDocument
Dim vntContent As Variant
vntContent = Split(strContent,",")
vntContent = FullTrim(ArrayUnique(vntContent))
If vntContent(0) <> "" Then
Set doclog = dbcur.Createdocument()
doclog.form = "frmAutoDealGroupLog"
doclog.strDate = Format$(CStr(Now),"YYYY-MM-DD HH:MM:SS")
doclog.strType = "删除"
doclog.strGroupName = gpname
doclog.strContent = Join(vntContent,",")
doclog.strReason = "不是names中的有效用户或群组"
Call doclog.save(True,True)
End If
Exit Function
err_line:
Call showError("fnSetOptLog")
End Function
%REM
判断群组是否存在
%END REM
Function checkIsGroup(gpname As String) As Boolean
On Error GoTo err_line
Dim docGp As NotesDocument
checkIsGroup = True
Set docGp = vwgroup.Getdocumentbykey(gpname,True)
If docGp Is Nothing Then
checkIsGroup = False
End If
Exit Function
err_line:
Call showError("checkIsGroup")
checkIsGroup = True
End Function
%REM
判断用户是否存在
%END REM
Function checkIsUser(user As String) As Boolean
On Error Goto err_line
Dim ndoc As NotesDocument
Dim uname As NotesName
checkIsUser = True
If Instr(user,"/") > 0 Then
Set uname = New NotesName(user)
Set ndoc = vwpsn.Getdocumentbykey(uname.Abbreviated,True)
Else
Set ndoc = vwpsnbylname.Getdocumentbykey(user,True)
End If
If ndoc Is Nothing Then
checkIsUser = False
End If
Exit Function
err_line:
Call showError("checkIsUser")
checkIsUser = True
End Function

定义好后,我们可以打开刚才创建的数据库

以上代码附件后保存即可。

接下来我们手动运行程序进行判断:

Tell amgr run “数据库名称” ‘代理名称’

执行后,我们查看log文件

我们为了定期自动检查,我们可以定义代理的计划任务

可以根据自己的需求定义即可

以上程序当然是对Domino目录下的所有邮件组进行判断的,如果我们在Domino邮件组内添加了一些第三方的邮件组的话,而且邮件组的数量比较多的话,我们怎么做呢?任何对指定的邮件组进行梳理判断呢,当然,如果在邮件组数量不多的情况下,我们可以在当然情绪下添加需要跳过不做检查的邮件组;因为我们当前程序已添加了对localdomainadmins、localdomainserver等组不做检查,我们可以将不需要检查的组添加到代码中即可,注:前提是邮件组不多的情况下,如果多的话那就太麻烦了。

%REM
Description: 判断群组是否需要处理
%END REM
Function fnIsDealGroup(gpname As String) As Boolean
On Error GoTo err_line
fnIsDealGroup = True
Select Case LCase(gpname)
Case "localdomainservers","otherdomainservers","localdomainadmins" :
fnIsDealGroup = False
End Select

那如果邮件组多的话,我们应该怎么做了,比如我的真实环境下邮件组就比较多,我只能判断指定邮件组进行判断了,我们只需要稍微更改一下程序即可,添加一个表单,然后一个试图,然后需要只需要将指定的邮件组新建保存在试图即可

我们添加一个表单-----表单名称—待处理的群组

同样添加试图

试图添加后,我们修改代理代码:

%REM
Agent 定时处理群组
%END REM
Option Public
Option Declare
Dim session As NotesSession
Dim agt As NotesAgent
Dim dbcur As NotesDatabase
Dim namedb As NotesDatabase
Dim vwpsn As NotesView
Dim vwpsnbylname As NotesView
Dim vwgroup As NotesView
Dim arrDealGp As Variant
Sub Initialize
On Error Goto err_line
Dim entries As NotesViewEntryCollection
Dim entry As NotesViewEntry
Dim docGp As NotesDocument
Dim blnInit As Boolean
Dim i As Integer
Dim intLen As Integer
Dim vntMembers As Variant
Dim ind As Integer
Dim strContent As String
MsgBox "*********定时处理群组**********Start"
‘初始化
blnInit = fnInit()
‘初始化完成
If blnInit Then
‘遍历群组
Set entries = vwgroup.Allentries
intLen = entries.Count
For i=1 To intLen
Set entry = entries.Getnthentry(i)
If Not entry Is Nothing Then
If entry.Isvalid Then
If entry.Isdocument Then
Set docGp = entry.Document
If Not docGp Is Nothing Then
If fnIsDealGroup(docGp.listname(0)) Then
strContent = ""
vntMembers = docGp.Members
For ind=0 To UBound(vntMembers)
If vntMembers(ind) <> "" Then
‘判断成员是否为有效用户
If Not checkIsUser(vntMembers(ind)) Then
‘判断成员是否为有效群组
If Not checkIsGroup(vntMembers(ind)) Then
strContent = strContent + "," + vntMembers(ind)
vntMembers(ind) = ""
End If
End If
End If
Next
‘成员有更新,则保存群组文档
If strContent <> "" Then
docGp.Members = FullTrim(ArrayUnique(vntMembers))
Call docGp.Computewithform(False , False)
If docGp.Save(False,False) Then
‘记录操作日志
Call fnSetOptLog(docGp.listname(0),strContent)
End If
End If
End If
End If
End If
End If
End If
Next
End If
MsgBox "*********定时处理群组**********End"
Exit Sub
err_line:
Call showError("Initialize")
End Sub
%REM
Description: 判断群组是否需要处理
%END REM
Function fnIsDealGroup(gpname As String) As Boolean
On Error GoTo err_line
fnIsDealGroup = True
Select Case LCase(gpname)
Case "localdomainservers","otherdomainservers","localdomainadmins" :
fnIsDealGroup = False
End Select
If Not IsEmpty(arrDealGp) Then
If IsNull(ArrayGetIndex(arrDealGp, LCase(gpname))) Then
fnIsDealGroup = False
End If
End If
Exit Function
err_line:
Call showError("fnIsDealGroup")
MsgBox "判断群组【"+gpname+"】是否允许处理时出错,不处理"
fnIsDealGroup = False
End Function
Function fnInit() As Boolean
On Error GoTo err_line
Dim vwDealGpConf As NotesView
Dim docDealGpConf As NotesDocument
Dim strDealGp As String
Set session = New NotesSession
Set agt = session.Currentagent
Set dbcur = session.Currentdatabase
Set namedb = session.Getdatabase("","names.nsf",False)
If Not namedb Is Nothing Then
Set vwpsn = namedb.Getview("($VIMPeople)")
Set vwpsnbylname = namedb.Getview("($VIMPeopleByLastName)")
Set vwgroup = namedb.Getview("($VIMGroups)")
If (vwpsn Is Nothing Or vwpsnbylname Is Nothing Or vwgroup Is Nothing) Then
fnInit = False
Exit Function
End If
Set vwDealGpConf = dbcur.Getview("vwNeedDealGroup")
If Not vwDealGpConf Is Nothing Then
Set docDealGpConf = vwDealGpConf.Getfirstdocument()
If Not docDealGpConf Is Nothing Then
strDealGp = docDealGpConf.strGroup(0)
strDealGp = Replace(strDealGp,",",",")
arrDealGp = Split(strDealGp,",")
End If
End If
Else
fnInit = False
Exit Function
End If
fnInit = True
Exit Function
err_line:
Call showError("fnInit")
fnInit = False
End Function
Sub showError(errmsg As String)
MsgBox agt.Name + " >> " + errmsg + " Error : " + Error + " at line : " & Erl
End Sub
%REM
Description: 记录操作日志
%END REM
Function fnSetOptLog(gpname As String,strContent As String)
On Error GoTo err_line
Dim doclog As NotesDocument
Dim vntContent As Variant
vntContent = Split(strContent,",")
vntContent = FullTrim(ArrayUnique(vntContent))
If vntContent(0) <> "" Then
Set doclog = dbcur.Createdocument()
doclog.form = "frmAutoDealGroupLog"
doclog.strDate = Format$(CStr(Now),"YYYY-MM-DD HH:MM:SS")
doclog.strType = "删除"
doclog.strGroupName = gpname
doclog.strContent = Join(vntContent,",")
doclog.strReason = "不是names中的有效用户或群组"
Call doclog.save(True,True)
End If
Exit Function
err_line:
Call showError("fnSetOptLog")
End Function
%REM
判断群组是否存在
%END REM
Function checkIsGroup(gpname As String) As Boolean
On Error GoTo err_line
Dim docGp As NotesDocument
checkIsGroup = True
Set docGp = vwgroup.Getdocumentbykey(gpname,True)
If docGp Is Nothing Then
checkIsGroup = False
End If
Exit Function
err_line:
Call showError("checkIsGroup")
checkIsGroup = True
End Function
%REM
判断用户是否存在
%END REM
Function checkIsUser(user As String) As Boolean
On Error Goto err_line
Dim ndoc As NotesDocument
Dim uname As NotesName
checkIsUser = True
If Instr(user,"/") > 0 Then
Set uname = New NotesName(user)
Set ndoc = vwpsn.Getdocumentbykey(uname.Abbreviated,True)
Else
Set ndoc = vwpsnbylname.Getdocumentbykey(user,True)
End If
If ndoc Is Nothing Then
checkIsUser = False
End If
Exit Function
err_line:
Call showError("checkIsUser")
checkIsUser = True
End Function

修改后,保存程序然后进行测试

注意:如果在表单中未配置需要执行的邮件组的话,默认执行全部。

我们定义需要执行检查的邮件组,单击---新建

定义多个群组名称,然后以逗号分开。

然后单机保存并关闭

然后我们需要进行测试,然后在group01、group02、group03、group5中分别添加未知用户进行测试,最终结果,group01、group02、group03中的未知用户删除而group5的未知用户不做处理

Group02下定义

Group03

定义gourp5内的未知用户

接下来我们执行程序

执行后,log中没有group5的信息,

检查邮件组内的人员信息:

最后我们查看group5的信息

介绍结束:

注意:附件中的文件修改扩展名为7z可解压。

时间: 2024-11-02 09:30:46

Domino 9下通过程序删除并记录未知用户及邮件组的相关文章

小程序如何快速获得3000用户?

前言 一款好产品的出现,一定绕不开运营推广这个话题,小程序也是如此.如何让小程序快速推广,达到预期效果呢?接下来极乐君和大家分享下小程序如何快速获得3000用户.小程序快速推广九九归一法 一.小程序自身优化 品牌运营若名称与公司品牌一致,可少走很多弯路,比如:公司品牌是极乐商店,小程序名称就叫<极乐商店>. 关键字优化有时为了突出名称的意义,可能会跟品牌不一致,但网民搜索又可能搜索不到,这时关键字优化就很重要了,核心优化点在于:内容描述中必须包含核心关键字,并获得较好排名,如搜索『简历』,你的

Windows下Java程序实现对Mysql数据库的插入,删除,修改和查询

运行环境:Windows7,Eclipse,MySql,JDK1.7,mysql-connector-java-5.1.17-bin.jar 1 //import java.io.*; 2 import java.util.*; 3 import java.sql.*; 4 5 /** 6 * 7 * @date 2014-05-20 8 * @author asif 9 * @作用 java实现对mysql数据库的增减删查 10 * @bug 插入,删除,更新的时候异常停止 11 * 12 *

delete删除所有记录类的写法

删除所有记录的类的定义如下: unit UDeleteAll; interface uses FDataPool, Data.DB, Data.Win.ADODB, Vcl.Menus, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.Ext

二十七、Linux下常用的shell命令记录

本文章记录我在linux系统下常用或有用的系统级命令,包括软硬件查看.修改命令,有CPU.内存.硬盘.网络.系统管理等命令.但本文不打算介绍生僻命令,也不介绍各个linux发行版下的特有命令,且以后会持续更新. 说明,我是在一个Centos 6.4 64位的虚拟机系统进行测试.本文介绍的命令都会在此Centos下运行验证(也有部分命令会在我的suse/ubuntu系统里测试的,会做特明说明),但运行结果就不再列出了. 硬件篇 CPU相关 lscpu #查看的是cpu的统计信息. cat /pro

VC++下编译 程序“减肥”

在vc6 和 vs 2008下 编译 以下代码,不更改任何编译设置(vc6  40k , s2008 7k). 一.vc6下,Release 模式 编译处理. 1.去掉不必要的 链接库  工程(Project)-->设置(Settings)-->链接(link)属性页-->对象库/模块(object/library modules) 去掉所有的lib. 选择使用 MSVCRT.LIB kernel32.lib user32.lib. 可以忽略不必要的警告,比如 LINK:warning

戴尔笔记本win8.1+UEFI下安装Ubuntu14.04过程记录

瞎扯:笔记本刚买不久就想装ubuntu来着,但结果发现BIOS启动方式为UEFI,网上一搜索发现跟以前的双系统安装方法不一样,看具体教程感觉相当复杂,而且也有点担心折腾跪了这新本本所以一直没有动手.但昨天又心血来潮,看了几个教程后于是决定开搞!虽然中间不是很顺利,但最后结果发现也没有多复杂. 环境:我的笔记本型号是戴尔Insprion 14R-5437,系统为原装Win8.1,BIOS启动方式为UEFI.用事先制作的启动U盘,安装的是Ubuntu14.04 64位. 本文不是完整教程,所以建议参

Linux下c++程序内存泄漏检测代码范例

Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrind工具.但是valgrind相当于让程序在虚拟机中运行,会带来较大的系统资源开销,还会对程序的运行效率产生较大影响,对于那种资源占用大的程序,如果需要长时间运行才能暴露的泄漏问题,它就显得不太好用. linux下的c++程序中自己实现一个轻量级的泄漏检测代码其实是比较方便的,下面我就给出一个简单的范例,并作简单的说明.当然,我们还是应该提倡使用共享指针,用共享指针自动管理内存可以避免内存泄漏这样的不必要的麻烦. 基本原

18.n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 当一个数字删除后,从被删除数字的下一个继续删除第m个数字。 求出在这个圆圈中剩下的最后一个数字。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4263868.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字). 当一个数字

C#打包制作安装程序过程全记录

该文是根据网上的文章并结合自己实际打包的过程而整理的. 开发平台:VisualStudio2005中文版. 步骤如下: 1. 创建一个安装向导项目或安装部署项目 新建项目-〉其他项目类型-〉安装与部署-〉安装向导(或安装部署),如命名为setup. 2. 将要打包的项目导入到这个安装项目中,有两种方式:   第一种,自动方式,在解决方案上右击-〉添加-〉现有项目-〉选择你要打包的项目,这样就会把这个项目添加到该解决方案中来,   然后在安装项目setup上右击-〉添加-〉项目输出-〉主输出,在项