执行 Exchange PS 远程处理时出错:方法调用失败?

Error in executing Exchange PS remoting: Method invocation failed?

当我运行下面的 PowerShell 脚本获取未分类为共享邮箱的非活动 AD 用户帐户 Exchange 邮箱列表时。

脚本:

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://PRODMAIL01-VM/PowerShell/ -Authentication Kerberos
Import-PSSession $Session -AllowClobber

$filter = '(Enabled -eq $false) -and (msExchRecipientTypeDetails -ne 4) -and (homeMDB -ne "$null")'
$properties = @('homeMDB', 'mailNickName', 'mail', 'DisplayName', 'SamAccountName', 'ProxyAddresses')

Get-ADUser -Filter $filter -Properties $properties  |
    ForEach-Object {
    $stat = Get-MailboxStatistics $_.SamAccountName

    $smtpAddresses = ($_.ProxyAddresses | Where-Object {$_ -like "*smtp:*" }) -replace 'smtp:'

    New-Object -TypeName PSObject -Property ([ordered]@{
            DisplayName             = $_.DisplayName
            mailNickName            = $_.mailNickName
            SamAccountName          = $_.SamAccountName
            mail                    = $_.mail
            ProxyAddresses          = $smtpAddresses -join ';'
            HomeMDB                 = $_.homeMDB.Split(',=')[1]
            MBytes                  = $stat.TotalItemSize.Value.ToMB()
            LastLogonTime           = $stat.LastLogonTime
            LastLoggedOnUserAccount = $stat.SamAccountName
            DisconnectDate          = $stat.DisconnectDate
        })
} |
    Sort-Object MBytes -Descending |
    Export-Csv C:\TEMP\Results.csv -NoTypeInformation

这是重复数千次的错误消息:

Method invocation failed because [Deserialized.Microsoft.Exchange.Data.ByteQuantifiedSize] does not contain a method named 'ToMB'. At line:15 char:5 + New-Object -TypeName PSObject -Property ([ordered]@{ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (ToMB:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound

因为你在远程会话中是运行 this,所以返回对象的类型丢失了。尝试 $stat.TotalItemSize.Value.GetType(),您会发现它是 PSCustomObject

您可以进行一些 String 解析。首先将 Value 从空格中拆分出来:

$stat.TotalItemSize.Value -split " "

从结果数组中取出第一项:

($stat.TotalItemSize.Value -split " ")[0]

最终将其转换为数字:

[float]($stat.TotalItemSize.Value -split " ")[0]

代码中的行应如下所示:

MBytes = [float]($stat.TotalItemSize.Value -split " ")[0]

如果传入的数据是 MB、GB、KB 等的混合,您最好解析出括号中的字节。

下面是如何获取原始值并将其转换为字节。获取字节后,将数字除以 1000^n 或 1024^n 即可得到您要查找的度量单位。

示例邮箱 - 使用 TotalItemSize 属性的大小为 6.916 GB。

这将转换为 GB,四舍五入为 3 位小数:

[math]::Round(([long]((($s.totalitemsize.value -split "\(")[1] -split " ")[0] -split "," -join ""))/[math]::Pow(1024,3),3)

我们如何到达那里:

单独使用 TotalItemSize 是行不通的,需要它的值,但该值包含我们不能按原样使用的数据。

因此,我们拆分了左括号中的数据,得到了 2 个值。我们想要第二个值,即索引 1(索引 0 是第一个值)。这是第 4 个 cmdlet 条目中的 1。

我们想从中去掉“bytes)”。因此,拆分 space,并获取索引 0.

现在我们需要从数据中删除逗号。在逗号处拆分,然后使用空字符串将它们重新连接在一起。

但是,这仍然是一个字符串,我们还不能执行任何数学函数。我们需要转换为一个长整数——而不仅仅是一个普通整数。 [长]

我们可以通过两次除以 1024 来转换为 MB (是的,我知道这对某些人来说真的是 MiB)

或者,我们可以除以 1024 的二次方 [math]::Power(1024,2)。 去GB,去3次方。

Screenshot of the steps