You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Azure SDK for Python修改Office 365用户头像

Update Office 365 User Profile Pictures with Python (No Windows Host Needed)

Got it, let's tackle this task since you're already comfortable using Python with the Azure ecosystem for password sync. We'll use the Microsoft Graph SDK for Python—the modern, cross-platform tool for interacting with Office 365/Entra ID—no Windows-specific PowerShell modules required.

Step 1: Set Up Azure AD App Registration

First, you'll need an app registration in your Entra ID tenant with the right permissions (this should feel familiar from your password sync setup):

  • Head to the Azure Portal → Azure Active Directory → App Registrations → New Registration
  • Once created, go to API Permissions → Add a permission → Microsoft Graph → Application Permissions
  • Search for and add User.ReadWrite.All (this lets your script update user profiles; use User.ReadWrite if you only need to modify specific users with delegated access, but app permissions work best for unattended scripts)
  • Grant admin consent for your tenant to the added permission (critical for server-side access)
  • Navigate to Certificates & Secrets → Add a client secret, save the secret value immediately (you'll need this for authentication)

Step 2: Install Required Python Packages

Install the official SDK and identity library via pip:

pip install msgraph-sdk azure-identity

Step 3: Python Script to Update User Avatar

Here's a complete, unattended script that reads a local image and updates a user's Office 365 profile photo:

from azure.identity import ClientSecretCredential
from msgraph import GraphServiceClient
import asyncio

# Replace these with your tenant/app/user details
TENANT_ID = "your-tenant-id-here"
CLIENT_ID = "your-app-client-id-here"
CLIENT_SECRET = "your-app-client-secret-here"
USER_UPN = "user@yourdomain.com"  # Or use the user's unique ID
IMAGE_PATH = "/path/to/your/avatar.jpg"

async def update_user_avatar():
    # Authenticate with client credential flow (unattended, no user input)
    credential = ClientSecretCredential(
        tenant_id=TENANT_ID,
        client_id=CLIENT_ID,
        client_secret=CLIENT_SECRET
    )

    # Initialize Graph client
    graph_client = GraphServiceClient(credential)

    # Read the image file as raw bytes
    with open(IMAGE_PATH, "rb") as image_file:
        image_bytes = image_file.read()

    # Update the user's profile photo
    try:
        await graph_client.users.by_user_id(USER_UPN).photo.content.put(image_bytes)
        print(f"Successfully updated avatar for {USER_UPN}")
    except Exception as e:
        print(f"Error updating avatar: {str(e)}")

# Run the async function
asyncio.run(update_user_avatar())

Key Details to Remember:

  • Image Requirements: The avatar must be a JPEG file, max 4MB in size, and ideally 648x648 pixels (Graph will resize smaller images, but larger formats may be rejected).
  • Permissions: Don't skip granting admin consent—without it, you'll get a 403 Forbidden error when trying to update photos.
  • Authentication: Client Secret Flow is perfect for your use case (unattended server-side scripts). If you ever need user-specific access, you could switch to Authorization Code Flow, but that requires user interaction.

Troubleshooting Quick Wins

  • Double-check your tenant ID, client ID, and secret—typos here are the most common authentication issue.
  • If the image fails to upload, verify it's a valid JPEG (no PNGs or other formats) and doesn't exceed the size limit.
  • Test the Graph API endpoint first using the Graph Explorer (use app permissions there to mimic your script's access) if you're stuck.

内容的提问来源于stack exchange,提问作者Anders Sandblad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:54:40