通过 Microsoft Graph 从 PowerShell 更新联系人图像

Update Contact Image from PowerShell through Microsoft Graph

我正在编写一个脚本来为 Exchange Online 中的用户创建新的联系人。使用 Microsoft Graph,我可以使用 POSThttps://graph.microsoft.com/v1.0/me/contactFolders... 轻松创建联系人。我还可以使用 https://graph.microsoft.com/v1.0/me/contactFolders/$($contactFolder)/contacts/$($contactId)/photo/$value 上的 GET 从另一个联系人请求照片并存储结果,然后将 PATCH 正文中的照片值传回该地址并更新其他联系人的照片联系人。

我不知道该怎么做是从磁盘读取一个文件(在我的例子中是一个 jpg 文件),然后对其进行正确编码以将其发送到上面的请求正文中以更新联系人。

我正在使用这个文档:https://docs.microsoft.com/en-us/graph/api/profilephoto-update?view=graph-rest-1.0

我看到预期的类型是 "photo": { "@odata.type": "microsoft.graph.profilePhoto" }

文档说:

In the request body, include the binary data of the photo in the request body.

我正在努力找出读取的图像文件并进行编码,以便将其作为 -Body 参数发送给 Invoke-RestMethod。就像我说的,如果我发送一张现有的照片作为正文,我现在就可以做到这一点。我只是在从磁盘读取它时遗漏了一些东西。

以下是我试过的但不起作用(contactPhotos 来自我的目录):

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

您不需要对图像文件进行 base64 编码(例如,如果您查看 get 请求的结果,结果不应该是 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

您可以试试这个。无需对图片进行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