powershell 在Azure AD组中搜索多个字符串

rdlzhqv9  于 2023-05-07  发布在  Shell
关注(0)|答案(6)|浏览(112)

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模块。
.....

wljmcqd8

wljmcqd81#

为了扩展@AdminOfThings的答案,以及其他关于-Fliter参数的答案,让我们对发生的事情进行调查。
使用:AzureAD版本2.0.2.76
docsGet-AzureADGroup-Filter参数使用“OData v3.0协议”(我在这里故意使用大的空引号)。但是,当你 * 实际 * 尝试使用更高级的过滤器参数,如substringof()endswith()时,我们会得到错误:

Get-AzureADGroup : Error occurred while executing GetGroups
Code: Request_UnsupportedQuery
Message: Unsupported Query.

所以,那没用。好了,让我们切换到使用-SearchString参数,该参数“应该”(大的空引号)执行GetVague操作,也称为OData $search操作(在本例中,我们试图将其误用为$substring()操作)。让我们试试:

Get-AzureADGroup -SearchString "Department_XY"

按预期返回结果。现在,让我们尝试搜索DisplayName末尾的内容,“Member”:

Get-AzureADGroup -SearchString "Member"
No Results.

这意味着实际发生的是它正在执行$filter=startswith()查询,而不是预期的$search查询。
docs还指出-SearchString不接受通配符,也不接受-Filter参数,并且用于过滤的OData协议不使用通配符。它只做直接的字符匹配。这就是为什么尝试:

Get-AzureADGroup -SearchString "Department_XY*"

不返回任何结果。这是因为我们不是在搜索任何以“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

Get-AzureADGroup : Error occurred while executing GetGroups
Code: Request_UnsupportedQuery
Message: Unsupported Query.
RequestId: 3455cecd3-bcbc-4257-9be6-69e05a123e26
DateTimeStamp: Wed, 01 Jan 2020 01:01:01 GMT
HttpStatusCode: BadRequest
HttpStatusDescription: Bad Request
HttpResponseStatus: Completed

微软Graph API

让我们探索Microsoft Graph API并弄清楚发生了什么。为此,让我们使用Microsoft Graph Explorer。登录,授予所需的权限,包括执行查询所需的Group.Read.All权限。
当我们执行-Filter查询时,我们执行的是:

PowerShell:

Get-AzureADGroup -Filter "startswith(DisplayName, 'Department_XY')"

Microsoft Graph API调用:

https://graph.microsoft.com/v1.0/groups?$filter=startswith(displayName,'Department_XY')

这两个操作都返回预期的数据行。
因此,让我们尝试使用endswith()的OData过滤器查询:

PowerShell:

Get-AzureADGroup -Filter "endswith(DisplayName, 'Member')"
Get-AzureADGroup : Error occurred while executing GetGroups
Code: Request_UnsupportedQuery
Message: Unsupported Query.
RequestId: 3455cecd3-bcbc-4257-9be6-69e05a123e26
DateTimeStamp: Wed, 01 Jan 2020 01:01:01 GMT
HttpStatusCode: BadRequest
HttpStatusDescription: Bad Request
HttpResponseStatus: Completed

Microsoft Graph API调用:

https://graph.microsoft.com/v1.0/groups?$filter=endswith(DisplayName, 'Member')
{
    "error": {
        "code": "Request_UnsupportedQuery",
        "message": "Unsupported Query.",
        "innerError": {
            "request-id": "19ab3d69-77f7-45ea-b871-4dd518509193",
            "date": "2020-01-08T17:53:07"
        }
    }
}

这两种方法都给予了相同的“Unsupported Query.”错误。
当我们查看有关filter query参数的API文档时,我们看到只支持OData查询过滤器的一个子集,最重要的是,filter部分末尾的Note说:
注意:Azure AD资源不支持以下$filter运算符:negtgeltlenot。当前任何Microsoft Graph资源都不支持contains字符串运算符。
这意味着我们剩下三种可能的filter操作:

  • 等于(eq
  • startswith
  • any

这意味着目前除了Microsoft Graph源 * 中的精确匹配或startswith * 之外,没有任何其他方式可以过滤组名。
等等!-SearchString怎么样?这将等同于$searchOData查询参数。它可以在PowerShell中工作,为什么不能在Graph API中工作?

PowerShell:

Get-AzureADGroup -SearchString "Department_XY"
...Returns Group Results...

Microsoft Graph API调用:

https://graph.microsoft.com/v1.0/groups?$search="Department_XY"
{
    "error": {
        "code": "Request_UnsupportedQuery",
        "message": "This query is not supported.",
        "innerError": {
            "request-id": "67fe0362-d78d-4de3-b52a-c8bfce109f98",
            "date": "2020-01-08T18:23:10"
        }
    }
}

这是怎么回事?查看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。你最终得到的代码是:

$groups = Get-AzureADGroup -SearchString 'Department_XY' -All $true
$groups | Where-Object { $_.DisplayName.EndsWith('Member') }
c90pui9n

c90pui9n2#

-SearchString似乎不接受任何通配符,只搜索DisplayName值的开头,即有效的.StartsWith(string)
-Filter使用OData v3查询语言(除非已更新到v4)。但是,由于某种原因,许多功能不可用,包括endswith()substringof()
您可以使用-SearchStringWhere-Object-FilterWhere-Object的组合来创建高效的查询。

Get-AzureAdGroup -SearchString 'Department_XY' -All $true |
    Where-Object { $_.DisplayName.EndsWith('Member') }
frebpwbc

frebpwbc3#

这一个对我来说就像一个魅力...(您可以在搜索字符串中的任何位置使用通配符)

Get-AzureAdGroup -All $True | Where-Object { $_.DisplayName -like ('*first*second*') }
l2osamch

l2osamch4#

根据我的理解,您希望获得名称具有以下格式的AD组:Department_A_{GroupName}_Members .
所以当你需要过滤一个列表时,你可以使用Where-Object语句。
在这种情况下,请尝试以下命令:

Get-AzureADGroup | Where-Object {$_.DisplayName -like 'Department_A_*_Members'}
xcitsw88

xcitsw885#

这里有一个使用select-object进行过滤的方法。我把它放到一个变量里,以防以后需要用到。我添加了一个-,所以你可以检查两个部门和“成员”。如果您想替换 Department_XY,您也可以将组名用通配符括起来。('* groupname *')

$groups = Get-AzureADGroup -All $true
$groups | Select-Object {$_.DisplayName -like '*Department_XY*' -and $_.DisplayName -like '*member*'}
l2osamch

l2osamch6#

试试下面的选项。在MS文档中给出了/user的示例。我试着与团体和它的工作。

graph.microsoft.com/v1.0/groups?$count=true&$search="displayName:Finance"&ConsistencyLevel=eventual

相关问题