利用PowerShell将数据写入SQL Server数据库

2016年1月28日 | 分类: Exchange, PowerShell | 标签: , , ,

使用PowerShell可以将数据写入SQL Server数据库,这样就可以将通过Exchange命令get到的任何数据都写入数据库,然后再通过Web形式展现出现,很有意义。比如默认MessageTrackingLog只会记录一个月内的邮件流日志(当然设置可以改),如果想在年终的时候较为准确的统计出一年内的邮件收发数量,内部收发数量或外部收发数量,将数据写入数据库保存就很有意义了,可以非常容易的统计且数据准确。

以下为示例:

1. 在建好的数据库中创建一个存储邮件统计的表:

CREATE TABLE MessageCount (id int identity PRIMARY KEY ,DateTime Date, SendAll int,ReceiveAll int, SendExternal int,ReceiveExternal int)

2. 统计每天邮件量的脚本示例:

add-pssnapin Microsoft.Exchange.Management.PowerShell.SnapIn
$a=get-date
$DateTime=$a.date.AddDays(-1)

$SendAll=(Get-MailboxServer | Get-MessageTrackingLog -Start $DateTime -ResultSize unlimited -EventId send |where{$_.sender -like “*@nile.com”} | where{$_.recipients -notlike “healthmailbox*”} | Measure-Object).count

$ReceiveAll=(Get-MailboxServer | Get-MessageTrackingLog -Start $DateTime -ResultSize unlimited -EventId deliver | Where-Object{$_.recipients -notlike “healthmailbox*”} | Measure-Object).count

$SendExternal = (Get-MailboxServer | Get-MessageTrackingLog -Start $DateTime -ResultSize unlimited -EventId send |where{$_.sender -like “*@nile.com”} | where{($_.recipients -notlike “healthmailbox*”) -and ($_.recipients -notlike “*@nile.com”) } | Measure-Object).count

$ReceiveExternal=(Get-MailboxServer | Get-MessageTrackingLog -Start $DateTime -ResultSize unlimited -EventId deliver | Where-Object{($_.recipients -notlike “healthmailbox*”)-and ($_.sender -notlike “*@nile.com”)} | Measure-Object).count

$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = “Data Source=sqlservername;Initial Catalog=ExchangeDB;Integrated Security=SSPI;”
$conn.open()
$cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.connection = $conn
$cmd.commandtext = “INSERT INTO MessageCount (DateTime,SendAll,ReceiveAll,SendExternal,ReceiveExternal) VALUES(‘{0}’,'{1}’,'{2}’,'{3}’,'{4}’)” -f $DateTime,$SendAll,$ReceiveAll,$SendExternal,$ReceiveExternal
$cmd.executenonquery()
$conn.close()

3. 找一台Exchange服务器,创建一个每天0:05执行上述ps1脚本的任务计划,执行任务计划的用户对目标数据库有操作权限,即可成功将数据写入数据库。

Written by Nile Jiang
无猖狂以自彰,当阴沉以自深。

  1. 霍霍
    2016年12月4日03:59

    所有的where筛选都可以放到一起,不需要用多个where,可以加快筛选速度
    没记错的话,筛选出来的日志默认就是数组,有count属性,不需要用measure
    get-messagetrackinglog的时候最好指定一下结束时间,不然会有一部分在命令运行时的重复数据

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。