AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 465884
Accepted
MDMarra
MDMarra
Asked: 2013-01-11 09:16:48 +0800 CST2013-01-11 09:16:48 +0800 CST 2013-01-11 09:16:48 +0800 CST

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

  • 772

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

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

和

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

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

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

powershell
  • 2 2 个回答
  • 3735 Views

2 个回答

  • Voted
  1. Best Answer
    August
    2013-01-15T13:27:56+08:002013-01-15T13:27:56+08:00

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

    get-aduser
    

    执行以下操作时,请记住此 cmdlet 的结果包括所有 AD 用户,而不考虑-filter其后参数中的任何其他内容。

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

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

    ...方法

    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。

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

    第二个命令:

    {description -ne "auto"}
    

    ...方法

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

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

    1. 给我所有描述不等于“自动”的 AD 用户 - 导致数百名用户在他们的描述中使用除“自动”以外的其他内容。它不会拉取具有 NULL 描述的用户,因为它无法将 NULL 与文本字符串进行比较。

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

    使用此命令,您应该能够像这样在其中使用“-and”捕获 NULL:

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

    我不是 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、!)将条件语句连接成一个复杂的条件语句。例如,您可以使用逻辑与运算符来创建具有两个不同条件的对象过滤器。

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

    • 4
  2. WhoIsRich
    2019-07-09T06:32:15+08:002019-07-09T06:32:15+08:00

    添加到搜索时出现的这个老问题:

    将 -Filter 与否定匹配(例如 -ne 或 -notlike)一起使用会排除具有空 null 值的结果。要包含它们,您还需要使用-notlike '*'进行显式匹配,因为-eq ''和-eq $NULL不是有效过滤器。请注意,这是 -Filter 的一个怪癖,使用直接的 -LdapFilter 会否定匹配空值。

    下面是一个 Filter 和 LdapFilter 的多重匹配示例:

    Get-ADUser -Filter { mail -like '*example*' -and (description -ne 'example' -or description -notlike '*') }
    
    Get-ADUser -LdapFilter '(&(mail=*example*)(!description=example))'
    
    • 0

相关问题

  • 资源锁和电源外壳

  • 脚本 - 如何断开远程桌面会话?

  • 如何限制向通讯组发送到外部地址?

  • Powershell对值与数组的作用不同?

  • Windows Powershell Vim 键绑定

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve