Microsoft Entra ID 中组的动态成员身份规则

在属于 Microsoft Entra 的 Microsoft Entra ID 中,可以创建基于属性的规则以启用组的动态成员身份。 动态组成员资格使用基于成员属性的成员身份规则自动添加和删除组成员。 本文详细介绍了用于为用户或设备创建动态成员资格规则的属性和语法。 可以为安全组或 Microsoft 365 组中的动态成员身份设置规则。

当用户或设备的属性发生更改时,系统会评估目录中的所有动态组规则,以查看该更改是否会触发任何组添加或删除。 如果某个用户或设备满足组的规则,则将其作为该组成员添加。 如果不再满足规则,则会将其删除。 无法手动添加或删除动态组的成员。

  • 可以创建设备或用户的动态组,但无法创建同时包含用户和设备的规则。
  • 无法根据设备所有者的用户属性来创建设备组。 设备成员身份规则只能引用设备属性。

注意

对于每一个作为一个或多个动态组成员的唯一用户,此功能需要 Microsoft Entra ID P1 许可证或 Intune 教育版。 无需将许可证分配给用户使其成为动态组成员,但必须在 Microsoft Entra 组织中具有涵盖所有此类用户所需的最小许可证数。 例如:如果在组织的所有动态组中总共拥有 1,000 个唯一用户,则需要至少具有 1,000 个 Microsoft Entra ID P1 版的许可证,才能满足许可证要求。 对于作为动态设备组成员的设备,不需要许可证。

Azure 门户中的规则生成器

Microsoft Entra ID 提供了一个规则生成器,用于更快地创建和更新重要规则。 规则生成器支持最多包含五个表达式的构造。 通过规则生成器可以更轻松地使用几个简单表达式来组成规则,但是,它无法用于重现每个规则。 如果规则生成器不支持要创建的规则,则可以使用文本框。

以下是需要使用文本框的高级规则或语法的一些示例:

注意

规则生成器可能无法显示在文本框中构造的某些规则。 当规则生成器无法显示规则时,可能会看到一条消息。 规则生成器不会以任何方式更改动态组规则的支持语法、验证或处理。

有关分步说明,请参阅创建或更新动态组

Screenshot of the add membership rule for a dynamic group.

用于单个表达式的规则语法

单个表达式是成员资格规则的最简单形式,只包括上述的三个部分。 具有单个表达式的规则与此示例类似:Property Operator Value,其中属性的语法是 object.property 的名称。

以下示例演示使用单个表达式正确构造的成员资格规则:

user.department -eq "Sales"

对于单个表达式,括号是可选的。 成员资格规则正文的总长度不能超过 3072 个字符。

构造成员资格规则的主体

使用用户或设备自动填充组的成员资格规则是一个二进制表达式,会生成 true 或 false 结果。 一个简单的规则包含三个部分:

  • 属性
  • 运算符

表达式中各部分的顺序对于避免语法错误至关重要。

支持的属性

有三种类型的属性可用于构建成员资格规则。

  • 布尔
  • DateTime
  • 字符串
  • 字符串集合

以下是可用于创建单个表达式的用户属性。

布尔值类型的属性

属性 允许的值 使用情况
accountEnabled true false user.accountEnabled -eq true
dirSyncEnabled true false user.dirSyncEnabled -eq true

dateTime 类型的属性

属性 允许的值 使用情况
employeeHireDate(预览版) 任何 DateTimeOffset 值或关键字 system.now user.employeeHireDate -eq "value"

字符串类型的属性

属性 允许的值 使用情况
city 任意字符串值或 null user.city -eq "value"
country 任意字符串值或 null user.country -eq "value"
companyName 任意字符串值或 null user.companyName -eq "value"
department 任意字符串值或 null user.department -eq "value"
displayName 任意字符串值 user.displayName -eq "value"
employeeId 任意字符串值 user.employeeId -eq "value"
user.employeeId -ne null
facsimileTelephoneNumber 任意字符串值或 null user.facsimileTelephoneNumber -eq "value"
givenName 任意字符串值或 null user.givenName -eq "value"
jobTitle 任意字符串值或 null user.jobTitle -eq "value"
mail 任意字符串值或 null(用户的 SMTP 地址) user.mail -eq "value"
mailNickName 任意字符串值(用户的邮件别名) user.mailNickName -eq "value"
memberOf 任何字符串值(有效的组对象 ID) user.memberof -any (group.objectId -in ['value'])
mobile 任意字符串值或 null user.mobile -eq "value"
objectId 用户对象的 GUID。 user.objectId -eq "11111111-1111-1111-1111-111111111111"
onPremisesDistinguishedName 任意字符串值或 null user.onPremisesDistinguishedName -eq "value"
onPremisesSecurityIdentifier 从本地同步至云端的用户的本地安全标识符 (SID)。 user.onPremisesSecurityIdentifier -eq "S-1-1-11-1111111111-1111111111-1111111111-1111111"
passwordPolicies
DisableStrongPassword
DisablePasswordExpiration
DisablePasswordExpiration, DisableStrongPassword
user.passwordPolicies -eq "DisableStrongPassword"
physicalDeliveryOfficeName 任意字符串值或 null user.physicalDeliveryOfficeName -eq "value"
postalCode 任意字符串值或 null user.postalCode -eq "value"
preferredLanguage ISO 639-1 代码 user.preferredLanguage -eq "en-US"
sipProxyAddress 任意字符串值或 null user.sipProxyAddress -eq "value"
state 任意字符串值或 null user.state -eq "value"
streetAddress 任意字符串值或 null user.streetAddress -eq "value"
surname 任意字符串值或 null user.surname -eq "value"
telephoneNumber 任意字符串值或 null user.telephoneNumber -eq "value"
usageLocation 双字母国家/地区或区域代码 user.usageLocation -eq "US"
userPrincipalName 任意字符串值 user.userPrincipalName -eq "alias@domain"
userType member guest null user.userType -eq "Member"

字符串集合类型的属性

属性 允许的值 示例
otherMails 任意字符串值 user.otherMails -startsWith "alias@domain"
proxyAddresses SMTP: alias@domain smtp: alias@domain user.proxyAddresses -startsWith "SMTP: alias@domain"

有关用于设备规则的属性,请参阅设备规则

支持的表达式运算符

下表列出了单个表达式支持的所有运算符及其语法。 运算符可以带或不带连字符 (-) 前缀。 Contains 运算符进行部分字符串匹配,但集合中的项不匹配。

运算符 语法
不等于 -ne
等于 -eq
开头不为 -notStartsWith
开头为 -startsWith
不包含 -notContains
包含 -contains
不匹配 -notMatch
匹配 -match
In -in
不位于 -notIn

使用 -in 和 -notIn 运算符

若要将用户属性的值与多个值进行比较,可使用 -in 或 -notIn 运算符。 使用括号符号“[”和“]”开始和结束值列表。

在以下示例中,如果 user.department 的值等于列表中的任何值,则表达式的计算结果为 true:

   user.department -in ["50001","50002","50003","50005","50006","50007","50008","50016","50020","50024","50038","50039","51100"]

使用 -le 和 -ge 运算符

在动态组规则中使用 employeeHireDate 属性时,可以使用小于 (-le) 或大于 (-ge) 运算符。
示例:

user.employeehiredate -ge system.now -plus p1d 

user.employeehiredate -le 2020-06-10T18:13:20Z 

使用 -match 运算符

-match 运算符用于匹配任何正则表达式。 示例:

user.displayName -match "^Da.*"   

DaDavDavid 的计算结果为 true,aDa 的计算结果为 false。

user.displayName -match ".*vid"

David 的计算结果为 true,Da 的计算结果为 false。

支持的值

表达式中使用的值可包含多种类型,包括:

  • 字符串
  • 布尔值 - true、false
  • 数字
  • 数组 - 数字数组、字符串数组

在表达式中指定值时,使用正确的语法来避免错误至关重要。 部分语法提示包括:

  • 除非值是字符串,否则双引号是可选的。
  • 字符串和正则表达式运算不区分大小写。
  • 当字符串值包含双引号时,两个引号都应使用 ` 字符进行转义,例如,user.department -eq `"Sales`" 是值为“Sales”时的正确语法。 单引号应使用两个单引号(而不是每次一个单引号)进行转义。
  • 还可执行 Null 检查,使用 null 作为值,例如 user.department -eq null

Null 值的用法

要在规则中指定 null 值,可以使用 null 值。

  • 比较表达式中的 null 值时,请使用 -eq 或 -ne。
  • 仅当希望将其解释为文本字符串值时,才在 null 两边加引号。
  • 不能将 -not 运算符用作 null 的比较运算符。 如果使用该运算符,将会出现错误,不管使用 null 还是 $null。

引用 null 值的正确方法如下:

   user.mail –ne null

具有多个表达式的规则

组成员资格规则可包含由 -and、-or 和 -not 逻辑运算符连接的多个单一表达式。 此外,还可结合使用逻辑运算符。

具有多个表达式且构造正确的成员资格规则的示例如下:

(user.department -eq "Sales") -or (user.department -eq "Marketing")
(user.department -eq "Sales") -and -not (user.jobTitle -startsWith "SDE")

运算符优先顺序

以下按从高到最的优先级顺序列出了所有运算符。 同一行上的运算符都采用相同的优先级:

-eq -ne -startsWith -notStartsWith -contains -notContains -match –notMatch -in -notIn
-not
-and
-or
-any -all

以下示例演示运算符优先级,其中为用户计算了两个表达式:

   user.department –eq "Marketing" –and user.country –eq "US"

仅当优先级不满足你的要求时,才需要括号。 例如,如果希望首先评估部门,请参看下面的内容,了解如何使用括号来确定顺序:

   user.country –eq "US" –and (user.department –eq "Marketing" –or user.department –eq "Sales")

具有复杂表达式的规则

成员资格规则可能包含复杂表达式,其中属性、运算符和值采用更复杂的形式。 只要满足以下任何条件,表达式就会被认为是复杂的:

  • 属性由一组值组成;具体而言为多值属性
  • 表达式使用 -any 和 -all 运算符
  • 表达式的值可为一个或多个表达式

多值属性

多值属性是同一类型的对象的集合。 它们可用于使用 -any 和 -all 逻辑运算符创建成员资格规则。

属性 使用情况
assignedPlans 集合中的每个对象均公开以下字符串属性:capabilityStatus、service、servicePlanId user.assignedPlans -any (assignedPlan.servicePlanId -eq "efb87545-963c-4e0d-99df-69c6916d9eb0" -and assignedPlan.capabilityStatus -eq "Enabled")
proxyAddresses SMTP: alias@domain smtp: alias@domain (user.proxyAddresses -any (_ -startsWith "contoso"))

使用 -any 和 -all 运算符

可以使用 -any 和 -all 运算符将条件分别应用到集合中的一项或所有项。

  • -any(当集合中至少有一项符合条件时满足条件)
  • -all(当集合中的所有项都符合条件时满足条件)

示例 1

assignedPlans 是多值属性,该项列出了分配给用户的所有服务计划。 以下表达式选择具有 Exchange Online(计划 2)服务计划(作为 GUID 值)且其处于“启用”状态的用户:

user.assignedPlans -any (assignedPlan.servicePlanId -eq "efb87545-963c-4e0d-99df-69c6916d9eb0" -and assignedPlan.capabilityStatus -eq "Enabled")

可使用此类规则对启用了 Microsoft 365 或其他 Microsoft 联机服务功能的所有用户进行分组。 然后,可将一组策略应用于该组。

示例 2

以下表达式选择加入任何与 Intune 服务(由服务名称“SCO”标识)关联的服务计划的所有用户:

user.assignedPlans -any (assignedPlan.service -eq "SCO" -and assignedPlan.capabilityStatus -eq "Enabled")

示例 3

以下表达式选择没有分配服务计划的所有用户:

user.assignedPlans -all (assignedPlan.servicePlanId -ne null)

使用下划线 (_) 语法

下划线 (_) 语法匹配特定值在其中一个多值字符串集合属性中的出现,以便将用户或设备添加到动态组。 它与 -any 或 -all 运算符一起使用。

下面是在规则中使用下划线 (_) 基于 user.proxyAddress 添加成员的示例(对于 user.otherMails,它的工作方式相同)。 此规则将任何使用以“contoso”开头的代理地址的用户添加到该组。

(user.proxyAddresses -any (_ -startsWith "contoso"))

其他属性和通用规则

创建“直接下属”规则

可以创建包含经理的所有直接下属的组。 当经理的直接下属将来发生更改时,组的成员资格将自动进行调整。

直接下属规则使用以下语法进行构造:

Direct Reports for "{objectID_of_manager}"

以下是有效规则的示例,其中“62e19b97-8b3d-4d4a-a106-4ce66896a863”是管理员的 objectID:

Direct Reports for "62e19b97-8b3d-4d4a-a106-4ce66896a863"

以下提示可帮助你正确使用该规则。

  • “经理 ID”是经理的对象 ID。 可在经理的“配置文件”中找到它。
  • 要使规则起作用,请确保组织中用户的 Manager 属性已正确设置。 可检查用户的“配置文件”中的当前值。
  • 此规则仅支持经理的直接下属。 换言之,无法创建包含经理的直接下属及其下属的组。
  • 此规则不能与任何其他成员资格规则结合使用。

创建“所有用户”规则

可使用成员身份规则创建包含组织中所有用户的组。 以后向组织添加用户或从中删除用户时,将自动调整该组的成员身份。

“所有用户”规则是使用 -ne 运算符和 null 值的单一表达式构造的。 此规则将 B2B 来宾用户和成员用户添加到该组。

user.objectId -ne null

如果你希望组排除来宾用户并且只包含组织的成员,则可以使用以下语法:

(user.objectId -ne null) -and (user.userType -eq "Member")

创建“所有设备”规则

可使用成员身份规则创建包含组织中所有设备的组。 以后向组织添加设备或从中删除设备时,将自动调整该组的成员身份。

“所有设备”规则是使用 -ne 运算符和 null 值的单一表达式构造的:

device.objectId -ne null

扩展属性和自定义扩展属性

支持扩展属性和自定义扩展属性作为动态成员身份规则中的字符串属性。 扩展属性可以从本地的 windows Server Active Directory 同步或使用 Microsoft Graph 更新,并采用“ExtensionAttributeX”的格式,其中 X 等于1 - 15。 动态成员身份规则不支持多值扩展属性。 以下是使用扩展属性作为属性的规则示例:

(user.extensionAttribute15 -eq "Marketing")

自定义扩展属性可以从本地 Windows Server Active Directory 或连接的 SaaS 应用程序同步,也可使用 Microsoft Graph 创建,格式为 user.extension_[GUID]_[Attribute],其中:

  • [GUID] 是在 Microsoft Entra ID 中创建属性的应用程序的唯一标识符的精简版本。 它仅包含字符 0-9 和 A-Z
  • [Attribute] 是属性创建时的名称

下面是使用自定义扩展属性的规则示例:

user.extension_c272a57b722d4eb29bfe327874ae79cb_OfficeNumber -eq "123"

自定义扩展属性也称为目录或 Microsoft Entra 扩展属性。

通过使用 Graph Explorer 查询用户属性并搜索属性名,可在目录中找到自定义属性名称。 此外,现在可以在动态用户组规则生成器中选择“获取自定义扩展属性”链接,以输入唯一的应用程序 ID,并接收创建动态成员身份规则时要使用的自定义扩展属性的完整列表。 还可以刷新此列表,以获取该应用的任何新自定义扩展属性。 扩展属性和自定义扩展属性必须来自租户中的应用程序。

有关详细信息,请参阅 Microsoft Entra Connect 同步:目录扩展一文中的使用动态组中的属性

设备规则

还可以创建一个规则来为组中的成员身份选择设备对象。 无法将用户和设备都作为组成员。

注意

不再列出 organizationalUnit 属性,不应使用该属性。 此字符串由 Intune 在特定情况下设置,但 Microsoft Entra ID 无法识别,因此不会根据此属性向组添加任何设备。

注意

systemlabels 是无法使用 Intune 设置的只读属性。

对于 Windows 10,deviceOSVersion 属性的正确格式如下所示:(device.deviceOSVersion -startsWith "10.0.1")。 可以通过 Get-MgDevice PowerShell cmdlet 验证格式设置:

Get-MgDevice -Search "displayName:YourMachineNameHere" -ConsistencyLevel eventual | Select-Object -ExpandProperty 'OperatingSystemVersion'

可以使用以下设备属性。

设备属性 示例
accountEnabled true false device.accountEnabled -eq true
deviceCategory 有效的设备类别名称 device.deviceCategory -eq "BYOD"
deviceId 有效的 Microsoft Entra 设备 ID device.deviceId -eq "d4fe7726-5966-431c-b3b8-cddc8fdb717d"
deviceManagementAppId Microsoft Entra ID 中的有效 MDM 应用程序 ID Microsoft Intune 托管的 device.deviceManagementAppId -eq "0000000a-0000-0000-c000-000000000000" 或 System Center Configuration Manager 共同托管设备的 "54b943f8-d761-4f8d-951e-9cea1846db5a"
deviceManufacturer 任意字符串值 device.deviceManufacturer -eq "Samsung"
deviceModel 任意字符串值 device.deviceModel -eq "iPad Air"
displayName 任意字符串值 device.displayName -eq "Rob iPhone"
deviceOSType 任意字符串值 (device.deviceOSType -eq "iPad") -or (device.deviceOSType -eq "iPhone")
device.deviceOSType -startsWith "AndroidEnterprise"
device.deviceOSType -eq "AndroidForWork"
device.deviceOSType -eq "Windows"
deviceOSVersion 任意字符串值 device.deviceOSVersion -eq "9.1"
device.deviceOSVersion -startsWith "10.0.1"
deviceOwnership 个人、公司、未知 device.deviceOwnership -eq "Company"
devicePhysicalIds Autopilot 使用的任何字符串值,如所有 Autopilot 设备、OrderID 或 PurchaseOrderID device.devicePhysicalIDs -any _ -startsWith "[ZTDId]"
(device.devicePhysicalIds -any _ -eq "[OrderID]:179887111881"
(device.devicePhysicalIds -any _ -eq "[PurchaseOrderId]:76222342342"
deviceTrustType AzureAD、ServerAD、Workplace device.deviceTrustType -eq "AzureAD"
enrollmentProfileName Apple 设备注册配置文件名称、Android Enterprise 公司所有专用设备注册配置文件名称或 Windows Autopilot 配置文件名称 device.enrollmentProfileName -eq "DEP iPhones"
extensionAttribute1 任意字符串值 device.extensionAttribute1 -eq "some string value"
extensionAttribute2 任意字符串值 device.extensionAttribute2 -eq "some string value"
extensionAttribute3 任意字符串值 device.extensionAttribute3 -eq "some string value"
extensionAttribute4 任意字符串值 device.extensionAttribute4 -eq "some string value"
extensionAttribute5 任意字符串值 device.extensionAttribute5 -eq "some string value"
extensionAttribute6 任意字符串值 device.extensionAttribute6 -eq "some string value"
extensionAttribute7 任意字符串值 device.extensionAttribute7 -eq "some string value"
extensionAttribute8 任意字符串值 device.extensionAttribute8 -eq "some string value"
extensionAttribute9 任意字符串值 device.extensionAttribute9 -eq "some string value"
extensionAttribute10 任意字符串值 device.extensionAttribute10 -eq "some string value"
extensionAttribute11 任意字符串值 device.extensionAttribute11 -eq "some string value"
extensionAttribute12 任意字符串值 device.extensionAttribute12 -eq "some string value"
extensionAttribute13 任意字符串值 device.extensionAttribute13 -eq "some string value"
extensionAttribute14 任意字符串值 device.extensionAttribute14 -eq "some string value"
extensionAttribute15 任意字符串值 device.extensionAttribute15 -eq "some string value"
isRooted true false device.isRooted -eq true
managementType MDM(适用于移动设备) device.managementType -eq "MDM"
memberOf 任何字符串值(有效的组对象 ID) device.memberof -any (group.objectId -in ['value'])
objectId 有效的 Microsoft Entra 对象 ID device.objectId -eq "76ad43c9-32c5-45e8-a272-7b58b58f596d"
profileType Microsoft Entra ID 中的有效配置文件类型 device.profileType -eq "RegisteredDevice"
systemLabels 任何与 Intune 设备属性匹配的字符串,用于标记现代工作区设备 device.systemLabels -startsWith "M365Managed"

注意

在使用 deviceOwnership 创建设备的动态组时,需要将该值设置等于 Company。 而在 Intune 上,设备所有权表示为 Corporate。 有关详细信息,请参阅 OwnerTypes。 在使用 deviceTrustType 创建设备的动态组时,需要将该值设置为等于 AzureAD 来表示 Microsoft Entra 联接设备,将该值设置为等于 ServerAD 来表示 Microsoft Entra 混合联接设备,或设置为等于 Workplace 来表示 Microsoft Entra 注册设备。 在使用 extensionAttribute1-15 创建设备的动态组时,需要在设备上设置 extensionAttribute1-15 的值。 详细了解如何在 Microsoft Entra 设备对象上编写 extensionAttributesextensionAttributes

后续步骤

这些文章提供了有关 Microsoft Entra ID 中的组的其他信息。