如何让Connect-MgGraph与Connect-ExchangeOnline共用同一组凭据
嘿,这个问题我刚好研究过,给你几个可行的方案,帮你实现只输一次凭据就能同时搞定Microsoft Graph和Exchange Online的操作:
方案一:复用Connect-MgGraph的访问令牌(依赖Exchange Online预览版模块)
从Exchange Online PowerShell模块3.1.0-Preview1开始,Connect-ExchangeOnline新增了-AccessToken参数,刚好可以解决你的问题,步骤如下:
升级到预览版模块
先确保你安装了支持-AccessToken的版本:Install-Module -Name ExchangeOnlineManagement -RequiredVersion 3.1.0-Preview1 -AllowPrerelease -Force带Exchange相关权限登录Microsoft Graph
登录时要指定包含Exchange Online权限的scope,这样获取的令牌才能被Exchange Online认可。比如你需要管理Exchange权限的话,可以加https://outlook.office365.com/Exchange.Manage(委托权限)或者https://outlook.office365.com/.default(应用权限,如果你用的是服务主体登录):# 这里会弹出一次登录框,输入凭据后即可 Connect-MgGraph -Scopes "User.Read", "Application.ReadWrite.All", "https://outlook.office365.com/Exchange.Manage"提取Graph会话的访问令牌
从当前Graph上下文里取出令牌:$exchangeToken = (Get-MgContext).AccessToken用令牌连接Exchange Online
直接用刚才的令牌登录,不会再弹出凭据框:Connect-ExchangeOnline -AccessToken $exchangeToken -Organization "your-tenant-domain.onmicrosoft.com"(
-Organization参数如果留空,令牌里的租户信息会自动生效,也可以不用加)
方案二:全程用Microsoft Graph API替代Exchange Online命令
如果不想依赖预览版模块,更彻底的办法是把Exchange相关的操作都改用Graph API来完成,这样全程只需要Connect-MgGraph一次登录:
比如你要给服务主体分配Exchange的应用权限,可以用New-MgServicePrincipalAppRoleAssignment命令:
先找到Exchange Online的服务主体ID
Exchange Online的内置服务主体AppId是固定的00000002-0000-0ff1-ce00-000000000000,先获取它的对象ID:$exchangeServicePrincipal = Get-MgServicePrincipal -Filter "AppId eq '00000002-0000-0ff1-ce00-000000000000'"找到你要分配的Exchange权限角色ID
比如Exchange.ManageAsApp这个应用权限,从Exchange服务主体的AppRoles里提取:$exchangeRole = $exchangeServicePrincipal.AppRoles | Where-Object { $_.Value -eq "Exchange.ManageAsApp" }给目标服务主体分配权限
假设你已经创建了服务主体$targetSp,执行分配:New-MgServicePrincipalAppRoleAssignment ` -ServicePrincipalId $targetSp.Id ` -PrincipalId $targetSp.Id ` -ResourceId $exchangeServicePrincipal.Id ` -AppRoleId $exchangeRole.Id
这样全程只用Graph命令,完全不需要调用Connect-ExchangeOnline,自然也就不会有多次登录的问题了。
注意事项
- 方案一中,一定要确保
Connect-MgGraph的scope包含了Exchange Online所需的权限,否则令牌会无法通过Exchange的验证。 - 方案二中,你需要确保登录Graph的账号拥有足够的权限(比如
Application Administrator或Exchange Administrator)来给服务主体分配Exchange权限。
备注:内容来源于stack exchange,提问作者Kevin Martin

