这是对@stukey 提供的信息的扩展,它已经很好了。您可以使用MSAL.PS library,而不是创建自己的函数来检索访问令牌。这个模块可以简单地从PowerShell Gallery安装:
Install-Module -Name MSAL.PS
配置 Azure 应用
在 Azure 中配置“应用注册”时,可以使用以下设置。这将允许您使用 Integrated Windows Authentication 并避免在代码中存储密码(在以特定用户身份运行 Windows 计划任务以运行脚本时很有用):
- 身份验证 > 高级设置 > 将应用程序视为公共客户端:是
在“API 权限”部分添加范围“EWS.AccessAsUser.All”(可以在最后一个选项“支持的旧 API 的:Exchange”中找到):
请求令牌
配置完所有这些后,您可以在使用正确的 Windows 帐户登录时请求新令牌,该帐户在所需邮箱上具有 Full control 交换权限:
$msalParams = @{
ClientId = $azureClientId
TenantId = $azureTenantId
Scopes = "https://outlook.office.com/EWS.AccessAsUser.All"
IntegratedWindowsAuth = $true
}
Get-MsalToken @msalParams
可能需要添加开关-Interactive,以便您同意建议的范围。只需执行一次。
现在获得了有效的令牌,只需使用-Silent 开关即可刷新令牌。这将从缓存中获取一个有效的令牌,或者在它不再有效时请求一个新的令牌:
$msalParams = @{
ClientId = $azureClientId
TenantId = $azureTenantId
Scopes = "https://outlook.office.com/EWS.AccessAsUser.All"
Silent = $true
}
Get-MsalToken @msalParams
如果上述两个步骤可以合并为一个调用,那就太好了。为此我开了一个issue。
将令牌用于 Exchange Web 服务
$EWS = 'C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll'
Import-Module -Name $EWS -EA Stop
$Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService -ArgumentList 'Exchange2013_SP1'
$Service.Url = 'https://outlook.office365.com/EWS/Exchange.asmx'
$Service.UseDefaultCredentials = $false
$msalParams = @{
ClientId = $azureClientId
TenantId = $azureTenantId
Scopes = "https://outlook.office.com/EWS.AccessAsUser.All"
}
$token = Get-MsalToken @msalParams
$Service.Credentials = [Microsoft.Exchange.WebServices.Data.OAuthCredentials]$token.AccessToken
希望这将帮助其他人遇到与我们相同的问题。