はじめに
MicrosoftGraphAPI
Microsoft Graph APIはMicrosoft Cloudサービスのリソースへのアクセスを可能にするRESTful Web APIです。
アプリを登録して、サービスまたはユーザーの認証トークンを取得すると、Microsoft Graph APIに対して要求を行うことができます
最近Microsoft365を導入したけど、アイコンがないよ…
今回は自動でユーザーごとに違う画像を設定するPowerhellのコードを紹介するから安心してね!
完成コード
写真の設定は下記のコードをコピペすることで簡単に設定が可能だよ。
※このあとコードを解説して行きます。
完成版
###################################################
#
# ユーザーアイコンインポート
#
###################################################
#写真ファイル名に必要な「格納場所・拡張子」を定義
$pPath = 'C:\Users\user\Desktop\pictureFolder'
$last = '.jpg'
#MicrosoftGraphへ接続
Connect-MgGraph -Scopes "Organization.Read.All","User.ReadWrite.All","Directory.AccessAsUser.All"
# 元データの取得
$licenses = Get-MgSubscribedSku -all
$users = Get-MgUser -Filter 'assignedLicenses/$count ne 0' -ConsistencyLevel eventual `
-CountVariable licensedUserCount -All -Select UserPrincipalName,DisplayName,AssignedLicenses
$list=@()
# 出力用データの作成
foreach($user in $users){
$line = @{UserPrincipalName = $user.UserPrincipalName}
$line.DisplayName = $user.DisplayName
foreach($userlicense in $user.AssignedLicenses){
foreach($license in $licenses){
if($license.SkuId -eq $userlicense.SkuId)
{
$line.SkuPartNumbers += $license.SkuPartNumber + "`t"
}
}
}
$list+=$line
}
#全体管理者を配列から除く
$list = $list | Where-Object { $_.UserPrincipalName -notlike "admin*" }
#インポート用のリストを作成
$PI_lists = @()
foreach($list_User in $list){
$PI_list = @{UserPrincipalName = $list_user.UserPrincipalName}
#社員番号抽出
$elias = $list_User.UserPrincipalName -split '@' | Select-Object -First 1
$elias_Id = $elias.Substring($elias.Length -4, 4)
$PI_list.ShainId = $elias_Id
#画像パスを追加
$Picture_path = "$pPath$elias_Id$last"
$PI_list.pictureIPath += $Picture_path
#PI_listsに追加
$PI_lists += $PI_list
}
#インポート用のリストから必要な項目を変数に格納
$AllImportData = $PI_lists | Select-Object UserPrincipalName, pictureIPath
Foreach ($ImportData in $AllImportData){
Set-MgUserPhotoContent -UserId $ImportData.UserPrincipalName -InFile $ImportData.pictureIPath
}
解説
#写真ファイル名に必要な「格納場所・拡張子」を定義
$pPath = 'C:\Users\user\Desktop\pictureFolder'
$last = '.jpg'
まず初めに必要な変数を設定していきます。
「$pPath」は写真フォルダを格納している場所を記載します。
「pictureFolder」にはユーザーを特定可能な番号・名称を付与してあるファイル名で格納していることが条件です。
※後のコードでファイル名とUPN(UserPrincipleName)を紐づける作業を行うためです。
#MicrosoftGraphへ接続
Connect-MgGraph -Scopes "Organization.Read.All","User.ReadWrite.All","Directory.AccessAsUser.All"
MicrosoftGraphAPIへ接続を行います。
オプション(-Scope)については詳細はここで説明しませんが、正しいものを設定しないと編集が不可となる項目もありますので注意してください。
# 元データの取得
$licenses = Get-MgSubscribedSku -all
$users = Get-MgUser -Filter 'assignedLicenses/$count ne 0' -ConsistencyLevel eventual `
-CountVariable licensedUserCount -All -Select UserPrincipalName,DisplayName,AssignedLicenses
$list=@()
# 出力用データの作成
foreach($user in $users){
$line = @{UserPrincipalName = $user.UserPrincipalName}
$line.DisplayName = $user.DisplayName
foreach($userlicense in $user.AssignedLicenses){
foreach($license in $licenses){
if($license.SkuId -eq $userlicense.SkuId)
{
$line.SkuPartNumbers += $license.SkuPartNumber + "`t"
}
}
}
$list+=$line
}
「Get-MgSubscribedSku -all」で有効なライセンスを持つ全てのユーザーを絞り込むため、ライセンスの情報を取得します。
「Get-MgUser」で全てのユーザを取得し、フィルター関数で上記のユーザーを絞り込んでいます。
最後に空のリスト「$list=@()」にデータを格納します。
#全体管理者を配列から除く
$list = $list | Where-Object { $_.UserPrincipalName -notlike "admin*" }
ここは任意ですが、全体管理者に画像の設定は不要ですので、「admin」をUPNに持つものを配列から削除しています。
#インポート用のリストを作成
$PI_lists = @()
foreach($list_User in $list){
$PI_list = @{UserPrincipalName = $list_user.UserPrincipalName}
#社員番号抽出
$elias = $list_User.UserPrincipalName -split '@' | Select-Object -First 1
$elias_Id = $elias.Substring($elias.Length -4, 4)
$PI_list.ShainId = $elias_Id
#画像パスを追加
$Picture_path = "$pPath$elias_Id$last"
$PI_list.pictureIPath += $Picture_path
#PI_listsに追加
$PI_lists += $PI_list
}
インポート用のデータを作成していきます。
まず前提として今回のUPNは以下の構成となっています。
氏名+社員番号(4桁)@domain.onmicrosoft.com
最初に設定した変数の場所にある、
社員番号.jpg
の画像ファイルと上記のUPNをここで紐づけていきます。
条件は以下です。
・有効なライセンスを持つユーザー
・画像ファイルが存在する
#社員番号抽出
$elias = $list_User.UserPrincipalName -split '@' | Select-Object -First 1
$elias_Id = $elias.Substring($elias.Length -4, 4)
$PI_list.ShainId = $elias_Id
社員番号が4桁のため、「@アットマーク」以前の文字列の後ろから4桁を取得するコードとなっています。
ここは自身の環境に沿って修正してみてください。
UPN・画像ファイルを紐づけたものを新たな配列に格納します。
#インポート用のリストから必要な項目を変数に格納
$AllImportData = $PI_lists | Select-Object UserPrincipalName, pictureIPath
Foreach ($ImportData in $AllImportData){
Set-MgUserPhotoContent -UserId $ImportData.UserPrincipalName -InFile $ImportData.pictureIPath
}
最後に余分な列を削除し、インポートを行います。
インポートには「Set-MgUserPhotoContent」を使用します。
おわり