0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EntraIDで特定のグループに参加するユーザー情報を抽出してみた

Posted at

IT企業で働いている人は謎の棚卸や情報適用を求められることがあると思います。
(監査対応のためやら脆弱性の対応のためやら。。。
多分システム提供する上でそういう棚卸とか情報適用してないとダメなんでしょうね。。
その辺も上位層の対応も追々勉強したいところです)

今回はアカウントの情報を求められたときに使えそうなスクリプトを
Copilotに全力で頼んで作ってもらいました。

test.ps1
# Microsoft Graph PowerShellモジュールをインストール(初回のみ)
# 初回実行時のみ必要。Microsoft Graph APIと連携するためのモジュールを追加。
Install-Module Microsoft.Graph -Scope CurrentUser

# Microsoft Graph APIに接続
# 認証を行い、ユーザー情報とグループ情報の取得を可能にする。
Connect-MgGraph -Scopes "User.Read.All", "Group.Read.All"

# 出力するCSVファイルのパス(自由に変えてください)
$outputFile = "C:\Users\Public\FilteredAzureAD_UserGroups.csv"

# "test01" または "test02" を含むグループのみを取得(取得時点でフィルタリング)
# ここでフィルタリングすることで、大量のデータを取得しないように最適化。
$filteredGroups = Get-MgGroup -Filter "startswith(DisplayName, 'test01') or startswith(DisplayName, 'test02')"

# ユーザー情報を格納する配列を準備
$results = @()

# フィルタリングされたグループごとにユーザー情報を取得
foreach ($group in $filteredGroups) {
    # グループに所属するメンバーの情報(ObjectIdのみ取得)
    # `Get-MgGroupMember` はメンバーのObjectIdを返すため、後でUPNと表示名を取得する必要がある。
    $members = Get-MgGroupMember -GroupId $group.Id

    # 各メンバーのObjectIdを使ってユーザー情報を取得
    foreach ($member in $members) {
        # `Get-MgUser -UserId` を使って、各ユーザーのUPNと表示名を取得
        $user = Get-MgUser -UserId $member.Id 
        
        # ユーザー情報をオブジェクトとして配列に追加
        $results += [PSCustomObject]@{
            GroupName = $group.DisplayName  # 所属グループ名
            DisplayName = $user.DisplayName # ユーザーの表示名
            UPN = $user.UserPrincipalName  # ユーザーのUPN(ログインID)
        }
    }
}

# CSVの内容をUTF-8(BOM付き)で保存する処理

# ① `ConvertTo-Csv` でデータをCSV形式に変換
#    - PowerShell標準の `Export-Csv` はデフォルトでUTF-16を使用するため、Excelで文字化けすることがある。
#    - `ConvertTo-Csv` は、データを「文字列」として扱うので、自由にエンコーディングを設定できる。
#    - `NoTypeInformation` を指定することで、余計な型情報(`#TYPE System.Object` など)を含めずに出力する。
$csvContent = $results | ConvertTo-Csv -NoTypeInformation

# ② Excelが正しく開けるように UTF-8 (BOM付き) のエンコーディングを設定
#    - BOM(Byte Order Mark)は、ファイルの先頭に付加される特別なマークで、エンコーディングの種類を示す。
#    - UTF-8にはBOM付きとBOMなしがあり、Excelは「BOMなしのUTF-8」をうまく認識できないことがある。
#    - `New-Object System.Text.UTF8Encoding $true` を使うことで、UTF-8 (BOM付き) を作成。
#    - こうすることで、Excelで開いたときに日本語の文字化けを防ぐことができる!
$utf8BOM = New-Object System.Text.UTF8Encoding $true

# ③ `WriteAllLines` を使用して、UTF-8 (BOM付き) でファイルを保存
#    - `.NET の System.IO.File.WriteAllLines()` を使うことで、文字列を指定したエンコーディングでファイルに保存できる。
#    - PowerShell標準の `Export-Csv` ではUTF-16が使われるため、Excelでの互換性が悪い。
#    - `WriteAllLines` を使い、UTF-8 (BOM付き) で保存することで、Excelで正しく開けるようにする。

# `.NET の System.IO.File.WriteAllLines()` の構文:
# [System.IO.File]::WriteAllLines(ファイルパス, CSVデータ, 文字コード)
# - 第1引数: 保存先のファイルパス (`$outputFile`)
# - 第2引数: CSVデータ (`$csvContent`)
# - 第3引数: エンコーディング (`$utf8BOM`)
[System.IO.File]::WriteAllLines($outputFile, $csvContent, $utf8BOM)

# 処理完了メッセージを表示
Write-Output "UTF-8 (BOM付き) のCSVファイルが作成されました: $outputFile"

GUIの操作だとグループ名で絞ってUPN含むユーザー情報抽出して・・・
っていうかゆい所に手が届かず必要な情報をいい感じに抽出できませんでしたが
これでできるようになりました。やったね。

余談-Copilot(コピくん)とのやりとり

image.png

できないことを自信満々にできると言い続けるのかわいい

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?