管理 Microsoft Entra ID 中动态成员资格组的规则
可以创建基于用户或设备属性的规则,以启用 Microsoft Entra ID(Microsoft Entra 的一部分)中动态成员资格组的成员资格。 可以使用基于成员属性的成员资格组规则来自动添加和删除动态成员资格组。 在 Microsoft Entra 中,单个租户最多可以有 15,000 个动态成员资格组。
本文详细介绍了基于用户或设备创建动态成员资格组规则的属性和语法。
注意
安全组可以用于设备或用户,但 Microsoft 365 组只能包含用户。
当用户或设备的属性发生更改时,系统会评估目录中的所有动态成员资格组规则,以查看该更改是否会触发任何组添加或删除。 如果某个用户或设备满足组的规则,则将其作为该组成员添加。 如果不再满足规则,则会将其删除。 不能手动添加或删除动态成员资格组的成员。
- 可以创建用户或设备的动态成员资格组,但无法创建同时包含用户和设备的规则。
- 不能根据设备所有者的用户属性来创建设备成员资格组。 设备成员身份规则只能引用设备属性。
注意
此功能要求每个属于一个或多个动态成员资格组的唯一用户都具有 Microsoft Entra ID P1 许可证或 Intune 教育版。 无需将许可证分配给用户使其成为动态成员资格组成员,但必须在 Microsoft Entra 组织中具有最低数量的许可证以覆盖所有此类用户。 例如,如果组织的所有动态成员资格组总共拥有 1,000 个唯一用户,则需要至少具有 1,000 个 Microsoft Entra ID P1 许可证才能满足许可证要求。 对于基于设备的动态成员资格组的成员设备,不需要许可证。
Azure 门户中的规则生成器
Microsoft Entra ID 提供了一个规则生成器,用于更快地创建和更新重要规则。 规则生成器支持最多包含五个表达式的构造。 通过规则生成器可以更轻松地使用几个简单表达式来组成规则,但是,它无法用于重现每个规则。 如果规则生成器不支持要创建的规则,则可以使用文本框。
以下是需要使用文本框的高级规则或语法的一些示例:
- 具有五个以上表达式的规则
- 直接下属规则
- 使用 -contains 或 -notContains 运算符的规则
- 设置运算符优先级
- 具有复杂表达式的规则;例如
(user.proxyAddresses -any (_ -startsWith "contoso"))
注意
规则生成器可能无法显示在文本框中构造的某些规则。 当规则生成器无法显示规则时,可能会看到一条消息。 规则生成器不会以任何方式更改动态成员资格组所支持的语法、验证或规则处理。
有关分步说明,请参阅创建或更新动态成员资格组。
用于单个表达式的规则语法
单个表达式是成员资格规则的最简单形式,只包括上述的三个部分。 具有单个表达式的规则与此示例类似: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" |
任意字符串值或 null(用户的 SMTP 地址) | user.mail -eq "value" | |
mailNickName | 任意字符串值(用户的邮件别名) | user.mailNickName -eq "value" |
mobile | 任意字符串值或 null | user.mobile -eq "value" |
objectId | 用户对象的 GUID。 | user.objectId -eq "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" |
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.*"
Da
、Dav
、David
的计算结果为 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 "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e" -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 -eq null)
使用下划线 (_) 语法
下划线 (_) 语法匹配多值字符串集合属性之一中的特定值的出现,以将用户或设备添加到动态成员资格组。 它与 -any 或 -all 运算符一起使用。
下面是在规则中使用下划线 (_) 基于 user.proxyAddress 添加成员的示例(对于 user.otherMails,它的工作方式相同)。 此规则将任何使用以“contoso”开头的代理地址的用户添加到该组。
(user.proxyAddresses -any (_ -startsWith "contoso"))
其他属性和通用规则
创建“直接下属”规则
可以创建包含经理的所有直接下属的组。 当经理的直接下属将来发生更改时,组的成员资格将自动进行调整。
直接下属规则使用以下语法进行构造:
Direct Reports for "{objectID_of_manager}"
以下是有效规则的示例,其中“aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb”是管理员的 objectID:
Direct Reports for "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"
以下提示可帮助你正确使用该规则。
- “经理 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 扩展属性。
现在可以在动态成员身份组规则生成器中选择获取自定义扩展属性链接,以输入唯一的应用 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 "iOS") 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" |
objectId | 有效的 Microsoft Entra 对象 ID | device.objectId -eq "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" |
profileType | Microsoft Entra ID 中的有效配置文件类型 | device.profileType -eq "RegisteredDevice" |
systemLabels | 任何与 Intune 设备属性匹配的只读字符串,用于标记现代工作场所设备 | device.systemLabels -startsWith "M365Managed" SystemLabels |
注意
使用 systemLabels
时,无法通过 Intune 编辑各种上下文(例如设备管理和敏感度标签)中使用的只读属性。
在使用 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 中的组的其他信息。