Microsoft Intune をコマンドで利用する(実践編)

Microsoft 365

先日の「Microsoft Intune をコマンドで利用する準備」というブログ記事ですが、一部の人から「助かった」という声をいただいて嬉しい限りなのですが、一方で「何に使うのかわからん」という声もいただきました。

前回は接続するところのポイントだけ書いたので、今回は業務利用をイメージしていただくために実際のスクリプトそのものを1つ公開してみようと思います。

PowerShell は使うと非常に便利なのですが「スクリプトよくわからん」という人も多いと思います。周りに使っている人がいないと、使い始めるハードルが高くて GUI で何とかしようという発想になりがちです(私はそうでした)。そのため使ったことがない方には「なにが出来るのかよくわからん」ままで PowerShell の便利さに気付かないのではないかなと思います。

個人的にわかりやすい例かなと思ったので Microsoft Intuneの アプリの登録状況がわかるスクリプトを公開してみます。前提条件としては権限があることなどは当然として、Intune で PowerShell で接続するために前回のブログの設定をしていることとなります。

※PowerShell 得意ではないのでお恥ずかしいコードですが、、、

# Microsoft Graph PowerShell SDKに接続
Connect-MgGraph -Scopes "DeviceManagementApps.ReadWrite.All", "Group.Read.All"

# すべてのアプリを取得
$apps = Get-MgDeviceAppManagementMobileApp

# 結果格納用配列
$results = @()

foreach ($app in $apps) {
    $appId = $app.Id
    $uri = "https://graph.microsoft.com/v1.0/deviceAppManagement/mobileApps/$appId/assignments"
    $assignments = Invoke-MgGraphRequest -Uri $uri -Method GET

    if ($assignments.value) {
        foreach ($assignment in $assignments.value) {
            $targetType = $assignment.target.'@odata.type'
            $targetGroupId = $assignment.target.groupId
            $targetGroupName = ""

            # TargetTypeがグループの場合はグループ名を取得
            if ($targetGroupId) {
                try {
                    $group = Get-MgGroup -GroupId $targetGroupId
                    $targetGroupName = $group.DisplayName
                } catch {
                    $targetGroupName = "取得できませんでした"
                }
            } else {
                # グループ以外のTargetTypeはそのまま表示
                $targetGroupName = "なし"
            }

            # TargetTypeの表示を修正
            switch ($targetType) {
                "#microsoft.graph.allLicensedUsersAssignmentTarget" { $targetType = "すべてのライセンスユーザー" }
                "#microsoft.graph.allUsersAssignmentTarget" { $targetType = "すべてのユーザー" }
                "#microsoft.graph.groupAssignmentTarget" { $targetType = "グループ" }
                "#microsoft.graph.unknownAssignmentTarget" { $targetType = "不明なターゲット" }
                default { $targetType = $targetType -replace "#microsoft.graph.", "" }
            }

            $results += [PSCustomObject]@{
                AppName = $app.DisplayName
                AppId = $app.Id
                AssignmentId = $assignment.id
                Intent = $assignment.intent
                TargetType = $targetType
                TargetGroupId = $targetGroupId
                TargetGroupName = $targetGroupName
            }
        }
    }
}

# CSVファイルに出力(ハードコーディングしているので出力先を書き換えてください)
$results | Export-Csv -Path "C:\Temp\IntuneAppAssignmentsWithGroupName.csv" -NoTypeInformation -Encoding UTF8

# 接続を切断(任意)
Disconnect-MgGraph

結果として実際にテナントで登録されているアプリの名前、アプリのID(登録や削除の時に使う)、AssignmentId(削除の時に使う)、Intent(必須か任意かなどの区別)、TargetGroupId(登録や削除の時に使う)、TargetGroupName(人が見たときにわかりやすいようにグループの名前)を表示するようにしてみました。※一部セルの幅を短くして隠しているのはわざとです。

Intuneを結構使い込んでいるテナントの場合にこのような出力がされると結構便利なのではないでしょうか?

どのアプリがどういう設定になっているかがわかるので設定ミスなどの確認にも使えますし、有効活用していただければと思います。(画像は家族テナントなので「こんなアプリを会社で入れないよ!」というツッコミはなしで!)

このように PowerShell を使うとかなり便利です。他にも登録や削除をGUIでアプリ単位で登録する方も多いと思いますが、情シスやエンジニアの方はそれをやっていると量が多いと「ゲシュタルト崩壊」をしたり、ミスが多くなるのでスクリプトベースで登録や削除をすることをおススメします。

ちなみにすべて PowerShell が向いているわけではありません。少量であればGUIでやるほうが良いとは思います。具体的には大量にやる場合にすべてGUIでやるというのはスクリプトがわからない人は効率的にみえるかもしれませんが、一般論としては非常に非効率なので PowerShell での設定をお勧めします。

このようなスクリプトを書くのも昔はすごい大変でしたが、みなさんには「生成AI」という味方が出来たかと思います。これを機に業務効率化の観点として見直しをしてみてはいかがでしょうか?

最後に

今回はアプリに関してでしたが Microsoft Intune を利用するうえで現実的なレベルとしてこうしたほうが良いといったTIPSは多くあります。こういうTIPSは会社の規模であったり、セキュリティ方針であったり、考え方であったりで正解にも不正解にもなるので自社にあった情報でないと混乱します。そもそも論としてSIerやコンサルからしたら飯のタネなのででてこないというものあります。その一端として今回は「構築や運用という観点の効率化のTIPS」を書いてみました。

生成AIが一般化したので「感が良い方」ならこのような事例がわかればいろいろ発展させることができるかと思います。ぜひ皆さんも便利なTIPSをブログなどで発信いただければと思います。ちなみに私もいろいろ生成AIで手元のスクリプトの書き換えをしましたので、(AIの学習の観点で)皆さんのお手伝いを間接的にしたかもしれませんw

「Intuneの対応を伴走して支援して欲しい」といった方は個別に連絡いただければ個人対応もできますし(現在も Microsoft 365 の支援を数社やっています)、そういうサポートしている会社も紹介できるかと思います。お気軽にお問い合わせください。

タイトルとURLをコピーしました