Azure AD组具有以下命名约定:Department_GroupName_Membership类型(有三个选项:访客/会员/拥有者)。我需要能够添加用户到所有组从部门XY与成员类型“成员”。例如Department_XY_{GroupName}_Member
。
我不知道如何检索这些组的列表。Get_AzureAdGroup
Cmdlet的-Filter
参数应该采用的ODATA过滤器子句工作起来很奇怪。
例如,Get-AzureADGroup -Filter "startswith(DisplayName, 'Department_XY')"
工作正常,但是Get-AzureADGroup -Filter "endswith(DisplayName, 'Member')
抛出错误。
所以我想有更好的方法来做到这一点吗?
我已经安装了AzureAD模块。.....
6条答案
按热度按时间wljmcqd81#
为了扩展@AdminOfThings的答案,以及其他关于
-Fliter
参数的答案,让我们对发生的事情进行调查。使用:AzureAD版本2.0.2.76
从docs
Get-AzureADGroup
-Filter
参数使用“OData v3.0协议”(我在这里故意使用大的空引号)。但是,当你 * 实际 * 尝试使用更高级的过滤器参数,如substringof()
和endswith()
时,我们会得到错误:所以,那没用。好了,让我们切换到使用
-SearchString
参数,该参数“应该”(大的空引号)执行GetVague
操作,也称为OData$search
操作(在本例中,我们试图将其误用为$substring()
操作)。让我们试试:按预期返回结果。现在,让我们尝试搜索
DisplayName
末尾的内容,“Member”:这意味着实际发生的是它正在执行
$filter=startswith()
查询,而不是预期的$search
查询。docs还指出
-SearchString
不接受通配符,也不接受-Filter
参数,并且用于过滤的OData协议不使用通配符。它只做直接的字符匹配。这就是为什么尝试:不返回任何结果。这是因为我们不是在搜索任何以“
Department_XY
”开头的内容,而是在显式地搜索任何以“Department_XY*
”开头的内容,它将末尾的 * 星号 * 作为名称的一部分。那么,关于 * 为什么 * 这不像预期的那样工作?我们习惯于使用带有通配符、正则表达式和疯狂筛选选项的PowerShell cmdlet。我们基本上已经被Active Directory PowerShell模块和我们可以在其上执行的操作宠坏了。为了完全理解 * 为什么 *,我们必须理解当我们运行
Get-AzureADGroup
时 * 发生了什么?从本质上讲,AzureAD module是一个巨大的PowerShell Package 器,它使Microsoft Graph API调用和抽象的获取/设置/安全/令牌的复杂性远离我们。这就是为什么
-Filter
使用OData v3.0协议语法,而不是像通配符/regex这样更“PowerShell-y”的语法。这就是为什么完整的错误消息中有一个HttpStatusCode: BadRequest
:微软Graph API
让我们探索Microsoft Graph API并弄清楚发生了什么。为此,让我们使用Microsoft Graph Explorer。登录,授予所需的权限,包括执行查询所需的
Group.Read.All
权限。当我们执行
-Filter
查询时,我们执行的是:PowerShell:
Microsoft Graph API调用:
这两个操作都返回预期的数据行。
因此,让我们尝试使用
endswith()
的OData过滤器查询:PowerShell:
Microsoft Graph API调用:
这两种方法都给予了相同的“Unsupported Query.”错误。
当我们查看有关filter query参数的API文档时,我们看到只支持OData查询过滤器的一个子集,最重要的是,filter部分末尾的Note说:
注意:Azure AD资源不支持以下
$filter
运算符:ne
、gt
、ge
、lt
、le
和not
。当前任何Microsoft Graph资源都不支持contains
字符串运算符。这意味着我们剩下三种可能的
filter
操作:eq
)startswith
any
这意味着目前除了Microsoft Graph源 * 中的精确匹配或
startswith
* 之外,没有任何其他方式可以过滤组名。等等!
-SearchString
怎么样?这将等同于$search
OData查询参数。它可以在PowerShell中工作,为什么不能在Graph API中工作?PowerShell:
Microsoft Graph API调用:
这是怎么回事?查看docs for search query参数,在顶部,有注解:
注:您当前只能搜索邮件和人员集合。一个
$search
请求最多返回250个结果。您不能在搜索请求中使用$filter
或$orderby
。这意味着不实现按组搜索。PowerShell cmdlet正在做的是提供一个
-SearchString
参数,目的是将来可以将其连接到适当的search
查询参数,但现在,它使用$filter=startswith()
查询“伪造”它。一旦Microsoft Graph API支持更多查询参数和更多更新,这种“伪造”可能会改变。因此,我们已经彻底用尽了在源头进行过滤的所有选项。我们必须在PowerShell客户端上完成所有过滤。我们可以:
聪明一点,至少使用@AdminOfThings answer根据开始字符串预过滤组。
使用
-SearchString
,因为这样我们就不用显式地摆弄过滤器查询格式。正如@MerillFernando提到的,我们必须指定
-All $true
参数,因为我们知道,它正在向Microsoft Graph API发出请求,并且默认情况下它只返回前100个条目。为了解释为什么@AllenWu的答案不起作用,当你运行一个没有
-All $true
开关的Get-AzureADGroup
时,它只会返回100个组。这100组是“随机”选择的。如果你有1000个组,很有可能你试图选择的组可能不在你得到的第一批100个组中。我个人喜欢将条目保存到一个变量中,这样我就可以运行多个不同的查询/过滤器,直到我得到我想要的,而不需要发出多个API请求。
一旦它在PowerShell内部的变量中,我们就可以使用我们喜欢的过滤/正则表达式方法来匹配我们想要的。
在这个用例中,使用
EndsWith()
进行过滤,而不是其他过滤方法,如-like
或regex。我认为@AdminOfThings有正确的想法来过滤这种方式,因为该函数将向后解析字符串,这将比-like
过滤器更快,更有效,因为-like
过滤器必须处理整个字符串。所以,TLDR。你最终得到的代码是:
c90pui9n2#
-SearchString
似乎不接受任何通配符,只搜索DisplayName
值的开头,即有效的.StartsWith(string)
。-Filter
使用OData v3查询语言(除非已更新到v4)。但是,由于某种原因,许多功能不可用,包括endswith()
和substringof()
。您可以使用
-SearchString
和Where-Object
或-Filter
和Where-Object
的组合来创建高效的查询。frebpwbc3#
这一个对我来说就像一个魅力...(您可以在搜索字符串中的任何位置使用通配符)
l2osamch4#
根据我的理解,您希望获得名称具有以下格式的AD组:
Department_A_{GroupName}_Members
.所以当你需要过滤一个列表时,你可以使用
Where-Object
语句。在这种情况下,请尝试以下命令:
xcitsw885#
这里有一个使用select-object进行过滤的方法。我把它放到一个变量里,以防以后需要用到。我添加了一个-,所以你可以检查两个部门和“成员”。如果您想替换 Department_XY,您也可以将组名用通配符括起来。('* groupname *')
l2osamch6#
试试下面的选项。在MS文档中给出了/user的示例。我试着与团体和它的工作。