我正在编写脚本来为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))
您可以尝试使用此方法。无需对图像进行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
您不需要对图像文件进行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