1
好吧,我沒有頭髮留下來撕掉,所以在我的指甲變得不存在之前,我想我最好在這裏發帖,看看是否有人可以擺脫一些光。Exchange Powershell C#
我有一個隨機工作的C#應用程序,當我昨天說隨機抽取數據時,它今天完全沒有返回。我的任務是連接到Exchange管理shell並執行一堆Get查詢並將結果返回到列表。
以下是我的交換查詢碼。
public class EmsSession
{
public static List<Lists.ExchangeOverview> ExchOverview()
{
List<Lists.ExchangeOverview> data = new List<Lists.ExchangeOverview>();
PowerShell powershell = PowerShell.Create();
PSSnapInException ex;
powershell.Runspace.RunspaceConfiguration.AddPSSnapIn(Program.SnapInString, out ex);
if (ex != null) throw ex;
powershell.AddScript(". $env:ExchangeInstallPath\\bin\\RemoteExchange.ps1");
powershell.AddScript("Connect-ExchangeServer -auto");
powershell.Invoke();
powershell.Streams.ClearStreams();
powershell.Commands.Clear();
powershell.AddScript("Get-ExchangeServer | Select Name, Edition, AdminDisplayVersion, ServerRole");
Collection<PSObject> results = powershell.Invoke();
data.AddRange(results.Select(obj => new Lists.ExchangeOverview()
{
Name = obj.Members["Name"].Value.ToString(),
Edition = obj.Members["Edition"].Value.ToString(),
Version = obj.Members["AdminDisplayVersion"].Value.ToString(),
Role = obj.Members["ServerRole"].Value.ToString()
}));
return data;
}
public static List<Lists.MailboxCount> MailboxDbCounts()
{
List<Lists.MailboxCount> data = new List<Lists.MailboxCount>();
PowerShell powershell = PowerShell.Create();
PSSnapInException ex;
powershell.Runspace.RunspaceConfiguration.AddPSSnapIn(Program.SnapInString, out ex);
if (ex != null) throw ex;
powershell.AddScript(". $env:ExchangeInstallPath\\bin\\RemoteExchange.ps1");
powershell.AddScript("Connect-ExchangeServer -auto");
powershell.Invoke();
powershell.Streams.ClearStreams();
powershell.Commands.Clear();
powershell.AddScript("Get-Mailbox | Group-Object -Property:Database | Select-Object name, count");
Collection<PSObject> results = powershell.Invoke();
data.AddRange(results.Select(obj => new Lists.MailboxCount()
{
Name = obj.Members["name"].Value.ToString(),
Count = obj.Members["count"].Value.ToString()
}));
return data;
}
public static List<Lists.DatabaseInformation> DatabaseInformation()
{
List<Lists.DatabaseInformation> data = new List<Lists.DatabaseInformation>();
PowerShell powershell = PowerShell.Create();
PSSnapInException ex;
powershell.Runspace.RunspaceConfiguration.AddPSSnapIn(Program.SnapInString, out ex);
if (ex != null) throw ex;
powershell.AddScript(". $env:ExchangeInstallPath\\bin\\RemoteExchange.ps1");
powershell.AddScript("Connect-ExchangeServer -auto");
powershell.Invoke();
powershell.Streams.ClearStreams();
powershell.Commands.Clear();
powershell.AddScript("Get-MailboxDatabase -Status | Select Name, EdbFilePath, LogFolderPath");
Collection<PSObject> results = powershell.Invoke();
foreach (PSObject obj in results)
{
string edbSize = Functions.BytesToString(new System.IO.FileInfo(obj.Members["EdbFilePath"].Value.ToString()).Length, true);
data.Add(new Lists.DatabaseInformation()
{
Name = obj.Members["Name"].Value.ToString(),
DbSize = edbSize,
EdbPath = obj.Members["EdbFilePath"].Value.ToString(),
LogPath = obj.Members["LogFolderPath"].Value.ToString()
});
}
return data;
}
public static ArrayList ExchangeTraffic()
{
ArrayList data = new ArrayList();
StringBuilder stringBuild = new StringBuilder();
stringBuild.AppendLine("$From = ((Get-Date).AddDays(-30)).Date");
stringBuild.AppendLine("$To = ((Get-Date).AddDays(-29)).Date");
stringBuild.AppendLine("[Int64] $intTotalSentInternally = $intTotalSentExternally = 0");
stringBuild.AppendLine("[Int64] $intTotalRecInternally = $intTotalRecExternally = 0");
stringBuild.AppendLine("[Int64] $intTotalSentSize = $intTotalSent = 0");
stringBuild.AppendLine("[Int64] $intTotalRecSize = $intTotalRec = 0");
stringBuild.AppendLine("[Int64] $intTotalFailed = 0");
stringBuild.AppendLine("[Int64] $intTotalPoison = $intTotalPoisonHistory = 0");
stringBuild.AppendLine("[String] $strEmails = $null ");
stringBuild.AppendLine("Do");
stringBuild.AppendLine("{");
stringBuild.AppendLine(@" $strEmails = ""$($From.ToString(""dd MMM"")),"" ");
stringBuild.AppendLine(" $intTotalSentInternally = $intTotalSentExternally = 0");
stringBuild.AppendLine(" $intTotalRecInternally = $intTotalRecExternally = 0");
stringBuild.AppendLine(" $intTotalSentSize = $intTotalSent = 0");
stringBuild.AppendLine(" $intTotalRecSize = $intTotalRec = 0");
stringBuild.AppendLine(" $intTotalFailed = 0");
stringBuild.AppendLine(" $intTotalPoison = 0");
stringBuild.AppendLine(" (Get-TransportServer) | Get-MessageTrackingLog -ResultSize Unlimited -Start $From -End $To | ForEach {");
stringBuild.AppendLine(@" If ($_.EventId -eq ""RECEIVE"" -and $_.Source -eq ""STOREDRIVER"") {");
stringBuild.AppendLine(" $intTotalSentSize += $_.TotalBytes");
stringBuild.AppendLine(" $intTotalSent++");
stringBuild.AppendLine(@" If ($_.Recipients -match """ + Program.EmailDomain + @""") {");
stringBuild.AppendLine(" $intTotalSentInternally++");
stringBuild.AppendLine(" } Else {");
stringBuild.AppendLine(" $intTotalSentExternally++");
stringBuild.AppendLine(" }");
stringBuild.AppendLine(" }");
stringBuild.AppendLine(@" If ($_.EventId -eq ""DELIVER"") {");
stringBuild.AppendLine(" $intTotalRecSize += $_.TotalBytes");
stringBuild.AppendLine(" $intTotalRec++");
stringBuild.AppendLine(@" If ($_.Sender -match """ + Program.EmailDomain + @""") {");
stringBuild.AppendLine(" $intTotalRecInternally++");
stringBuild.AppendLine(" } Else {");
stringBuild.AppendLine(" $intTotalRecExternally++");
stringBuild.AppendLine(" }");
stringBuild.AppendLine(" }");
stringBuild.AppendLine(@" If ($_.EventId -eq ""FAIL"") {");
stringBuild.AppendLine(" $intTotalFailed++");
stringBuild.AppendLine(" }");
stringBuild.AppendLine(@" If ($_.EventId -eq ""POISONMESSAGE"") {");
stringBuild.AppendLine(" $intTotalPoison++");
stringBuild.AppendLine(" }");
stringBuild.AppendLine(" }");
stringBuild.AppendLine(" $intTotalPoison = $intTotalPoison - $intTotalPoisonHistory");
stringBuild.AppendLine(" $intTotalPoisonHistory = $intTotalPoison");
stringBuild.AppendLine(@" $strEmails += ""$intTotalSent,$intTotalSentInternally,$intTotalSentExternally,$intTotalSentSize,$intTotalRec,$intTotalRecInternally,$intTotalRecExternally,$intTotalRecSize,$intTotalFailed,$intTotalPoison""");
stringBuild.AppendLine(" $strEmails");
stringBuild.AppendLine(" $From = $From.AddDays(1)");
stringBuild.AppendLine(" $To = $From.AddDays(1)");
stringBuild.AppendLine("}");
stringBuild.AppendLine("While ($To -lt (Get-Date))");
PowerShell powershell = PowerShell.Create();
PSSnapInException ex;
powershell.Runspace.RunspaceConfiguration.AddPSSnapIn(Program.SnapInString, out ex);
if (ex != null) throw ex;
powershell.AddScript(". $env:ExchangeInstallPath\\bin\\RemoteExchange.ps1");
powershell.AddScript("Connect-ExchangeServer -auto");
powershell.Invoke();
powershell.Streams.ClearStreams();
powershell.Commands.Clear();
powershell.AddScript(stringBuild.ToString());
Collection<PSObject> results = powershell.Invoke();
foreach (PSObject obj in results)
{
data.Add(obj.ToString());
}
return data;
}
public static List<Lists.FailedEmails> FailedEmails()
{
List<Lists.FailedEmails> data = new List<Lists.FailedEmails>();
StringBuilder strBuild = new StringBuilder();
strBuild.AppendLine(@"[Array]$List_FailedEmailsBySender = Get-TransportServer | Get-MessageTrackingLog -ResultSize 'Unlimited' -EventID FAIL -Start ((Get-Date).AddDays(-30)).Date | Sort-Object -Property Sender | Group-Object -Property Sender");
strBuild.AppendLine(@"$ProcessedList = New-Object -TypeName System.Collections.ArrayList");
strBuild.AppendLine(@"foreach ($Sender in $List_FailedEmailsBySender) {");
strBuild.AppendLine(@" $Sender.Group | Select-Object -ExpandProperty Recipients | Sort-Object | Group-Object | ForEach-Object {");
strBuild.AppendLine(@" [VOID]$ProcessedList.Add((New-Object -TypeName psobject -Property @{");
strBuild.AppendLine(@" Sender = $Sender.Name");
strBuild.AppendLine(@" Recipient = $_.Name");
strBuild.AppendLine(@" FailedCount = $_.Count");
strBuild.AppendLine(@" }))");
strBuild.AppendLine(@" }");
strBuild.AppendLine(@"}");
strBuild.AppendLine(@"[Array]$Top20 = $ProcessedList | Sort-Object -Property FailedCount -Descending | Select-Object -First 20 | Select-Object -Property Sender,Recipient,FailedCount");
strBuild.AppendLine(@"$Top20");
PowerShell powershell = PowerShell.Create();
PSSnapInException ex;
powershell.Runspace.RunspaceConfiguration.AddPSSnapIn(Program.SnapInString, out ex);
if (ex != null) throw ex;
powershell.AddScript(". $env:ExchangeInstallPath\\bin\\RemoteExchange.ps1");
powershell.AddScript("Connect-ExchangeServer -auto");
powershell.Invoke();
powershell.Streams.ClearStreams();
powershell.Commands.Clear();
powershell.AddScript(strBuild.ToString());
Collection<PSObject> results = powershell.Invoke();
data.AddRange(results.Select(obj => new Lists.FailedEmails()
{
Sender = obj.Members["Sender"].Value.ToString(),
Recipient = obj.Members["Recipient"].Value.ToString(),
Count = obj.Members["FailedCount"].Value.ToString()
}));
return data;
}
public static List<Lists.TopMailboxes> TopMailboxes()
{
List<Lists.TopMailboxes> data = new List<Lists.TopMailboxes>();
PowerShell powershell = PowerShell.Create();
PSSnapInException ex;
powershell.Runspace.RunspaceConfiguration.AddPSSnapIn(Program.SnapInString, out ex);
if (ex != null) throw ex;
powershell.AddScript(". $env:ExchangeInstallPath\\bin\\RemoteExchange.ps1");
powershell.AddScript("Connect-ExchangeServer -auto");
powershell.Invoke();
powershell.Streams.ClearStreams();
powershell.Commands.Clear();
powershell.AddScript("Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Sort-Object TotalItemSize -Descending | Select-Object DisplayName,@{name='TotalItemSize';expression={[math]::Round((($_.TotalItemSize.Value.ToString()).Split('(')[1].Split(' ')[0].Replace(',','')/1GB),2)}} -First 20");
Collection<PSObject> results = powershell.Invoke();
data.AddRange(results.Select(obj => new Lists.TopMailboxes()
{
MailboxName = obj.Members["DisplayName"].Value.ToString(),
Size = obj.Members["TotalItemSize"].Value.ToString()
}));
return data;
}
}
}
我沒有從它運行的服務器收到任何錯誤,我只是得到完全空白的數據。
我可以證實,該變量Program.SnapInString返回正確的交換單元中使用(這是Microsoft.Exchange.Management.Powershell.E2010)
也許明天它會再次工作!
任何想法都會很棒。
---一件事添加此運行的系統帳戶(如果這將使任何區別,不作爲登錄的用戶)
爲什麼不只使用powershell腳本,不使用c#包裝,或者如果您使用的是C#,然後使用Exchange API,它是非常好的文檔(https://msdn.microsoft.com/en-us/library/office/dn567668(v = exchg 0.150)的.aspx)。 – vittore
我不僅僅使用powershell腳本的原因是,一旦捕獲了這些數據,C#程序將根據這些數據生成PDF報告,並將該數據導入到SQL數據庫中 –
如果我可以使其可靠地工作,並且如果任何人都有興趣我很高興發佈完整的代碼,因爲報告非常酷(在我的愚見) –