PowerShell 中的这个 AD 过滤器到底是怎么回事?

MDM*_*rra 9 powershell

最近写了这个答案并偶然发现了一些有趣的东西。

get-aduser -filter {-not (description -eq "auto")} | measure-object

get-aduser -filter {description -ne "auto"} | measure-object

对相同数据运行时返回两个非常不同的东西,第一个命令返回预期值。乍一看,在描述字段中具有空值的用户不会作为第二个命令中的匹配项返回,即使 NULL 显然不等于“自动”。

聊天中的几个人看过这个并证实我没有疯。这里发生了什么?

Aug*_*ust 4

两者之间的主要区别是第一个命令不涉及直接比较值来获取所有结果,而第二个命令则涉及。第一个命令包含 NULL 结果,第二个命令不包含(正如 MDMarra 已经发现的那样)。这两个命令都以此 cmdlet 开头:

get-aduser
Run Code Online (Sandbox Code Playgroud)

在执行以下操作时,请记住,此 cmdlet 的结果包括所有 AD 用户,无论-filter其后面的参数中的其他内容如何。

现在让我们分解两个不同的部分。第一个:

{-not (description -eq "auto")}
Run Code Online (Sandbox Code Playgroud)

...方法

  1. “找出描述属性在哪里等于文本字符串“auto”。为了使此比较起作用,描述字段中需要存在一个字符串,以便操作-eq员能够将其与“auto”进行比较。从中删除 NULL 值比较,因为它无法将 NULL 与字符串值进行比较。
  2. 独立于-eqfilter 参数给我所有不是 的结果的内容(description -eq "auto"),其中将包括 NULL,因为原始 cmdletget-aduser包括所有 AD 用户。它不必与-not操作员将任何东西与其他东西进行比较。它只是为您提供了除了过滤器结果之外的所有内容(description -eq "auto")

在您的示例中,假设您有 1 个 AD 用户,其描述等于“auto”,数百个用户的描述不同于“auto”,还有数百个用户的描述为 NULL。单步执行命令逻辑将会执行以下操作:

  1. 给我所有描述等于“auto”的 AD 用户 (get-aduser) - 结果为 1 个用户
  2. 给我所有不是你刚刚给我的 AD 用户 - 结果是几百个有其他东西的用户和几百个有 NULL 的用户。

由于它不必使用-not运算符将​​任何内容与其他任何内容进行比较,因此结果包括在原始get-adusercmdlet 中捕获的 NULL 描述用户。

第二条命令:

{description -ne "auto"}
Run Code Online (Sandbox Code Playgroud)

...方法

  1. “找出描述属性在哪里不等于确切的字符串“auto”。同样,为了使此比较起作用,描述字段中需要存在一个字符串,以便操作员-ne能够将其与“auto”进行比较。NULL 值从此比较中删除,因为它无法将 NULL 与字符串值进行比较。

在您的示例中,再次假设您有 1 个 AD 用户,其描述等于“auto”,数百个用户的描述不同于“auto”,还有数百个用户的描述为 NULL。单步执行命令逻辑将会执行以下操作:

  1. 给我所有描述不等于“auto”的 AD 用户 - 导致数百个用户的描述中包含除“auto”以外的内容。它不会提取具有 NULL 描述的用户,因为它无法将 NULL 与文本字符串进行比较。

无论哪种方式,这两个命令之间的整体差异绝对是不直观的。

使用此命令,您应该能够使用“-and”捕获 NULL,如下所示:

{description -ne "auto" -and description -ne $NULL}
Run Code Online (Sandbox Code Playgroud)

我不是 100% 熟悉语法,因为我现在无法测试它,而且可能还有比这更好的方法。当它全部分解时,它是相当反气候的,需要大量的打字来解释,但在使用各种运算符和大量的试验和错误之前,我遇到过这样奇怪的东西,因为我永远记不起所有的警告这与使用每一个都相伴随。

参考:http ://technet.microsoft.com/en-us/library/hh847732.aspx :

比较运算符

使用比较运算符(-eq、-ne、-gt、-lt、-le、-ge)来比较值和测试条件。例如,您可以比较两个字符串值以确定它们是否相等。

比较运算符包括匹配运算符(-match、-notmatch),它使用正则表达式查找模式;替换运算符(-replace),它使用正则表达式来更改输入值;like 运算符(-like、-notlike),使用通配符 (*) 查找模式;以及包含运算符(in、-notin、-contains、-notcontains),它们确定测试值是否出现在参考集中。

它们还包括按位运算符(-bAND、-bOR、-bXOR、-bNOT)来操作值中的位模式。

有关详细信息,请参阅 about_Comparison_Operators

逻辑运算符

使用逻辑运算符(-and、-or、-xor、-not、!)将条件语句连接成单个复杂条件。例如,您可以使用逻辑 -and 运算符来创建具有两个不同条件的对象过滤器。

有关详细信息,请参阅 about_Logical_Operators。