我正在使用System.Management.Automation.dll通过Select Object获取c#中的邮箱,以仅返回我需要的字段。不幸的是,返回的结果是具有单个属性和空值的PSObjects列表。这些属性未正确映射到返回的PSObjects。
运行空间管道设置:
var o365ConnectionUri = "https://outlook.office365.com/powershell-liveid/";
var exchangeModuleUri = "http://schemas.microsoft.com/powershell/Microsoft.Exchange";
var connectionInfo = new WSManConnectionInfo(new Uri(o365ConnectionUri), exchangeModuleUri, credentials)
{
AuthenticationMechanism = AuthenticationMechanism.Basic
};
var runspace = RunspaceFactory.CreateRunspace(connectionInfo);
runspace.Open();
var pipeline = runspace.CreatePipeline()
命令执行:
var getMailboxesCmd = new Command("Get-Mailbox");
getMailboxesCmd.Parameters.Add("ResultSize", "unlimited");
var fieldsToSelect = new[]
{
"RecipientTypeDetails",
"PrimarySmtpAddress",
"DisplayName"
};
var sparseMailboxesCmd = new Command("Select-Object");
sparseMailboxesCmd.Parameters.Add("Property", string.Join(",", fieldsToSelect));
pipeline.Commands.Add(getMailboxesCmd);
pipeline.Commands.Add(sparseMailboxesCmd );
var result = pipeline.Invoke();
现在,我希望结果是具有RecipientTypeDetails
,PrimarySmtpAddress
和DisplayName
属性的PSObjects列表。但是,如上所述,我们返回了一个名为RecipientTypeDetails,PrimarySmtpAddress,DisplayName
且值为空的属性。
据我所知这肯定是System.Management.Automation.dll中的错误,是否有其他人处理过此问题或找到了解决方法?
答案 0 :(得分:2)
Select-Object
命令与参数Property
一起使用时,将单个属性名称作为字符串或将属性名称的字符串数组作为参数。
在您的情况下,您通过执行string.Join(",", fieldsToSelect)
将这三个属性串联在一起成为一个字符串。
归结为要求Select-Object
查找一个名为“ RecipientTypeDetails,PrimarySmtpAddress,DisplayName”的属性,并且该属性当然不存在(返回null
)。
要解决此问题,只需在命令中添加属性名称的数组:
var sparseMailboxesCmd = new Command("Select-Object");
sparseMailboxesCmd.Parameters.Add("Property", fieldsToSelect);
关于您的最新评论:
Select-Object
将返回PSObject,其中每个对象都包含您已添加到命令中的属性。
要从这些PSObject中获取(扩展)实际值,使用.ToString
的解决方案将行得通,因为这种情况下的属性都是字符串类型。
尽管我不太喜欢C#,但我认为这也可以从PSObjects中获取属性值:
object.Properties["RecipientTypeDetails"].Value
object.Properties["PrimarySmtpAddress"].Value
object.Properties["DisplayName"].Value