代码改变世界

c# 调用Powershell 操作Exchange2010

2013-02-19 15:49  午夜瞎想  阅读(4404)  评论(2编辑  收藏  举报

前言

服务器为win2008+exchange2010,希望利用.net来统计用户邮箱现状。网上已经有很多介绍怎么通过powershell来操作exchenage的文章,但是在真正做一个具体的事情的时候还是会遇到很多不同的问题。

第一步

引用操作powershell的dll,System.Management.Automation.dll。

这里会遇到的问题是版本的问题,由于服务器是win2008,自带的powershell是2.0版本,而开发机包括很多网上的帮助都是引用的C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll ,造成在部署到测试环境后无法工作。后来在同事win7的机器上找到2.0的版本引用后解决。

第二步

加载管理exchange2010的Snap-ins。

注意这里加载Snap-ins不能把他当成cmdlets命令来执行,虽然不报错,加载语句为

1 RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
2 PSSnapInException snapInException = null;
3 PSSnapInInfo info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapInException);
4 Runspace myRunSpace = RunspaceFactory.CreateRunspace(rsConfig);
5 myRunSpace.Open();

第三步

现在基础都准备完毕了,可以写cmdlet命令了,完整的语句如下:

 1        RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
 2             PSSnapInException snapInException = null;
 3             PSSnapInInfo info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapInException);
 4             Runspace myRunSpace = RunspaceFactory.CreateRunspace(rsConfig);
 5             myRunSpace.Open();
 6             Pipeline pipeLine = myRunSpace.CreatePipeline();
 7 
 8             string cmd ="Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Select LegacyDN, DisplayName,StorageLimitStatus,@{name=\"TotalItemSize(MB)\";expression={[math]::Round(($_.TotalItemSize.Split(\"(\")[1].Split(\"\")[0].Replace(\",\",\"\")/1MB),2)}},@{name=\"TotalDeletedItemSize(MB)\";expression={[math]::Round(($_.TotalDeletedItemSize.Split(\"(\")[1].Split(\" \")[0].Replace(\",\",\"\")/1MB),2)}},ItemCount,DeletedItemCount | Sort \"TotalItemSize (MB)\" -Descending | Export-CSV \"c:\\All Mailboxes.csv\" -NoTypeInformation  -Encoding UNICODE";
 9 
10             Command myCommand = new Command(cmd,true);
11             pipeLine.Commands.Add(myCommand);
12             Collection<PSObject> commandResults = pipeLine.Invoke();
13            
14 
15             foreach (PSObject obj in commandResults)
16             {
17 
18                 Console.WriteLine(obj.ToString());
19 
20             }

这里有几个小问题需要说明一下,

1. 在第10行Command myCommand = new Command(cmd,true) 第二个参数的意思是说这是命令脚本,而不是单单的cmdlet命令,我这里传的是脚本

2.在使用Export-CSV导出csv文件的时候会有编码问题,通过-Encoding UNICODE参数转换编码

3.获取结果是通过PSObject的Properties["列名"]来获取的

我这里把结果导出后利用上篇所说的Logparser来进行二次处理,powershell还是有点慢。

附Get-MailboxStatistics 的返回值说明

    • StorageLimitStatus   此值指示邮箱的配额状态。使用以下值:
      • BelowLimit   邮箱大小小于问题警告配额。
      • IssueWarning   邮箱大小大于或等于问题警告配额,但小于禁止发送配额。
      • ProhibitSend   邮箱大小大于或等于禁止发送配额,但小于禁止发送接收配额。
      • MailboxDisabled   邮箱大小大于或等于禁止发送接收配额。
    • TotalItemSize 和 ItemCount   这些值指示邮箱中当前项目的大小和数量。TotalItemSize 的值是邮箱的大小。此值与为邮箱配置的邮箱配额进行比较。
    • TotalDeletedItemSize 和 DeletedItemCount   这些值不指示“已删除邮件”文件夹中的项目的大小和数量。相反,它们指示邮箱中隐藏的“可恢复的项目”文件夹中的项目的大小和数量。“可恢复的项目”文件夹也称作“垃圾站”。项目通过以下方式之一进入“可恢复的项目”文件夹:
      • 从“已删除邮件”文件夹中删除项目。
      • 使用 Shift+Delete 永久删除邮箱项目。
      “可恢复的项目”文件夹的大小不计入邮箱的大小中。“可恢复的项目”文件夹具有自己单独的不可配置的配额,这些配额由分配给邮箱的邮箱计划进行设置。这些配额是 RecoverableItemsQuota 和 RecoverableItemsWarningQuota
      注意   “可恢复的项目”文件夹中的项目默认情况下保留 14 天,然后由 Microsoft Exchange 清除。在 用于企业的 Microsoft Office 365 中,当邮箱处于诉讼保留状态时,将不会清除“可恢复的项目”文件夹,此文件夹中的项目将无限期保留。

参考

Using Exchange Management Shell Commands With Managed Code http://msdn.microsoft.com/en-us/library/bb332449.aspx