编写PowerShell脚本部署阻止旧版认证的Conditional Access策略遇阻
问题分析与修复方案
核心错误点
- 错误覆盖
$conditions.Users对象
你先正确创建了ConditionalAccessUserCondition类型的$conditions.Users,但后续执行的$conditions.Users = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessClientApp,把原本存储用户条件的属性错误替换成了客户端应用类型对象,直接破坏了条件集的结构,这是脚本失败的关键原因。 ClientAppTypes赋值存在冗余与格式问题ClientAppTypes本身是字符串数组,无需提前创建ConditionalAccessClientApp对象,直接赋值数组即可。- 代码中使用了中文引号
“”,PowerShell仅识别英文半角引号"",这会引发语法解析错误。
修复后的完整代码
# 创建条件集对象 $conditions = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessConditionSet # 配置应用条件 $conditions.Applications = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessApplicationCondition $conditions.Applications.IncludeApplications = "All" $conditions.Applications.ExcludeApplications = @( "" ""# 填写需要排除的应用ID ) # 配置用户条件(保留正确对象类型,禁止覆盖) $conditions.Users = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessUserCondition $conditions.Users.IncludeUsers = "All" $conditions.Users.ExcludeUsers = @( "" # 管理员用户ID "GuestsOrExternalUsers" ) $conditions.Users.ExcludeGroups = "" # 管理员组ID $conditions.Users.ExcludeRoles = @( # "" # "" ) # 配置客户端应用类型(直接赋值英文引号数组) $conditions.ClientAppTypes = @("ExchangeActiveSync", "Other") # 配置授权控制 $controls = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessGrantControls $controls._Operator = "OR" $controls.BuiltInControls = "block" # 创建条件访问策略 New-AzureADMSConditionalAccessPolicy -DisplayName "Block Legacy Authentication" -State "Disabled" -Conditions $conditions -GrantControls $controls
额外注意事项
- 确保所有引号均为英文半角格式,避免语法错误。
- 补充代码中留空的管理员ID、排除应用ID等实际值,否则策略无法匹配你的实际需求。
- 执行脚本前需确认已通过
Connect-AzureAD或Connect-MgGraph正确连接到Azure AD(根据使用的模块版本选择对应命令)。
内容的提问来源于stack exchange,提问作者Achref Buster
相关产品推荐
相关产品推荐

