【问题标题】:Grabbing Specific AD Groups that a User is a Member Of获取用户所属的特定 AD 组
【发布时间】:2021-05-28 23:16:52
【问题描述】:

我这辈子都想不通。我要做的是获取用户所属的所有组的列表。然后我想把这些传递给我,并抓住我正在寻找的特定群体。

以下是我目前所拥有的:

(Get-ADUser $user -Properties MemberOf ).MemberOf | Where-Object {$_.Name -contains 'Part of Group Name'}

这不返回任何内容。我有一种感觉,我没有在我的 Where-Object 中引用正确的属性,但我很难找到那是什么。我知道(Get-ADUser $user -Properties MemberOf ).MemberOf的结果是:

CN=App - dyn_readuser_prod_WeblogicApps_NS,OU=Groups,OU=USCC,DC=int,DC=usc,DC=local
CN=App - dyn_readuser_prod_osb_NS,OU=Groups,OU=USCC,DC=int,DC=usc,DC=local
CN=App - dyn_readuser_prod_openshift_NS,OU=Groups,OU=USCC,DC=int,DC=usc,DC=local
CN=App - dyn_readuser_nonprod_WeblogicApps_NS,OU=Groups,OU=USCC,DC=int,DC=usc,DC=local
CN=App - dyn_readuser_nonprod_osb_NS,OU=Groups,OU=USCC,DC=int,DC=usc,DC=local
CN=App - dyn_readuser_nonprod_openshift_NS,OU=Groups,OU=USCC,DC=int,DC=usc,DC=local

我只是不知道如何引用“CN”。

【问题讨论】:

  • 一个常见的错误。 -contains operator 用于检查是否可以在字符串数组中找到字符串。字符串自己的.Contains 方法 用于检查是否可以在另一个字符串中找到子字符串(并且区分大小写)。在这种情况下,我建议使用 -like 运算符 ($_.Name -like '*PartOfGroupName*') 或使用正则表达式 -match 运算符 ($_.Name -match 'PartOfGroupName')
  • @Theo 当我使用-like 时,它仍然没有返回任何内容。我在想$_.Name 可能有问题
  • @Theo - 只是为了更加强调,我会将您的 .Contains 更改为 .Contains()。对我来说,这让“这是一种方法”更加清晰。
  • @Lee_Dailey 是的,但不幸的是,编辑评论为时已晚..
  • 这里的事情是你明确地扩展了 .MemberOf 属性,有效地删除了所有其他属性,如 .Name。 (你有一个字符串数组,仅此而已)所以在Where-Object 子句中,你只需要使用$_ -like ..

标签: powershell windows-scripting


【解决方案1】:

试试这个方法:

(Get-ADUser $user -Properties memberOf).memberOf |
  Where-Object { $_ -like 'CN=*Part of Group Name*,*' }

PowerShell v3 及更高版本中的(...).memberOf 语法在功能上等同于管道到Select-Object -ExpandProperty memberOf,因此您也可以这样编写:

Get-ADUser $user -Properties memberOf |
  Select-Object -ExpandProperty memberOf |
  Where-Object { $_ -like 'CN=*part of group name*,*' }

(不支持(...).memberOf“语法糖”的PowerShell v2 需要第二个变体。)

【讨论】:

  • 这正是我想要的,谢谢。我在下面阅读了您对答案的回复。他的作品也很好,但我理解你所说的对象名称,不包括破坏 cmdlet 的字符。非常感谢
【解决方案2】:

有一个 cmdlet 可以很好地获取用户的组成员身份。请尝试以下操作:

Get-ADPrincipalGroupMembership -Identity $user | Select -ExpandProperty Name | Select-String -Pattern 'Part of Group Name' 

【讨论】:

  • 原则上这是个好主意,但不幸的是Get-ADPrincipalGroupMembership cmdlet is broken in such a way that makes it fundamentally unreliable所以我不推荐使用它。不过,我在链接答案中发布的脚本可以正常工作。
  • 如果您希望使用 DN 格式而不是普通/可读格式,请展开“DistinguishedName”的属性
  • @Bill_Stewart 有趣的是,我已经相当广泛地使用了这个 cmdlet,并且从未遇到过问题。显然,如果 OP 有这个问题,那么另一种方法是有利的。
  • 您很幸运,因为您的对象名称不包含任何破坏 cmdlet 的字符(这在更加异构的 AD 环境中变得越来越不可能)。我强烈建议不要在任何生产脚本中使用Get-ADPrincipalGroupMembership
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多