Cloud Solutions Script

AAD - ユーザー情報をPowerShellを使用してCSVに出力する

2022年11月7日

自分
閲覧ありがとうございます。ゆっくり よんでいってください

本記事に記載の内容は、
「AAD - ユーザー情報をPowerShellを使用してCSVに出力する 」手順について説明しています。

Microsoft 365管理センターから出力できるものは、余計な情報が多く扱いづらいというご相談を頂いたのでPowerShellコマンドを更改させて頂きます。本コマンドをカスタマイズして利用していただいても問題ありませんので、ぜひご活用ください。

 

PowerShell を利用してテナント内のユーザー情報をCSVとして出力する

以下コマンドを実行することで、CSVとしてユーザー情報を吐き出すことが可能です。

テナント内に複数カスタムドメインを保有している場合、特定のドメインが割り当てられている方を取得したケースもあると思ったので、コマンドを2種類記載しています。

 

PowerShell を利用して、Azure ADへ接続する

以下手順に従って、Azure ADに接続してください。

  1. PowerShell を管理者権限で開きます。
    PowerShell を管理者権限で立ち上げる
  2. AzureADモジュールをインストールする。
    ※インストール済みの方は、本項番をスキップしてください。
     command
    Install-Module -Name "AzureAD" -Force
    


  3. インストールした/済み のAzure ADモジュールをインポートします。
     command
    Import-Module -Name "AzureAD"
    


  4. 以下コマンドを実行します。
    Azure ADの認証画面が表示されるので、Microsoft 365の管理者アカウントでサインインしてください。
     command
    Connect-AzureAD
    


テナント内の全ユーザー 情報をCSVとして出力する

本コマンドを実行すると、以下のユーザー情報を出力できます。

  • ObjectId
  • UserPrincipalName
  • DisplayName
  • Department

以下コマンドを実行します。
CSVは、本コマンドをPS1として保存していることを想定しPS1が保存されている箇所に保存されるようにしています。

#型の定義
$UserDate = New-Object System.Collections.ArrayList
$ary_Obj = New-Object System.Collections.ArrayList
$ary_Upn = New-Object System.Collections.ArrayList
$ary_Disn = New-Object System.Collections.ArrayList
$ary_Dep = New-Object System.Collections.ArrayList
$Calam1 = "ObjectId"
$Calam2 = "UserPrincipalName"
$Calam3 = "DisplayName"
$Calam4 = "Department"
[int]$i = "0"
$ary_objUsers = New-Object PSObject | Select-Object $Calam1,$Calam2,$Calam3,$Calam

#型の定義
$UserDate = New-Object System.Collections.ArrayList
$ary_Obj = New-Object System.Collections.ArrayList
$ary_Upn = New-Object System.Collections.ArrayList
$ary_Disn = New-Object System.Collections.ArrayList
$ary_Dep = New-Object System.Collections.ArrayList
$Calam1 = "ObjectId"
$Calam2 = "UserPrincipalName"
$Calam3 = "DisplayName"
$Calam4 = "Department"
[int]$i = "0"
$ary_objUsers = New-Object PSObject | Select-Object $Calam1,$Calam2,$Calam3,$Calam4

$FileDate = Get-Date -Format "yyyyMMdd"
$ScriptPath = Split-Path ( & { $myInvocation.ScriptName } ) -parent
$CsvPath = "\csv\"
$CsvFileSave = $ScriptPath + $CsvPath
$CsvName = $CsvFileSave + $FileDate +".UserData.csv"

#CSV格納先ディレクトリがなかったら作成
if( -not (Test-Path $LogPath) ) {
New-Item $CsvFileSave -type directory -Force
}

#ユーザ情報を取得
$UserDate = Get-AzureADUser -all $true | Select-Object ObjectId,UserPrincipalName,DisplayName,Department

#取得したユーザ情報をハッシュデータとして格納
$ary_Obj = @($UserDate | Select-Object ObjectId) -replace "@{ObjectId=" -replace "}"
$ary_Upn = @($UserDate | Select-Object UserPrincipalName) -replace "@{UserPrincipalName=" -replace "}"
$ary_Disn = @($UserDate | Select-Object DisplayName) -replace "@{DisplayName=" -replace "}"
$ary_Dep = @($UserDate | Select-Object Department) -replace "@{Department=" -replace "}"
foreach($str_Obj in $ary_Obj){
$ary_objUsers.$Calam1 = $ary_Obj[$i]
$ary_objUsers.$Calam2 = $ary_Upn[$i]
$ary_objUsers.$Calam3 = $ary_Disn[$i]
$ary_objUsers.$Calam4 = $ary_Dep[$i]
$i = $i + "1"

#CSVデータ出力
$ary_objUsers | Export-CSV -NoTypeInformation -Path $CsvName -Encoding UTF8 -Append
}

#出力したCSVデータ整理
if((Test-Path $CsvName) -eq $true ){
$Cont=Get-Content $CsvName | ConvertFrom-Csv
$Cont | ConvertTo-Csv -NoTypeInformation -Delimiter "," | % {$_ -replace '"',''} | out-file -Encoding utf8 $CsvName
}

 

テナント内で特定のカスタムドメインが割当たっているユーザー 情報をCSVとして出力する

本コマンドを実行すると、以下のユーザー情報を出力できます。

  • ObjectId
  • UserPrincipalName
  • DisplayName
  • Department

コマンド内の'#型の定期'にある、'$Domain' = 0の0を絞りたいドメインに変更してください。

以下コマンドを実行します。
CSVは、本コマンドをPS1として保存していることを想定しPS1が保存されている箇所に保存されるようにしています。

#型の定義
$UserDate = New-Object System.Collections.ArrayList
$ary_Obj = New-Object System.Collections.ArrayList
$ary_Upn = New-Object System.Collections.ArrayList
$ary_Disn = New-Object System.Collections.ArrayList
$ary_Dep = New-Object System.Collections.ArrayList
$Calam1 = "ObjectId"
$Calam2 = "UserPrincipalName"
$Calam3 = "DisplayName"
$Calam4 = "Department"
$Domain = "0"
[int]$i = "0"
$ary_objUsers = New-Object PSObject | Select-Object $Calam1,$Calam2,$Calam3,$Calam4

$FileDate = Get-Date -Format "yyyyMMdd"
$ScriptPath = Split-Path ( & { $myInvocation.ScriptName } ) -parent
$CsvPath = "\csv\"
$CsvFileSave = $ScriptPath + $CsvPath
$CsvName = $CsvFileSave + $FileDate +".UserData.csv"

#CSV格納先ディレクトリがなかったら作成
if( -not (Test-Path $LogPath) ) {
New-Item $CsvFileSave -type directory -Force
}

#ユーザ情報を取得
$UserDate = Get-AzureADUser -all $true | Select-Object ObjectId,UserPrincipalName,DisplayName,Department


#取得したユーザ情報をハッシュデータとして格納
$ary_Obj = @($UserDate | Select-Object ObjectId) -replace "@{ObjectId=" -replace "}"
$ary_Upn = @($UserDate | Select-Object UserPrincipalName) -replace "@{UserPrincipalName=" -replace "}"
$ary_Disn = @($UserDate | Select-Object DisplayName) -replace "@{DisplayName=" -replace "}"
#$ary_Dep = @($UserDate | Select-Object Department) -replace "@{Department=" -replace "}"
$ary_City = @($UserDate | Select-Object City) -replace "@{City=" -replace "}"
foreach($str_Obj in $ary_Obj){
#特定のドメインだったらCSVに吐き出す
$Domain = $ary_Upn.split("@")
if($Domain[1] -eq "teams.kagawa-edu.jp"){
$ary_objUsers.$Calam1 = $ary_Obj[$i]
$ary_objUsers.$Calam2 = $ary_Upn[$i]
$ary_objUsers.$Calam3 = $ary_Disn[$i]
$ary_objUsers.$Calam4 = $ary_Dep[$i]
$ary_objUsers.$Calam4 = $ary_City[$i]

#CSVデータ出力
$ary_objUsers | Export-CSV -NoTypeInformation -Path $CsvName -Encoding UTF8 -Append
}
$i = $i + "1"
}

#出力したCSVデータ整理
if((Test-Path $CsvName) -eq $true ){
$Cont=Get-Content $CsvName | ConvertFrom-Csv
$Cont | ConvertTo-Csv -NoTypeInformation -Delimiter "," | % {$_ -replace '"',''} | out-file -Encoding utf8 $CsvName
}

 

さいごに・・・

ここまで読んでいただきありがとうございます。

PowerShell コマンドに詳しい方だと、読んでいただく中で、こんな処理してるんだ~と思って頂けましたかね??
人が書いたコマンドを全て理解するって時間がかかりますよね。。。
でも実行するのは怖いと思うので、削除処理にあたる'Remove'が含まれていないことを確認の上実行してもらえればと思います!

以外と需要がある処理なので、ライセンス付与やグループへの追加処理を行う際に
本コマンドを組み合わせて頂くと、より多くの処理を柔軟に行えますよ。

 

他にも、こんなコマンド無いの?といったご連絡お待ちしているので、
TwitterのDM または、本ブログへのお問合せ/コメントでご連絡ください~

 

-Cloud Solutions, Script