执行 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
当我运行下面的 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