最近有个朋友需要提供一个脚本,来获取组织内的用户处于快满的用户列表,并能够10天后根据列表来自动清空他们邮箱数据,代码如下:
#requires -version 2
#脚本撰写人:徐鹏 如果需要脚本的话,[email protected],为我写脚本创建一些机会,提升更快。
#本脚本分为两个部分执行,一个是计算出当前邮箱用户禁止发送和邮箱被禁用的帐号,另外一个10天后清空邮箱。执行方法如下
#.\analyze-userdata -exportfulluser 主要计算出当前邮箱中满了的部分用户并调用smtp服务器发送给相关人员
#.\analyze-userdata -emptyuser 他会根据10天前生成的文件来自动清空文件中存在用户的邮件
#此脚本的目的大家如果仔细阅读可能就会发现他的功能,就是生成即将被禁止的邮箱,然后发送给管理员,管理员可以在10天之后手动的清空这些邮件
param
(
[switch] $ExportFullUser,
#执行导出命令Dash 符号
[switch] $EmptyMailbox,
#执行清空邮箱命令dash符号
[string] $SmtpServer="tpkhubcasa.tpktest.com",
#默认使用的smtp服务器,如果将来也会发往外部,需要设置邮件服务器的匿名relay 限制
[string] $SendFrom="[email protected]",
#设定发件人
[string] $SendTo="[email protected]",
#设定收件人
[string] $Helpdeskusermail="[email protected]",
#设定桌面支持人员,在用户邮箱无法发送邮件之后HELPDESK
[string] $tmplogpath="c:\TMPLog",
#设定产生日志的路径
$encoding= [System.Text.Encoding]::unicode
#定义邮件编码类型
)
#region Analyze Full user mailbox and send mail to user to tell mailbox full
if($ExportFullUser)
#如果执行exportfulluser则执行如下指令
{
if(!(Test-Path -Path $tmplogpath))
#如果不存在日志产生目录
{
New-Item -ItemType directory -Path $tmplogpath
#新建日志产生目录
}
$UserMailboxs=Get-Mailbox -Filter 'RecipientTypeDetails -eq "UserMailbox"' -ResultSize unlimited
#查询出当前组织内邮箱用户
$useralls=@()
#数组赋初值
foreach ($usermailbox in $UserMailboxs)
#在获取的用户邮箱中轮询
{
$count++
#计数器自加
Write-Progress -Activity "calculating These mailbox now" -Status "calculating now.Please wait" -percentcomplete ($count /($UserMailboxs.count)*100)
#为了让执行过程变得有可看性,也为了更好和用户进行界面接哦互
$userdisplayname=(get-mailboxstatistics -identity $usermailbox).displayname
#获取当前用户的显示名称
$usersamaccount=(get-mailbox -identity $usermailbox).samaccountname
#获取用户的samaccount名称
$usermailaddress=(get-mailbox -identity $usermailbox).primarysmtpaddress
#获取用户的主要邮件地址
$userstatus=(get-mailboxstatistics -identity $usermailbox).storagelimitstatus
#获取用户当前的存储状况
$usermailboxsize=(get-mailboxstatistics -identity $usermailbox).totalitemsize.value.tobytes()
#获取用户当前的用户邮箱大小,并转换成字节
$usermailboxMB="{0:#.##}" -f ($usermailboxsize/1mb)
#根据上面的字节数求出当前用户的邮箱大小,以MB为单位
$userall=New-Object psobject
#新建一个PS对象
if ($userstatus -like "ProhibitSend" )
#用户邮箱禁止发送
{
$userstatus1="您的邮箱将要达到邮箱限制,请您主动删除邮箱中不必要的邮件,不删除可能会对您后续的邮件收发将会造成一定的影响"
#状态赋值
$bodymessage="Dear "+$userdisplayname+":"+"
"+$userstatus1+"
如果对此有疑问,请联系helpdesk,Helpdesk电话为#5566
IT信息部"+(Get-Date -Format "yyyy-MM-dd")
#生成邮件发送状态信息
Send-MailMessage -From $SendFrom -To $usermailaddress -SmtpServer $SmtpServer -Body $bodymessage -Subject "您的邮件即将超过您允许的最大邮件收发限制,为了避免您影响您的收件,请删除部分邮件,谢谢!" -Encoding $encoding
#将邮件发送给客户
$userall| Add-Member -MemberType NoteProperty -Name "samaccount" -Value $usersamaccount
#为userall 的ps 对象添加一个属性,属性名称为samaccount
$userall| Add-Member -MemberType NoteProperty -Name "displayname" -Value $userdisplayname
#为userall 的ps 对象添加一个属性,属性名称为displayname
$userall| Add-Member -MemberType NoteProperty -Name "userstatus" -Value $userstatus
#为userall 的ps 对象添加一个属性,属性名称为 userstatus
$userall| Add-Member -MemberType NoteProperty -Name "usermailboxMB" -Value $usermailboxMB
#为userall 的ps 对象添加一个属性,属性名称为usermailboxMB
$userall| Add-Member -MemberType NoteProperty -Name "usermailaddress" -Value $usermailaddress
#为userall 的ps 对象添加一个属性,属性名称为
$useralls=$useralls+$userall
#将对象赋值给数组
}
if ($userstatus -like "mailboxdisabled" )
#如果用户状态等于Maildisabled状态则执行如下命令
{
$userstatus1="此邮箱已经由于空间使用过大而被Exchange禁用,请主动协助处理此邮箱,谢谢!"
$bodymessage="Dear Helpdesk及系统管理员:"+"
"+"此邮箱用户为:"+$userdisplayname+"的所属邮箱,邮箱地址为"+$usermailaddress+"目前"+$userstatus1
Send-MailMessage -From $SendFrom -To $Helpdeskusermail -Cc $SendTo -SmtpServer $SmtpServer -Body $bodymessage -Subject "以下用户已经由于邮件过多而无法再进行邮件收发,请Helpdesk跟踪,谢谢!" -Encoding $encoding
#发送邮箱告诉helpdesk 及系统管理员邮箱因为过大而无法发送邮件,通知helpdesk人员处理
}
}
$tmplogfile=$tmplogpath+"\"+$(get-date -Format "yyyy-MM-dd")+".csv"
#为创建文件名字做好初值
$useralls| Export-Csv -Encoding default -NoTypeInformation -Path $tmplogfile
#生成符合Probhibit 禁止发送用户列表
Send-MailMessage -From $SendFrom -To $SendTo -SmtpServer $SmtpServer -subject "请检查附件中的超过使用量的用户" -Body "Dear Sir: 请检查附件中超过邮件使用量的用户。如果附件为空,说明没有超过限制的用户。谢谢!" -Attachments $tmplogfile -Encoding $encoding
#发送邮件给管理员当前邮箱即将达到禁止邮箱的名单
}
#endregion
#region Empty user mailbox
if ($EmptyMailbox)
#执行清除命令
{
$lastshowdate=(Get-Date).adddays(-10).tostring("yyyy-MM-dd")
#生成上一次产生文件的日期,这里我们设置的为10天之前,并将日期型转换为字符型
$tendaysfile=$tmplogpath+"\"+$lastshowdate+".csv"
#生成上一次产生的文件
if (Test-Path -Path $tendaysfile)
#验证产生的文件是否存在
{
$emptyarray=Import-Csv -Path $tendaysfile
#将从文件中的数据赋值给emptyarray数组
$emptycountall=$emptyarray.count
#计算数据中元素的行数
$emptyaccounts=@()
#为用户数组赋初值
for ($n=0;$n -lt $emptycountall;$n++)
#基于数据用户数量的循环
{
$emptyaccount=$emptyarray[$n].samaccount
#将用户的samaccount 赋值给emptyaccount
$emptyaccounts=$emptyaccounts+$emptyaccount
#将emptyaccount 数据读出赋给数组
}
foreach ($users in $emptyaccounts)
#根据读出的用户列进行循环
{
$emptycount++
#计数器自加
$messageempty="Now Empty"+$users+"'s Mailbox.Please Wait"
#赋值
Write-Progress -Activity "Empty mailbox now,please wait" -status $messageempty -PercentComplete ($emptycount/$emptycountall)
#增强与用户的交互,能够根据用户的状态确定当前执行的位置
search-mailbox -identity $users -deletecontent -force
#清空当前用户邮件
$subjectmessage="User "+$users+"'s Mailbox has been empty,User can receive Mail now"
#赋值
$bodyitem="Dear Sir:
User "+$users+"的邮箱已经被清空,请告知用户"
Send-MailMessage -SmtpServer $SmtpServer -From $SendFrom -To $SendTo -Subject $subjectmessage -Body $bodyitem -Encoding $encoding
#发送邮件到管理员告知清空对象
}
Remove-Item -Path $tendaysfile -Force
#移除相应的用户文件
Send-MailMessage -SmtpServer $SmtpServer -From $SendFrom -To $SendTo -Subject "所有禁止发送的用户的邮件都已经被清空" -Body "所有已经禁止发送邮件的用户邮件均已经呗清空" -Encoding $encoding
#发送整体清空邮件告知管理员
}
else
{
Send-MailMessage -From $SendFrom -To $SendTo -SmtpServer $SmtpServer -subject "文件没有产生,可能你没有禁止发送的用户" -Body "Dear Sir: 文件没有生成,可能您企业中没有人超过大小限制" -Encoding $encoding
#最开始的检查文件对象存在的另一种情况,列表文件没有产生。没有删除对象
}
}
#endregion
执行方法及介绍请参考另一个博客!