在PowerShell中使用ADfilter会发生什么?

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

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

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

当运行相同的数据时返回两个完全不同的东西,第一个命令返回期望的值。 乍看之下,尽pipeNULL显然不等于“auto”,但在描述字段中具有空值的用户不会以第二个命令中的匹配返回。

有几个聊天的人看了看,证实我并不疯狂。 这里发生了什么?

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

 get-aduser 

请仔细阅读下面的内容,请记住,此cmdlet的结果包含所有AD用户,而不pipe其后面的-filter参数中的任何内容。

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

 {-not (description -eq "auto")} 

…手段

  1. “找出description属性等于文本string”auto“的位置,为了比较起作用,在描述字段中需要存在一个string,以便-eq操作符能够将其与”auto“进行比较。从这个比较,因为它不能比较一个NULL值和一个string值。
  2. 独立于 -eq filter参数给我所有不是(description -eq "auto") ,它将包括NULL,因为原来的cmdlet, get-aduser ,包括所有AD用户。 它不需要和-not运算符进行任何比较。 除了(description -eq "auto")filter的结果,它只是给了你一切。

在你的例子中,假设你有1个AD用户,他们的描述等于“auto”,几百个用“auto”以外的东西和几百个NULL描述。 通过命令逻辑,它将执行:

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

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

第二个命令:

 {description -ne "auto"} 

…手段

  1. “找出描述属性不等于确切string”auto“的位置,同样,为了进行比较,在描述字段中需要存在一个string,以便-ne运算符能够将其与”auto“进行比较。由于无法将NULL与string值进行比较,所以从该比较中删除NULL值。

在你的例子中,假设你有1个AD用户,他们的描述等于“auto”,几百个用“auto”之外的几百个,NULL用几百个描述。 通过命令逻辑,它将执行:

  1. 给我所有描述不等于“自动”的广告用户 – 在他们的描述中导致几百个用户使用“自动”以外的东西。 它不拉用NULL描述的用户,因为它不能将NULL与文本string进行比较。

无论哪种方式,两个命令之间的完全不同是绝对不直观的。

使用这个命令你应该可以在这里用“-and”来捕获NULL,就像这样:

 {description -ne "auto" -and description -ne $NULL} 

我不是100%的语法,因为我现在不能testing它,而且也可能有更好的方法。 当它全部被分解时,它是相当反气候的,并且花了很多打字来解释,但是在使用各种操作员之前,我遇到了这样的奇怪的东西,并且经历了很多反复试验,因为我无法记住所有的注意事项随着使用每一个。

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

比较运算符

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

比较运算符包括匹配运算符(-match,-notmatch),它们使用正则expression式查找模式; replace运算符(-replace),它使用正则expression式来改变input值; 类似运算符(-like,-notlike),它们使用通配符(*)查找模式; 和包含操作符(in,-notin,-contains,-notcontains),它们决定testing值是否出现在参考集中。

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

有关更多信息,请参阅about_Comparison_Operators

逻辑运算符

使用逻辑运算符(-and,-or,-xor,-not,!)将条件语句连接成单个复合条件语句 。 例如,您可以使用逻辑运算符和运算符来创build具有两种不同条件的对象filter。

有关更多信息,请参阅about_Logical_Operators。