Настройка правил сообщений с помощью API Graph

#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
             }    
}