In C#, you can execute powershell commands and get output in separate runspace. The following C# example returns the exchange server’s mailbox audit report. The audit setting fields (AuditDelegate,AuditAdmin,AuditOwner) are multi-valued property field, so we can not read value directly from this field. The datatype of this field is “Deserialized.Microsoft.Exchange.Data.Directory.ADMultiValuedProperty`1[[Microsoft.Exchange.Data.Directory.MailboxAuditOperations, Microsoft.Exchange.Data.Directory, Version=14.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]“. So, here, I have written the C# code to extract value from ADMultiValuedProperty field.
public static void GetMailBoxAuditReport() { string shellUri = "http://schemas.microsoft.com/powershell/Microsoft.PowerShell"; var secured = new SecureString(); foreach (char letter in "MyPassword") { secured.AppendChar(letter); } secured.MakeReadOnly(); var credential = new PSCredential(@"MyExchDomainAdministrator", secured); var connectionInfo = new WSManConnectionInfo(false, "MyExchServer", 5985, "/wsman", shellUri, credential); Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo); runspace.Open(); Pipeline pipeline = runspace.CreatePipeline(); pipeline.Commands.AddScript("Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010"); pipeline.Commands.AddScript("Get-Mailbox | Select Name, AuditEnabled, AuditLogAgeLimit,AuditAdmin,AuditDelegate,AuditOwner"); Collection<PSObject> results = pipeline.Invoke(); if (results.Count > 0) { foreach (PSObject psObject in results) { List<string> output = new List<string>(); foreach (PSPropertyInfo psInfo in psObject.Properties) { if (psInfo.Value != null) { string dataType = psInfo.TypeNameOfValue; if (dataType.Contains("ADMultiValuedProperty")) { string multiValueOutput = string.Empty; PSObject childObj = (PSObject)psInfo.Value; foreach (PSObject info in (ArrayList)childObj.ImmediateBaseObject) { multiValueOutput += info.ToString() + ";"; } output.Add(multiValueOutput); } else if (dataType.Equals("System.String[]")) { string[] childObj = (string[])psInfo.Value; output.Add(string.Join(";", childObj)); } else { output.Add(psInfo.Value.ToString()); } } } Console.WriteLine(string.Join(";", output.ToArray())); Console.WriteLine("----------------------"); } } }
Advertisement