Azure AD 上の不要なデバイスを PowerShell で確認、削除する方法。

#はじめに

今回は、下記イタリアの MS エンジニアが Blog に投稿していたネタを基に、不要になった Azure AD 上のデバイスを PowerShell を使って抽出し、削除してきれいに整理する方法について紹介します。

-参考情報
Tips on PowerShell Modules for Managing Stale Devices
URL:https://techcommunity.microsoft.com/t5/Core-Infrastructure-and-Security/Tips-on-PowerShell-Modules-for-Managing-Stale-Devices/ba-p/840830

#やってみる

まず、PowerShell で削除する方法以外に、Azure AD 上に登録(参加)している不要なデバイスを削除する方法は以下 2 とおりあります。

#####Azure ポータルより削除する

「Azure Active Directory」→「デバイス」→「すべてのデバイス」より、下記画面ショットのように☑を入れた状態で画面上部の「削除」を選択すれば削除できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/213fbbf0-f5e5-7144-15a9-8c5b48edc023.png)

#####Microsoft 365 管理センターから削除する

管理ポータル(admin.microsoft.com)にログインし、管理センターの「Azure Active Directory」を選択後、Azure Active Directory 管理センターより、「Azure Active Directory」→「デバイス」→「すべてのデバイス」の順に選択し、同じように☑を入れて、「削除」を選択することで削除ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/912f9226-9b26-1229-0b46-2e1157f95cc6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/57c35777-c902-13f4-53c1-80a1d21d2a19.png)


また、Azure AD には「結合の種類」という Azure AD にデバイスを登録(参加)する方法が 3 種類(例外を入れると4 種類あります)

| 結合の種類      |       説明|    メリット等   |
|:-----------------|:------------------|:------------------|
| Azure AD Registered (登録)             |              会社で管理されていないデバイスを SSO させたい場合に利用 |   BYOD 向け、条件付きアクセスで制御可能        |
| Azure AD Join (参加)         | 社用 PC をクラウド用途のみに使いたい場合に利用    | リモートワーク向けに最適、条件付きアクセスで制御可能       |
| Hybrid Azure AD Join             |  オンプレミス AD に参加しつつ Azure AD Join する構成 |  オンプレミス AD の GPO が適用できる、条件付きアクセスで制御可能 |
| なし               |  Intune Enrollment を使わずに、Outlook Mobile か Authenticator によりデバイス登録した時に発生する|   正しく構成できてないのでクラウド リソースは使えない、条件付きアクセスで制御可能不可        |

#####PowerShell による確認、削除方法について
本題の、PowerShell を使った、デバイス一覧の取得方法ですが、下記コマンドレットで抽出自体は可能です。

1. PowerShell を起動し、Connect-MsolService を実行します。

2. グローバル管理者の UPN を入力し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/09b6fc4c-fa73-9238-e383-0f2042ea3994.png)

3. パスワードを入力し、「サインイン」をクリックします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/6bd1be72-4c5f-dcb7-f8ec-635825cea17a.png)

4. Get-MsolDevice -all | select-object -Property Enabled, DeviceId, DisplayName, DeviceTrustType, ApproximateLastLogonTimestamp を実行します。

実行結果は下記のようになります。

```
PS C:\WINDOWS\system32> Get-MsolDevice -all | select-object -Property Enabled, DeviceId, DisplayName, DeviceTrustType, ApproximateLastLogonTimestamp


Enabled                       : True
DeviceId                      : cc5de156-1a39-42e6-bd79-e9cea80eefdc
DisplayName                   : Windows10-18095
DeviceTrustType               : Domain Joined
ApproximateLastLogonTimestamp : 2019/08/26 6:42:34

Enabled                       : True
DeviceId                      : e87d4c7d-abf7-43b7-bebc-f816f772eaee
DisplayName                   : Windows10-18098
DeviceTrustType               : Domain Joined
ApproximateLastLogonTimestamp : 2019/09/11 22:06:16

Enabled                       : True
DeviceId                      : 7713fc57-6326-421c-a00d-00c1d73b0a78
DisplayName                   : Windows1809-02
DeviceTrustType               : Azure AD Joined
ApproximateLastLogonTimestamp : 2019/07/22 10:48:15

Enabled                       : True
DeviceId                      : 7e6cf25d-20bb-4ded-992e-5f5ee7cc2ab5
DisplayName                   : Windows10-18095
DeviceTrustType               : Workplace Joined
ApproximateLastLogonTimestamp : 2019/05/18 6:03:01
```
上記コマンドレットでも確認はできるのですが、例えば実際にデバイスが登録されたままだけど、実はログオンはしている(利用はしている)という識別をする、要は、より正確な絞り込みをするためには、***-LogonTimeBefore*** オプションを使うと便利です。

90 日以上ログオンしていないデバイスを抽出するためには、以下のようなコマンドレットを実行します。

```
$date = get-date -date $(get-date).adddays(-90) -format MM-dd-yyyy
Get-MsolDevice -all -LogonTimeBefore $date | select-object -Property Enabled, DeviceId, DisplayName, DeviceTrustType, ApproximateLastLogonTimestamp
```
ちなみに、この***-LogonTimeBefore*** オプションですが、MSonline のバージョンが***1.1.183.17***以上である必要があります。
バージョンの確認は、Get-Module -name MSonline で行えます。

```
Get-Module -name MSonline

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   1.1.183.17 MSOnline                            {Add-MsolAdministrativeUnitMember, Add-MsolForeignGroupToR...
```

バージョンが古い場合は、***Remove-Module -name MSOnline*** でアンインストール後に、***Install-Module MSOnline***で再インストールすることで最新版をゲットできます。

Excel に出力して管理したいんです、ということであれば、下記コマンドレットにて出力が可能です。

```
例)
Get-MsolDevice -all -LogonTimeBefore $date | select-object -Property Enabled, DeviceId, DisplayName, DeviceTrustType, ApproximateLastLogonTimestamp | export-csv c:\DeviceList-olderthan-90days-summary.csv
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/49ddd4a7-539f-7461-265b-b2ee93d3b781.png)

最後に、ある一定日以上ログオンしてないデバイスは削除する場合は、"|"(パイプ)で **remove-msoldevice -force** でつなげることで実行可能です。***-force*** オプションはプロンプトで確認が行われず強制削除されますので、実行に注意してください。


例) --force オプションを付けない場合

```
Get-MsolDevice -all -LogonTimeBefore $date | remove-msoldevice

確認
この操作を続行しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):
```

例) --force オプションを付けた場合

```
Get-MsolDevice -all -LogonTimeBefore $date | remove-msoldevice -force
```

削除されたか確認します。(デバイスが表示されないことを確認します。)

```
Get-MsolDevice -all -LogonTimeBefore $date | select-object -Property Enabled, DeviceId, DisplayName, DeviceTrustType, ApproximateLastLogonTimestamp
```

Azure ポータルで確認しても Azure AD Registered として登録されていた、 Windows10-18095 が削除されてことが確認できます。
(全 6 デバイスから 5 デバイスに減っています)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/b974a626-05fa-7aa1-0740-50a6d792a9c4.png)

#おわりに
今回は、Azure AD 上に登録された不要なデバイスを整理する方法についてご案内しました。
特に管理者の方であれば Azure AD 上に登録された無数のデバイスの中で、一体どのデバイスを削除すればいいのか分からない、分からないからそのままでいいや、と思って不要なデバイスが増え続けている、という状況があるのではないでしょうか。

今回ご案内した方法で長期間ログオンしていないデバイスを抽出、Excel に書き出して、実際の利用者に対して確認してもらうことで、確実に不要なデバイスを削除することができるようになると思いますので活用してみてください。

今回の記事が少しでも参考になれば幸いです。