🤖

Copilot に Intune の PowerShell を書かせたらマジでビビった話

2024/04/08に公開

はい、Copilot なめてました。すみません。
この記事は PowerShell を書くのがめんどくさい、もしくは普段書かない方のために、Copilot を利用して 一文字も書かず 望みの PowerShell が生成されて感動したというだけの大したことない記事です🤣

1. はじまり

「Intune で管理されてるデバイスに最後にサインインしたユーザーが知りたい」
そんなことを時々言われるのです。
15 年くらい前に Configuration Manager のサポートエンジニアをやってた時代にもよく聞かれてた話で、WMI や監査ログでゴリゴリ頑張ってもいいんだけど、確か資産インテリジェンス(今は非推奨) を追加するとひっそりレポート増えたよなーとか、もはやどうでも良い思い出。

しかし、この SIEM だ UEBA だ XDR と言われる分析・自動化の世の中でもサインインログってまだ求められるんだな、、、と思いつつも、みんな予算あるわけじゃなかったり、「社長、仕事の見える化しませんか?」とか言われて、うちではできないのかと振られてくるだろうな、、、なんて妄想したり。

2. なかなか重い腰があがらない

最近はスクリプトを書くこともないし、まとまった時間も取るのが面倒だし、、、
つべこべ言わずちょっと調べてみると、今の Graph でとれそうだなと。
https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.devicemanagement/get-mgdevicemanagementmanageddevice?view=graph-powershell-1.0
https://learn.microsoft.com/ja-jp/graph/api/intune-shared-user-getloggedonmanageddevices?view=graph-rest-beta

ならどこかの有志がサンプルスクリプトとか作ってるかなと思ったら、、、あるじゃないですか。
ほんとありがとう。コミュニティ万歳!!
https://github.com/bradywidener/Misc-Intune-Scripts/blob/main/Intune-Device-User-Logins.ps1

3. ちょっと改良してみるか

まぁこちらのスクリプト、「デバイス名」を入力して実行すると結果がでるようになってます。

これを「すべてのデバイス」に改造してみようと思いましたが、、、会議中 (内職) しながら見てたところ、ふと Copilot が目に入り・・・うぬの実力、試してみようじゃないか・・・?

4. Copilot に読み込ませる

Copilot (Bing) に上記スクリプトをまるっとコピペします。
すると英語でめっちゃ解説してくれます。

まぁ、英語でもいいんですけど、最新の AI だしもうちょい D&I とか意識して欲しいですよね。
ここは、日本語ネイティブの私から、一言ガツンと言っておきますわ!

やーさーしーい。すき。

5. Copilot に修正をお願いしてみる

調子にのった私は次にこんな感じでお願いしてみます。

# 必要なモジュールをインストール(Microsoft.Graph.Beta.DevicemanagementおよびMicrosoft.Graph.Beta.Users)
# Install-Module Microsoft.Graph.Beta.Devicemanagement
# Install-Module Microsoft.Graph.Beta.Users

# 必要なモジュールをインポート
Import-Module Microsoft.Graph.Beta.Devicemanagement
Import-Module Microsoft.Graph.Beta.Users

# 指定されたスコープでMicrosoft Graph APIに接続
Connect-MgGraph -Scopes "User.Read.All", "DeviceManagementManagedDevices.Read.All" -NoWelcome

Write-Output ""
Write-Output "このスクリプトは、Intuneに参加しているすべてのデバイスの情報を取得します。"
Write-Output ""

# すべてのデバイスをクエリし、UsersLoggedOnプロパティを取得
$devices = Get-MgBetaDeviceManagementManagedDevice

if ($devices) {
    $allUsersList = @()

    foreach ($device in $devices) {
        $lastUsers = $device.UsersLoggedOn

        foreach ($user in $lastUsers) {
            $lastLogon = $user.LastLogOnDateTime
            $userObject = New-Object PSObject -Property @{
                DeviceName = $device.DeviceName
                UserId = $user.UserId
                DisplayName = (Get-MgBetaUser -UserId $user.UserId).DisplayName
                LastLoggedOnDateTime = $lastLogon
            }
            $allUsersList += $userObject
        }
    }

    Write-Output ""
    $allUsersList | Out-Host -Paging # ユーザーのリストをすぐに表示
} else {
    Write-Output "デバイスが見つかりませんでした。"
}
read-host "ウィンドウを閉じるにはEnterキーを押してください"

Disconnect-MgGraph

これまたやさしい。
や、やるじゃないか。。。foreach に foreach かぶせただけだけど、、、ちゃんと動くじゃないか。

最後のエラーは最後の方の Out-Host の "-Paging" オプションを消せばよい程度なので良しとしましょう。
すんません、ほんとなめてました・・・

6. Copilot に色々と要求をしてみる

調子にのった私はさらなる要求を。

# 必要なモジュールをインストール(Microsoft.Graph.Beta.DevicemanagementおよびMicrosoft.Graph.Beta.Users)
# Install-Module Microsoft.Graph.Beta.Devicemanagement
# Install-Module Microsoft.Graph.Beta.Users

# 必要なモジュールをインポート
Import-Module Microsoft.Graph.Beta.Devicemanagement
Import-Module Microsoft.Graph.Beta.Users

# 指定されたスコープでMicrosoft Graph APIに接続
Connect-MgGraph -Scopes "User.Read.All", "DeviceManagementManagedDevices.Read.All" -NoWelcome

Write-Output ""
Write-Output "このスクリプトは、Intuneに参加しているすべてのデバイスの情報を取得します。"
Write-Output ""

# すべてのデバイスをクエリし、UsersLoggedOnプロパティを取得
$devices = Get-MgBetaDeviceManagementManagedDevice

if ($devices) {
    $allUsersList = @()

    foreach ($device in $devices) {
        $lastUsers = $device.UsersLoggedOn

        foreach ($user in $lastUsers) {
            $lastLogon = $user.LastLogOnDateTime
            $userObject = New-Object PSObject -Property @{
                DeviceName = $device.DeviceName
                DisplayName = (Get-MgBetaUser -UserId $user.UserId).DisplayName
                LastLoggedOnDateTime = $lastLogon
            }
            $allUsersList += $userObject
        }
    }

    # デバイスごとにエントリーを分けて表示
    $allUsersList | Group-Object DeviceName | ForEach-Object {
        Write-Output ""
        Write-Output "デバイス: $($_.Name)"
        $_.Group | Select-Object DisplayName, LastLoggedOnDateTime | Sort-Object LastLoggedOnDateTime -Descending | Select-Object -First 5 | Format-Table -AutoSize
    }
} else {
    Write-Output "デバイスが見つかりませんでした。"
}
read-host "ウィンドウを閉じるにはEnterキーを押してください"

Disconnect-MgGraph

ひー、人間より早くて修正しないで普通に動く。。。もう書かなくてほんと良さそう、、、

これはもうどんどんお願いしてみよう。
ファイルに保存もお願いしてみよう。こんな感じでお願い。

# 必要なモジュールをインストール(Microsoft.Graph.Beta.DevicemanagementおよびMicrosoft.Graph.Beta.Users)
# Install-Module Microsoft.Graph.Beta.Devicemanagement
# Install-Module Microsoft.Graph.Beta.Users

# 必要なモジュールをインポート
Import-Module Microsoft.Graph.Beta.Devicemanagement
Import-Module Microsoft.Graph.Beta.Users

# 指定されたスコープでMicrosoft Graph APIに接続
Connect-MgGraph -Scopes "User.Read.All", "DeviceManagementManagedDevices.Read.All" -NoWelcome

Write-Output ""
Write-Output "このスクリプトは、Intuneに参加しているすべてのデバイスの情報を取得します。"
Write-Output ""

# すべてのデバイスをクエリし、UsersLoggedOnプロパティを取得
$devices = Get-MgBetaDeviceManagementManagedDevice

if ($devices) {
    $allUsersList = @()

    foreach ($device in $devices) {
        $lastUsers = $device.UsersLoggedOn

        foreach ($user in $lastUsers) {
            $lastLogon = $user.LastLogOnDateTime
            $userObject = New-Object PSObject -Property @{
                DeviceName = $device.DeviceName
                DisplayName = (Get-MgBetaUser -UserId $user.UserId).DisplayName
                LastLoggedOnDateTime = $lastLogon
            }
            $allUsersList += $userObject
        }
    }

    # デバイスごとにエントリーを分けて表示
    $allUsersList | Group-Object DeviceName | ForEach-Object {
        Write-Output ""
        Write-Output "デバイス: $($_.Name)"
        $_.Group | Select-Object DisplayName, LastLoggedOnDateTime | Sort-Object LastLoggedOnDateTime -Descending | Select-Object -First 5 | Format-Table -AutoSize
    }

    # 結果をCSVファイルに保存
    $outputFilePath = "C:\temp\output.csv"
    $allUsersList | Export-Csv -Path $outputFilePath -Encoding UTF8 -NoTypeInformation
    Write-Output ""
    Write-Output "結果はCSVファイルに保存されました。ファイルパス: $outputFilePath"
} else {
    Write-Output "デバイスが見つかりませんでした。"
}
read-host "ウィンドウを閉じるにはEnterキーを押してください"

Disconnect-MgGraph

実行結果

かかか、完璧やないか!
出力された CSV ファイルも開いてみると以下のような感じ!

(参考) Copilot for Security

同僚が試してくれたのですが、Copilot for Security でも同様なことが可能でした!
日本語のプロンプトだと現時点ではエラーになってしまうようですが、英語であれば問題なしとのこと。


Excel へのエクスポートも問題なく!

テクノロジー!!

7. あとがき

近ごろわたしたちはいい感じ。ということでちょっとしたテストや情報をまとめて確認する程度であれば、現時点でも Copilot に書いてもらうので十分な気がしてきました。
さらに今後各製品に Copilot が組み込まれてきますが、コンソールの情報・操作はもちろん、Kusto クエリなんかも早いうちにいちから書く必要が無くなりそうです。
様々なものを「内部的に何をしているか」という観点さえ抑えれば、より多くのことを、より速く実現できる世の中は近そうですね!😉

Microsoft (有志)

Discussion