#powershell #microsoft-graph-api
Вопрос:
Я работал над сценарием powershell для использования API Graph для установки правил почтовых ящиков. В основном я следовал этому руководству, я могу заставить создание папок работать в соответствии с руководством, но когда я пытаюсь отредактировать сценарий и заменить текст этой информацией, чтобы создать правило сообщений, это не удается. Я изо всех сил пытаюсь понять, почему. У кого-нибудь есть какие-нибудь идеи, где я могу ошибаться?
## Details for mailboxes and folders needed. Obviously you can get these as parameters if need be.
For AdHoc code I use "Get-Clipboard" quite often. Here a fixed array as something to start with.
$Mailboxes = @("mailbox")
## Before next step aquire access token, if you need help this blog has a great example https://adamtheautomator.com/microsoft-graph-api-powershell/. For simplicity, I have used here an application secret.
# Define AppId, secret and scope, your tenant name and endpoint URL
$AppId = "ID"
$AppSecret = "Secret"
$Scope = "https://graph.microsoft.com/.default"
$TenantName = "name"
$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 'amp;'
Body = $Body
Uri = $Url
}
# Request the token!
$Request = Invoke-RestMethod @PostSplat
# Create header
$Header = @{
Authorization = "$($Request.token_type) $($Request.access_token)"
}
## Thanks, now we have token ready for use. Lets use GRAPH's mailFolders API
## Loop through mailbxoes
foreach($mailbox in $Mailboxes) {
$Uri = "https://graph.microsoft.com/v1.0/users/$mailbox/mailFolders/inbox/messageRules"
$Body = @"
{
"displayName": "Test",
"sequence": 2,
"isEnabled": true,
"conditions": {
"importance": [
"low"
]
},
"actions": {
"copyToFolder": [
"Low Priority"
],
"stopProcessingRules": true
}
}
"@
$NewRule = Invoke-RestMethod -Uri $Uri -Headers $Header -Method Post -Body $Body -ContentType "application/json"
}
Комментарии:
1. Какое сообщение об ошибке вы получаете?
2. Ошибка, которую я получаю: Invoke-RestMethod : Удаленный сервер вернул ошибку: (400) Неверный запрос. В C:Ry ФайлыPowershellmailrule.ps1:67 символ:15 … $NewRule = Вызов-RestMethod -Uri $Uri -Заголовки $Сообщение метода заголовка … ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo : Недействительная операция: (System.Net.HttpWebRequest:HttpWebRequest) [Вызов-метод восстановления], исключение WebException полностью квалифицированный идентификатор ошибки : исключение WebCmdletWebResponseException,Microsoft. PowerShell. Команды. Команда Invokerestmethod
Ответ №1:
Синтаксис вашего сообщения неверен, ни значение, ни папка копирования не должны быть массивами, также папка должна быть идентификатором папки, а не именем. Таким образом, успешный пост должен выглядеть так
{
"displayName": "Test",
"sequence": 2,
"isEnabled": true,
"conditions": {
"importance": "low"
},
"actions": {
"copyToFolder": "AAMkADczNDE4YWEwLTdlZmItNDIzZC04MDViLTYyYjI2YmRh....",
"stopProcessingRules": true
}
}