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

Posted

技术标签:

【中文标题】执行 Exchange PS 远程处理时出错:方法调用失败?【英文标题】:Error in executing Exchange PS remoting: Method invocation failed? 【发布时间】:2019-04-19 08:40:33 【问题描述】:

当我运行以下 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

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

方法调用失败,因为 [Deserialized.Microsoft.Exchange.Data.ByteQuantifiedSize] 没有 包含一个名为“ToMB”的方法。在行:15 字符:5 + 新对象 -TypeName PSObject -Property ([ordered]@ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ + CategoryInfo : InvalidOperation: (ToMB:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound

【问题讨论】:

【参考方案1】:

如果传入的数据是 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。

我们想从中去掉“字节)”。因此,在空间上拆分,并获取索引 0。

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

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

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

或者,我们可以除以 1024 的 2 次方 [math]::Power(1024,2)。 对于 GB,请进行 3 次方。

Screenshot of the steps

【讨论】:

哇,谢谢,确实有效。【参考方案2】:

因为您是在远程会话中运行它,所以返回对象的类型会丢失。试试$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]

【讨论】:

以上是关于执行 Exchange PS 远程处理时出错:方法调用失败?的主要内容,如果未能解决你的问题,请参考以下文章

CVE-2020-0688_微软EXCHANGE服务的远程代码执行漏洞复现

安全预警Microsoft Exchange Server 远程代码执行漏洞

Windows远程桌面连接时出错,重启还是不行的处理方法。

Windows远程桌面连接时出错,重启还是不行的处理方法。

exchange 2010对手机邮箱执行远程擦除

预警Microsoft Exchange Server远程代码执行漏洞-高危