【问题标题】:Get large Mailboxes, sorted with Size and with AD Status获取大邮箱,按大小和 AD 状态排序
【发布时间】:2020-05-22 19:42:55
【问题描述】:

我正在寻求社区的帮助。

我正在编写一个脚本,它将获得:

  1. 每个用户邮箱的邮箱统计,将总大小转换为字节进行排序,得到每个邮箱DB的前5个。
  2. 获取每个用户的活动目录状态(启用/禁用)

我期待如下所示的输出,但最后的 AD 字段为空

Querying Mailbox Database: DBX ......
DisplayName      ItemCount TotalItemSize                   SizeInBytes Server   AD
-----------      --------- -------------                   ----------- ------   --
abc xyz             240259 40.05 GB (43,004,724,140 bytes) 43004724140 ******
ab xyzd****         126020 33.2 GB (35,646,143,893 bytes)  35646143893 ******
ab xyzd****         126020 33.2 GB (35,646,143,893 bytes)  35646143893 ******

Powershell 脚本:

$DBlist=(Get-MailboxDatabase * | where Server -EQ "EXCHANGE_Server").Name | sort
$DB_Count = ($DBlist | Measure-Object).Count

Write-Host "`n There are $DB_Count DBs with active copy on EXCHANGE_Server: "
Write-Host " $DBlist" -NoNewline

#echo $DBlist

foreach ($DB in $DBlist)
        {
        Write-Host "`n Querying Mailbox Database: $DB ......"
        Get-Mailbox -Database $DB | Get-MailboxStatistics -WarningAction SilentlyContinue | Select-Object -Property DisplayName,ItemCount,TotalItemSize,@{Label="SizeInBytes";Expression={$_.TotalItemSize.Value.ToString().Split('(')[1].Split(' ')[0].Replace(',','').ToInt64($null)}}, @{n='Server';e={(Get-MailboxStatistics -identity $_.DisplayName).ServerName}}, @{n='AD';e={(Get-ADUser -Filter {DisplayName -like $_.DisplayName}).Enabled}} | Sort-Object -Property SizeInBytes -Descending |Select-Object DisplayName,ItemCount,TotalItemSize,SizeInBytes,Server, AD -First 20 | ft -AutoSize
        }

【问题讨论】:

    标签: powershell active-directory exchange-server


    【解决方案1】:

    使用以下计算属性会更好:

    @{n='AD';e={(Get-ADUser -Filter "DisplayName -eq '$($_.DisplayName)'").Enabled}}
    

    有几个问题需要解决。

    1. -Filter 参数值不应是脚本块,尽管文档中有说明。它应该是一个双引号字符串,例如-Filter "DisplayName -like '$($_.DisplayName)'"。内部单引号是必需的,因此在评估 $($_.DisplayName) 并将其作为字符串放入查询时不会出现语法错误。
    2. 使用不带任何通配符的 -like 运算符对搜索结果没有帮助,而且效率低于仅使用 -eq
    3. 在可扩展字符串(双引号字符串)内使用语法object.property 插入对象属性时,需要先计算表达式,然后再将值转换为字符串。默认情况下,没有成员访问权限的变量(例如 $var)会将其值转换为字符串(您的实际结果可能会根据 $var 的实际情况而有所不同)。但是,$var.property 会将$var 值转换为字符串,然后将.property 附加到字符串的末尾。为避免这种行为,您可以使用子表达式 $() 在字符串转换之前评估内部内容。 $($var.property) 就是一个例子。

    【讨论】:

    • 我还有一个问题,请指出我是否应该将它放在一个新问题中:脚本从多个服务器获取输出,有没有办法将每个服务器输出传递给 csv 然后合并他们都在一张excel表下?
    • 如果您想使用 Excel,我建议您查看 ImportExcel 模块。如果您想根据服务器对输出进行分组并将这些分组输出到单独的 CSV 中,您可以使用$output | group-object Server | Foreach-Object { $_.Group | Export-Csv -Path ($_.Name + '.csv') -NoType }
    猜你喜欢
    • 2018-03-23
    • 2013-01-12
    • 2019-12-02
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多