可以创建基于用户或基于设备属性的规则,以在 Microsoft Entra ID 中为动态成员身份组启用成员身份。 可以使用基于成员属性的成员身份规则自动添加和删除动态成员身份组。 在 Microsoft Entra 中,单个租户最多可以有 15,000 个动态成员资格组。
本文详细介绍了基于用户或设备创建动态成员资格组规则的属性和语法。
注意
安全组可以包括设备或用户,但Microsoft 365 个组只能包含用户。
动态成员组的考虑因素
当用户或设备的属性发生更改时,系统将评估目录中动态成员身份组的所有规则,以查看更改是否会触发任何组添加或删除。 如果用户或设备满足组上的规则,则会将其添加为该组的成员。 如果不再满足规则,则会将其删除。 不能手动添加或删除动态成员资格组的成员。
还要记住以下限制:
- 可以创建用户或设备的动态成员资格组,但无法创建同时包含用户和设备的规则。
- 不能根据设备所有者的用户属性来创建设备成员资格组。 设备成员身份规则只能引用设备属性。
许可要求
动态成员身份组的功能需要Microsoft Entra ID P1 许可证或 Intune for Education 许可证,该许可证适用于属于一个或多个动态成员组的每个唯一用户。 无需为用户分配许可证,以使他们成为动态成员组的成员。 但是,必须在 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"
对于单个表达式,括号是可选的。 成员身份规则正文的总长度不能超过 3,072 个字符。
构造成员资格规则的主体
使用用户或设备自动填充组的成员资格规则是一个二进制表达式,会生成 true 或 false 结果。 一个简单的规则包含三个部分:
- 属性
- 运算符
- 值
表达式中各部分的顺序对于避免语法错误至关重要。
支持的属性
可以使用三种类型的属性来构造成员身份规则:
- 布尔
- 日期/时间
- 字符串
- 字符串集合
可以使用以下用户属性创建单个表达式。
布尔类型的属性
属性 | 允许的值 | 使用情况 |
---|---|---|
accountEnabled |
true ,false |
user.accountEnabled -eq true |
dirSyncEnabled |
true ,false |
user.dirSyncEnabled -eq true |
日期/时间类型的属性
属性 | 允许的值 | 使用情况 |
---|---|---|
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" user.mail -notEndsWith "@Contoso.com" |
mailNickName |
任意字符串值(用户的邮件别名) | user.mailNickName -eq "value" user.mailNickname -endsWith "-vendor" |
memberOf |
任何字符串值(有效的组对象 ID) | user.memberOf -any (group.objectId -in ['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 |
None 、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" user.otherMails -endsWith"@contoso.com" |
proxyAddresses |
SMTP: alias@___domain ,smtp: alias@___domain |
user.proxyAddresses -startsWith "SMTP: alias@___domain" user.proxyAddresses -notEndsWith "@outlook.com" |
有关用于设备规则的属性,请参阅设备规则。
支持的表达式运算符
下表列出了单个表达式支持的所有运算符及其语法。 可以使用带有连字符前缀的运算符,也可以使用不带连字符前缀的运算符(-
)。 运算符 Contains
执行部分字符串匹配,但与集合中的项不匹配。
警告
为了获得最佳效果,请尽量减少使用Match
或Contains
。 本文 为动态成员身份组创建更简单、更高效的规则 提供了有关如何创建规则的指导,这些规则会导致更好的动态组处理时间。
memberOf
作员处于预览状态,存在一些限制,因此请谨慎使用。
运算符 | 语法 |
---|---|
Ends With |
-endsWith |
Not Ends With |
-notEndsWith |
Not Equals |
-ne |
Equals |
-eq |
Not Starts With |
-notStartsWith |
Starts With |
-startsWith |
Not Contains |
-notContains |
Contains |
-contains |
Not Match |
-notMatch |
Match |
-match |
In |
-in |
Not 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
运算符来匹配任何正则表达式。
对于以下示例,Da
、Dav
和 David
的结果是 true
。
aDa
求值为 false
。
user.displayName -match "^Da.*"
对于以下示例, David
计算结果为 true
.
Da
求值为 false
。
user.displayName -match ".*vid"
支持的值
表达式中使用的值可以包含多种类型:
- 字符串
- 布尔值 (
true
,false
) - 数字
- 数组(数字数组、字符串数组)
在表达式中指定值时,请务必使用正确的语法来避免错误。 下面是一些语法提示:
- 双引号是可选的,除非该值是字符串。
- 正则表达式和字符串操作不区分大小写。
- 确保属性名称的格式正确如上所示,因为它们区分大小写。
- 字符串值包含双引号时,应使用反斜杠 (
\
) 字符转义这两个引号。 例如,user.department -eq“Sales” 是在Sales
为值时的正确语法。 每次需要转义单引号时,请使用两个单引号而不是一个。 - 还可以使用
null
作为值执行 null 检查;例如user.department -eq null
。
使用空值
若要在规则中指定 null
值,请执行以下作:
- 使用
-eq
或-ne
比较null
表达式中的值时。 - 仅当希望将单词解释为文本字符串值时,才在单词
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")
具有复杂表达式的规则
成员资格规则可能包含复杂表达式,其中属性、运算符和值采用更复杂的形式。 当以下任一点为 true 时,表达式被视为复杂:
- 该属性由值集合组成;具体而言,多值属性。
- 表达式使用
-any
和-all
运算符。 - 表达式的值本身可以是一个或多个表达式。
多值属性
多值属性是同一类型的对象的集合。 可以使用它们通过逻辑-all
运算符创建成员身份规则-any
。
属性 | 值 | 使用情况 |
---|---|---|
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
:当集合中的所有项均符合条件时感到满意。
示例 1
assignedPlans
是一个多值属性,列出分配给用户的所有服务计划。 以下表达式选择具有 Exchange Online(计划 2)服务计划作为 GUID 值且也处于 Enabled
状态的用户:
user.assignedPlans -any (assignedPlan.servicePlanId -eq "efb87545-963c-4e0d-99df-69c6916d9eb0" -and assignedPlan.capabilityStatus -eq "Enabled")
可以使用这样的规则对启用了 Microsoft 365 或其他 Microsoft Online Services 功能的所有用户进行分组。 然后,可以使用一组策略将规则应用于该组。
示例 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
管理器的对象 ID 如下:
Direct Reports for "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"
以下提示可帮助你正确使用规则:
- 管理器 ID 是管理器的对象 ID。 可以在经理的个人资料中找到它。
- 若要使规则正常工作,请确保
Manager
为组织中的用户正确设置该属性。 可以在用户配置文件中检查当前值。 - 此规则仅支持经理的直接下属。 无法创建具有经理直接下属 及其 报表的组。
- 不能将此规则与其他任何成员身份规则合并。
为所有用户创建规则
可以使用成员身份规则创建包含组织内所有用户的组。 以后向组织添加用户或从中删除用户时,将自动调整该组的成员身份。
使用包含 -ne
运算符和 null
值的单个表达式为所有用户构造规则。 此规则将企业间的来宾用户和成员用户添加到组。
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 更新扩展属性。
扩展属性采用格式ExtensionAttribute<X>
,其中<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 资源管理器中查询用户的属性并搜索属性名称,可以在目录中找到自定义属性名称。 此外,现在可以在动态规则生成器中选择 “获取自定义扩展属性 ”链接,以输入唯一的应用 ID,并在为动态成员身份组创建规则时接收要使用的自定义扩展属性的完整列表。 可以刷新此列表以获取该应用的任何新的自定义扩展属性。 扩展属性和自定义扩展属性必须来自租户中的应用程序。
有关详细信息,请参阅 使用动态成员身份组中的属性。
设备规则
可以创建一个规则,用于选择设备对象以加入某个组。 无法将用户和设备都作为组成员。
注意
该 organizationalUnit
属性不再列出,不应使用它。 Intune 在特定情况下设置此字符串,但Microsoft Entra ID 无法识别它。 不会基于此属性将设备添加到组。
该 systemlabels
属性是只读的。 不能使用 Intune 设置它。
对于 Windows 10,属性的正确格式 deviceOSVersion
为 device.deviceOSVersion -startsWith "10.0.1"
。 可以使用 PowerShell cmdlet Get-MgDevice
验证格式:
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 中移动设备管理的有效应用程序 ID |
device.deviceManagementAppId -eq "0000000a-0000-0000-c000-000000000000" for Microsoft Intune 托管设备"54b943f8-d761-4f8d-951e-9cea1846db5a" 适用于 System Center 配置管理器共同管理的设备 |
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
1 |
Personal 、Company 、Unknown |
device.deviceOwnership -eq "Company" |
devicePhysicalIds |
Windows Autopilot 使用的任何字符串值,例如所有 Windows Autopilot 设备、OrderID 或 PurchaseOrderID |
device.devicePhysicalIDs -any _ -startsWith "[ZTDId]" device.devicePhysicalIds -any _ -eq "[OrderID]:179887111881" device.devicePhysicalIds -any _ -eq "[PurchaseOrderId]:76222342342" |
deviceTrustType
2 |
AzureAD 、ServerAD 、Workplace |
device.deviceTrustType -eq "AzureAD" |
enrollmentProfileName |
Apple 自动设备注册、Android Enterprise 公司专用设备注册或 Windows Autopilot 的配置文件名称 | device.enrollmentProfileName -eq "DEP iPhones" |
extensionAttribute1
3 |
任意字符串值 | 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 |
移动设备管理(适用于移动设备) | device.managementType -eq "MDM" |
memberOf |
任何字符串值(有效的组对象 ID) | device.memberOf -any (group.objectId -in ['value']) |
objectId |
有效的 Microsoft Entra 对象 ID | device.objectId -eq "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" |
profileType |
Microsoft Entra ID 中的有效身份类型 | device.profileType -eq "RegisteredDevice" |
systemLabels
4 |
与用于标记 Modern Workplace 设备的 Intune 设备属性匹配的只读字符串 | device.systemLabels -startsWith "M365Managed" SystemLabels |
1 用于 deviceOwnership
为设备创建动态成员身份组时,需要将值设置为等于 Company
。 在 Intune 上,设备所有权改为表示为 Corporate
。 有关详细信息,请参阅 ownerTypes
。
2 用于为设备创建动态成员身份组时 deviceTrustType
,需要将值设置为等于 AzureAD
表示已加入 Microsoft Entra 的设备、 ServerAD
表示 Microsoft Entra 混合联接设备或 Workplace
表示 Microsoft Entra 已注册的设备。
3 使用extensionAttribute1-15
为设备创建动态成员组时,需要在设备上设置extensionAttribute1-15
的值。
详细了解如何在 Microsoft Entra 设备对象上编写extensionAttributes
。
4 使用 systemLabels
时,在各种上下文(如设备管理和敏感度标记)中使用的只读属性不可通过 Intune 进行编辑。