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

问题描述 投票:0回答:2

我正在编写脚本来为Exchange Online中的用户创建新的联系人。使用Microsoft Graph,我可以轻松地使用POSThttps://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))
office365 microsoft-graph contacts
2个回答
1
投票

您可以尝试使用此方法。无需对图像进行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

2
投票

您不需要对图像文件进行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
© www.soinside.com 2019 - 2024. All rights reserved.