次の方法で共有

Entra ID におけるプロフィール画像設定ユーザーの一括出力方法について

BCAzure01 25 評価のポイント
2025-09-26T15:04:46.2366667+00:00

Microsoft サポート御中

お世話になっております。 弊社では Microsoft Entra ID を利用しており、社員プロフィール画像の棚卸しを実施したく考えております。


  1. 一括で「プロフィール画像が設定されているユーザーのみ」を抽出・出力する方法
  • 全ユーザーに対して 1 件ずつ呼ぶのは非効率なため、一括で画像有無(true/false)をリスト化できる標準機能や推奨手順はありますか?
  • もし推奨が Graph の Batch API 等での並列化であれば、/photo/$value のようなバイナリ PUT/GET を $batch で扱えるか、ならびに実装サンプル制限事項をご提示いただけますか。

<モデレーター注>
Microsoft Q&Aでは時間指定には対応していませんので文字削除しました。
質問は、第三者を含めて混乱しない様に、一問一答形式にしてください。
1つのスレッド内に複数の質問を投稿しない
回答内容が発散してしまうことを回避する為に、質問内容2.3は 削除させて頂きました。
これらの質問については、必要に応じて新規に質問する様にしてください。
この質問は「Azure Advisor」に投稿されましたが、Microsoft Q&A(ja-jp)ではサポートしていない"Entra ID"関連の質問内容なので「監視対象外」に変更しました。

Azure
Azure

Microsoft が管理する世界のデータ センター ネットワークを介してアプリケーションとサービスを構築、配置、および管理するインフラストラクチャおよびクラウド コンピューティング プラットフォーム。


1 件の回答

並べ替え方法: 最も役に立つ
  1. Raja Pothuraju 47,640 評価のポイント Microsoft 社員 モデレーター
    2025-09-26T18:02:25.0533333+00:00

    こんにちは、BCAzure01さん、

    「プロフィール写真のあるユーザーとプロフィール写真のないユーザー」を一括で抽出して出力します。Graph を使用して、以下の PowerShell コマンドを実行できます。

    1. PowerShell 7+** (または TLS 1.2 が有効になっている Windows PowerShell 5.1)** を開きます。
    2. Graphモジュールをまだインストールしていない場合は、インストールします。
    Install-Module Microsoft.Graph -Scope CurrentUser
    

    必要な権限で接続します。

    Connect-MgGraph -Scopes "User.Read.All"
    

    少なくとも User.Read.All (または Directory.Read.All) のアクセス許可が必要です。

    プロフィール写真の有無にかかわらずユーザーを取得するスクリプト

    # 1. Get all users (include only needed properties)
    $users = Get-MgUser -All -Property "Id,DisplayName,UserPrincipalName"
    
    # 2. Prepare an array to hold the output
    $results = @()
    
    # 3. Loop through users and check photo presence
    foreach ($user in $users) {
        try {
            # Try to get user's photo metadata
            $photo = Get-MgUserPhoto -UserId $user.Id -ErrorAction Stop
            
            # If no error, user has a photo
            $hasPhoto = $true
        }
        catch {
            # If the call fails, the user doesn't have a photo
            $hasPhoto = $false
        }
    
        # Add to output object
        $results += [PSCustomObject]@{
            DisplayName       = $user.DisplayName
            UserPrincipalName = $user.UserPrincipalName
            HasProfilePhoto   = $hasPhoto
        }
    }
    
    # 4. Export to CSV
    $results | Export-Csv -Path ".\EntraID_ProfilePhoto_Report.csv" -NoTypeInformation -Encoding UTF8
    
    Write-Host "Report generated: EntraID_ProfilePhoto_Report.csv"
    

    上記のスクリプトを実行し、必要な結果を得ることができました。以下のスクリーンショットに示すような出力が得られます。

    ユーザーのイメージ

    ProfilePhoto.ReadWrite.All(アプリ/委任)は、ユーザーのプロフィール写真を更新するために必要な適切なAPI最小権限です。

    プロフィール写真を一括更新するには、以下の手順に従ってください。

    1. すべての写真は次のようになります。
      • JPG または PNG
      • 理想的≤ 100 KB648×648 ピクセル (グラフは自動的にサイズ変更されますが、小さいほど高速です)。
      • ファイル名は、UserPrincipalName** や電子メールなどの一意のユーザー属性と一致する必要があります**。
      フォルダ構造の例:
         C:\Photos\
          ******@contoso.com.jpg
          ******@contoso.com.jpg
          ******@contoso.com.jpg
      
    2. Graphモジュールをインストールします。
    Install-Module Microsoft.Graph -Scope CurrentUser
    

    適切な権限で接続します。

    Connect-MgGraph -Scopes "User.ReadWrite.All"
    

    グローバル管理者であるか、ユーザーの写真を更新できるカスタム ロールを持っている必要があります。


    一括インポートスクリプト

    # Path to folder with photos
    $photoFolder = "C:\Photos"
    
    # Get all jpg & png files
    $photoFiles = Get-ChildItem -Path $photoFolder -Include *.jpg, *.jpeg, *.png -File
    
    foreach ($file in $photoFiles) {
        # Match file name (without extension) to user's UPN
        $upn = $file.BaseName
    
        try {
            # Upload the photo
            Set-MgUserPhotoContent -UserId $upn -InFile $file.FullName -ErrorAction Stop
            Write-Host "Uploaded photo for $upn"
        }
        catch {
            Write-Warning "Failed to upload photo for $upn: $($_.Exception.Message)"
        }
    }
    
    Write-Host "Bulk photo import complete!"
    

    筆記

    • Set-MgUserPhotoContent 既存の写真が存在する場合は、既存の写真を置き換えます。
    • スクリプトは、写真ファイル名がユーザーの UPN と一致することを前提としています
    • 別の識別子(EmployeeID など)を使用する場合は、ルックアップを調整します。
        $user = Get-MgUser -Filter "employeeId eq '$($file.BaseName)'"
        Set-MgUserPhotoContent -UserId $user.Id -InFile $file.FullName
      
    • 大規模なテナントはグラフの調整に達する可能性があります。 Start-Sleep -Milliseconds 200 必要に応じてループを追加します。
    • ユーザーは、Teams や Outlook などのアプリに変更が表示されるまで、サインアウト/サインアウトするか、数分待つ必要がある場合があります。

    「この要求の送信中にエラーが発生しました」という理由は、一括更新時の調整が原因です。 Start-Sleep -Milliseconds 200 ループに追加できます。

    この回答は役に立ちましたか?


お客様の回答

質問作成者は回答に "承認済み"、モデレーターは "おすすめ" とマークできます。これにより、ユーザーは作成者の問題が回答によって解決したことを把握できます。