Office365合规PowerShell:Get-ComplianceSearch遍历无法获取ExchangeLocation值
问题:批量查询合规搜索时ExchangeLocation属性为空,单个查询正常
场景描述
使用Office 365合规中心的Get-ComplianceSearch模块,查询指定用户创建的所有合规搜索,需获取搜索名称(Name)及对应的ExchangeLocation(目标邮箱)。
单独查询单个搜索时,以下代码可正常返回$search.Name和$search.ExchangeLocation的值:
$search = Get-ComplianceSearch -Identity "nameofsearchgoeshere"
但自定义的遍历函数调用时,$searchName能正常输出,$ExchangeLocation始终为空。函数代码如下:
function Get-ComplianceSearches { param( [Parameter(Mandatory = $true)][string]$Individual ) $complianceSearches = Get-ComplianceSearch -ResultSize Unlimited $individualSearches = $complianceSearches | Where-Object { $_.CreatedBy -eq $Individual } foreach ($search in $individualSearches) { $searchName = $search.Name $ExchangeLocation = $search.ExchangeLocation Write-Host "Search Name: $searchName" Write-Host "Exchange Location: $ExchangeLocation" Write-Host "--------------------------" } }
原因分析
Get-ComplianceSearch在不带-Identity参数批量查询时,默认仅返回基础属性集合,ExchangeLocation属于需要单独请求才会加载的扩展属性。单个查询时指定-Identity会触发完整对象的加载,因此能获取到该属性值;而批量获取时未加载该属性,所以返回为空。
解决方案
遍历每个搜索时,通过-Identity重新获取完整的合规搜索对象,即可拿到ExchangeLocation属性。修改后的函数代码如下:
function Get-ComplianceSearches { param( [Parameter(Mandatory = $true)][string]$Individual ) $complianceSearches = Get-ComplianceSearch -ResultSize Unlimited $individualSearches = $complianceSearches | Where-Object { $_.CreatedBy -eq $Individual } foreach ($search in $individualSearches) { # 获取完整的搜索对象以加载所有属性 $fullSearchObject = Get-ComplianceSearch -Identity $search.Name $searchName = $fullSearchObject.Name $ExchangeLocation = $fullSearchObject.ExchangeLocation Write-Host "Search Name: $searchName" Write-Host "Exchange Location: $ExchangeLocation" Write-Host "--------------------------" } }
补充说明
如果担心多次调用API的性能影响,可尝试检查是否有参数能让批量查询返回完整属性,但根据Exchange Online PowerShell模块的特性,Get-ComplianceSearch批量查询默认不返回扩展属性,通过-Identity重新获取单个对象是最可靠的解决方式。
内容的提问来源于stack exchange,提问作者lawngnome
相关产品推荐
相关产品推荐

