Я пытаюсь преобразовать некоторые сценарии EWS для использования oauth. Я обнаружил, что это работает, когда зарегистрированному приложению Azure было дано разрешение приложения full_access_as_app, но не когда оно установлено только на делегированные разрешения EWS.AccessAsUser.All. Похоже, что если задано full_access_as_app, то любой пользователь с appID и секретом может получить доступ к любому почтовому ящику Когда указан EWS.AccessAsUser.All, никто не может получить доступ к любому почтовому ящику. На что я надеялся, так это то, что appID и secret были, по сути, ключами к шлюзу, но тогда доступ к почтовому ящику будет зависеть от того, будет ли конкретный пользователь, выполняющий скрипт, или учетные данные, переданные с ним (чего я не знаю, как делать, если это не вошел в систему пользователя), имеет разрешения на почтовый ящик. Итак, по сути, вы попадаете в ворота, но затем вы используете подражание. Также не похоже, что секрет приложения может храниться в защищенном файле ha sh, как учетные данные, поэтому секрет раскрыт. Спасибо за вашу помощь.
## Request an access token
# Define AppId, secret and scope, your tenant name and endpoint URL
$AppId = 'AppId'
$AppSecret = 'AppSecret'
$Scope = "https://outlook.office365.com/.default"
$TenantName = "domain.onmicrosoft.com"
$Url = "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token"
# Add System.Web for urlencode
Add-Type -AssemblyName System.Web
# Create body
$Body = @{
client_id = $AppId
client_secret = $AppSecret
scope = $Scope
grant_type = 'client_credentials'
}
# Splat the parameters for Invoke-Restmethod for cleaner code
$PostSplat = @{
ContentType = 'application/x-www-form-urlencoded'
Method = 'POST'
# Create string by joining bodylist with '&'
Body = $Body
Uri = $Url
}
# Request the token!
$Request = Invoke-RestMethod @PostSplat
#######################
$Email = "UserA@domain.com"
# Import "Microsoft Exchange Web Services Managed API 2.2"
Import-Module -Name "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
## Create the Exchange Service object with Oauth creds
$Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService -ArgumentList Exchange2013_SP1
$service.Url= new-object Uri("https://outlook.office365.com/EWS/Exchange.asmx")
$Service.TraceEnabled = $true
$service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress,$Email)
$service.HttpHeaders.Add("X-AnchorMailbox", $Email)
$Service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.OAuthCredentials($Request.access_token)
$OAuthCredentials = New-Object Microsoft.Exchange.WebServices.Data.OAuthCredentials($Request.access_token)
$service.Credentials = $OAuthCredentials
#####################
# WellKnown folders to adjust
$folderNames = "Inbox"
Foreach($folderName in $folderNames)
{
# Set the WellKnownFolder
$FolderId = [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::$folderName
# Bind to WellKnownFolder Notes
$folder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($Service, $folderId)
Write-Host "$($Email): $($folderName): " -NoNewline
$folder.archivetag.RetentionId.Guid
} # Foreach($folderName... END
######################