Обновить изображение контакта из PowerShell через Microsoft Graph - PullRequest
0 голосов
/ 02 октября 2019

Я пишу скрипт для создания новых контактов для пользователя в Exchange Online. Используя Microsoft Graph, я могу легко создавать контакты с помощью POST до https://graph.microsoft.com/v1.0/me/contactFolders.... Я также могу запросить фотографию у другого контакта с помощью GET на https://graph.microsoft.com/v1.0/me/contactFolders/$($contactFolder)/contacts/$($contactId)/photo/$value и сохранить результат, затем передать значение фотографии в теле PATCH обратно на этот адрес и обновить фотографию для других контактов.

Что я не могу понять, как это сделать, так это прочитать файл с диска (в моем случае файл jpg), а затем правильно закодировать его, чтобы отправить его в тексте запроса выше для обновления контакта.

Я использую этот документ: https://docs.microsoft.com/en-us/graph/api/profilephoto-update?view=graph-rest-1.0

Я вижу, что ожидаемый тип: "photo": { "@odata.type": "microsoft.graph.profilePhoto" }

Документ говорит:

В теле запроса включитедвоичные данные фотографии в теле запроса.

Я изо всех сил пытаюсь выяснить файл изображения, прочитанный и закодированный для отправки его в качестве параметра -Body в Invoke-RestMethod. Как я уже сказал, я могу сделать это сейчас, если я отправлю существующую фотографию в качестве тела. Я просто что-то упускаю при чтении с диска.

Вот что я пробовал, и это не работает (contactPhotos из моего каталога):

$photoBinary = [convert]::ToBase64String((get-content -Path $contactPhotos[0].FullName -encoding byte))

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Вам не нужно кодировать base64 файла изображения (например, если вы посмотрите на результаты вашего запроса на получение, результат не должен быть закодирован в Base64). Следующее работает для меня хорошо

    $token = ($Context.AcquireTokenAsync("https://graph.microsoft.com", $ClientId , "urn:ietf:wg:oauth:2.0:oob", $PromptBehavior)).Result
    $Header = @{
        'Content-Type'  = 'application\json'
        'Authorization' = $token.CreateAuthorizationHeader()
    }
    $id = "AAMkADczNDE4Y......."
    $RequestURL = "https://graph.microsoft.com/v1.0/me/contacts('" + $id + "')/photo/`$value"
    $photoBinary = [System.IO.File]::ReadAllBytes("c:\temp\dd.jpg")
    $UserResult = (Invoke-RestMethod -Headers $Header -Uri $RequestURL -Method Put -Body $photoBinary -ContentType "image/jpeg").value
1 голос
/ 03 октября 2019

Вы можете попробовать это вместо этого. Нет необходимости в base64 кодировании изображения.

$Headers = @{
    "Authorization" = $Token
    "Content-Type" = "image/jpeg"
}

$ProfilePic = ([Byte[]] $(Get-Content -Path "C:\path-to-pic" -Encoding Byte -ReadCount 0))

Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/me/contactFolders/{contact-folder-id}/contacts/{contact-id}/photo/$value" -Method Put -Headers $Headers -body $ProfilePic
...