方法调用失败,因为X不包含名为“ op_Subtraction”的方法

时间:2019-12-12 07:44:43

标签: powershell active-directory

我制作了一个脚本来分析我每天处理的广告。

过去几个月来它一直运行良好,没有错误,但是今天早上出现了,我不知道为什么。

在执行过程中:

$adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_.enabled -ne $true}).count) - 2
Write-Host "ADMIN ACCOUNTS DISABLED : "$adm_disabled

然后出现以下错误(我以前从未遇到过,它是法语btw):

Échec lors de l’appel de la méthode, car [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] ne contient pas de méthode nommée « op_Subtraction ».
Au caractère D:\Users\pmonties\OneDrive - Professional\Documents\Scripts_PS_Test\ANALYSE_AD.ps1:29 : 1
+ $adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation : (op_Subtraction:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

翻译

Method invocation failed because [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] does not contain a method named 'op_Subtraction'.
At D:\Users\pmonties\OneDrive - Professional\Documents\Scripts_PS_Test\ANALYSE_AD.ps1:29 : 1
+ $adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation : (op_Subtraction:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

我不明白,为什么减法突然不起作用?

2 个答案:

答案 0 :(得分:3)

错误表明“不可能从类型[Microsoft.ActiveDirectory.Management.ADPropertyValueCollection]的对象中减去”

当您尝试对不支持算术的事物进行算术运算时,总是会发生此类错误:

# fails the same way:
@() - 2

以您的情况为例

(($something).count) - 2

独立于$something是什么,您的期望是.Count将是这些事物的计数,因此是一个数字。

但是,如果$something偶然具有名为Count own 属性,会发生什么?然后PowerShell将更喜欢为您提供该属性,如果该属性不是数字,而是ADPropertyValueCollection,则会发生上述错误。

$a = @{ some = "object" }
$b = @{ some = "object"; Count = 1,2,3 }

$a.Count - 2 # succeeds
$b.Count - 2 # fails with "[System.Object[]] does not contain a method named 'op_Subtraction'

为防止这种情况,您可以使用Measure-Object,它返回一个MeasureInfo,它具有一个数字Count

($something | Measure-Object).count - 2

答案 1 :(得分:1)

忘记我的先前回复。我想我找到了根本原因。

我限制了Get-ADUser的结果,因此在Where-filter之后,只剩下1个用户。该用户没有count属性,因为它只是1个对象。

#limit Get-ADUser using array notation [0..1]
$adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)")[0..1] | Where {$_.Enabled -ne $true}).Count - 2

只需添加一个@符号,表明我正在处理数组,它又可以工作了。

$adm_disabled = @(Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_.Enabled -ne $true}).Count - 2