Microsoft が管理する世界のデータ センター ネットワークを介してアプリケーションとサービスを構築、配置、および管理するインフラストラクチャおよびクラウド コンピューティング プラットフォーム。
こんにちは、BCAzure01さん、
「プロフィール写真のあるユーザーとプロフィール写真のないユーザー」を一括で抽出して出力します。Graph を使用して、以下の PowerShell コマンドを実行できます。
- PowerShell 7+** (または TLS 1.2 が有効になっている Windows PowerShell 5.1)** を開きます。
- 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最小権限です。
プロフィール写真を一括更新するには、以下の手順に従ってください。
- すべての写真は次のようになります。
- JPG または PNG
- 理想的≤ 100 KB と 648×648 ピクセル (グラフは自動的にサイズ変更されますが、小さいほど高速です)。
- ファイル名は、UserPrincipalName** や電子メールなどの一意のユーザー属性と一致する必要があります**。
C:\Photos\ ******@contoso.com.jpg ******@contoso.com.jpg ******@contoso.com.jpg - 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 ループに追加できます。