c# 調用Powershell 操作Exchange2010


前言

服務器為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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM