ADアカウントの棚卸し

# はじめに
いま担当しているお客様の[AD(Active Directory)](https://ja.wikipedia.org/wiki/Active_Directory)サーバーの引越し準備中です。
移行元は既にサポートが切れているWindows 2008 R2、移行先はWindows 2019です。来年サポート途切れになるWindows 2012 R2の移行でも同じく準備は必要です。移行を請負うベンダーとしては不要なデータ量を減らして移行作業のリスクを回避しておきたいと考えます。

お客様に「不要なアカウントはありますか？」とお尋ねしても「有るには有るが、特定するに至ってない」と回答が戻ってくるのが大半です。そこで私は「一定期間ログインしていないアカウントをリスト化してアカウント削除の可否を確認してください」と移行前に提案しています。
# 不要なアカウントを抽出する
さて「一定期間ログインしていないアカウントを確認するには？」どうすれば良いでしょうか？
残念ながらアカウント管理に使用している**GUIツール(Active Directoryユーザーとコンピューターアカウント）のプロパティには表示されません。** Windows 2008 R2でもWindows 2019でも同じです。
そこで、CUIツール([PowerShell](https://ja.wikipedia.org/wiki/PowerShell))の出番です。ADアカウントを管理する上ではPowerShellなくして語れません。もっと積極的にマイクロソフトさんに布教して欲しいぐらいです。(笑)
では、具体的にyyyy/mm/dd以降ログインしていないユーザーアカウントを抽出する方法を紹介します。ADサーバーへログインしてPowerShellを管理者権限で起動します。タイトルバーの左側へ**管理者**と表示されていることを確認してください。

:::note info
**PowerShellの管理者権限**
コンピューターに対し、Administrator アカウントでログインしている状態で PowerShell を起動すると自動で管理者権限で起動されますが、Administrator 以外の他のアカウントは通常モードで起動されます。PowerShellを管理者権限で起動する場合は、以下のコマンドを実行します。管理者権限でPowerShell は別ウィンドウで起動します。
``` powershell:
Start-Process PowerShell.exe -Verb runas
```
:::
**Search-ADAccount**コマンドレットを使って以下のように実行します。**-AccountInactive**オプションを使用することで「指定した日付以降ログインしていないActive Directoryのアカウントを検索する」ことができます。
日付は **-DateTime**オプションで指定します。デフォルトではコンピュータアカウントも検索されてしまいますので **-UsersOnly**オプションを指定して「ユーザーアカウントのみ抽出」します。**LastLogonDate**の値が最後にログインした日時になります。
``` powershell:2021/4/1以降ログインしていないユーザーアカウント抽出
Search-ADAccount -AccountInactive -DateTime "2021/04/01" -UsersOnly 

AccountExpirationDate :
DistinguishedName     : CN=渋谷 ハチ,OU=Users,DC=zzzz,DC=xxxxxx,DC=co,DC=jp
Enabled               : True
LastLogonDate         : 2017/10/29 9:08:41
LockedOut             : False
Name                  : 渋谷 ハチ
ObjectClass           : user
ObjectGUID            : dc418081-7399-4871-a37a-9531fd98c7e6
PasswordExpired       : False
PasswordNeverExpires  : True
SamAccountName        : Hachi_Shibuya
SID                   : S-1-5-21-1068026954-2132964742-485811574-1164
UserPrincipalName     : hachi_shibuya@zzzz.xxxxxx.co.jp

#　対象アカウントの数だけAccountExpirationDateからUserPrincipalName まで繰り返して表示
```
この後の作業を効率化するためPowerShellなんで出力形式をCSV形式にしたいと思います。**Export-Csv**コマンドレットで出力先ファイルを指定します。**-Encoding Default**オブションで文字コードをSJISに指定しないとExcelで開いた際に文字化けします。
``` powershell:2021/4/1以降ログインしていないユーザーアカウントをCSV形式でファイル出力(UserExport.csv)
Search-ADAccount -AccountInactive -DateTime "2021/04/01" -UsersOnly | Export-Csv -Path C:\temp\UserExport.csv -Encoding Default
``` 
以下のように**UserExport.csv**ファイルはExcelにきれいに取り込めAD棚卸しが行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526900/6447a506-9155-e29a-bec7-4f396253d4ba.png)
同様にコンピューターアカウントも**Search-ADAccount**コマンドレットを **-ComputersOnly**オプションを指定して実行します。
``` powershell:2021/4/1以降ログインしていないコンピューターアカウントをCSV形式でファイル出力(ComputersExport.csv)
Search-ADAccount -AccountInactive -DateTime "2021/04/01" -ComputersOnly | Export-Csv -Path C:\temp\ComputersExport.csv -Encoding Default
```
こちらは**ComputersExport.csv**ファイルです。**ObjectClass**の値が「computer」になっていることに注目してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526900/ff890f12-c43a-4a6b-4a40-caae2e3d5ff4.png)
後はExcelファイルをコピー&ペーストでお好みに加工してください。面倒なADアカウントの棚卸しもPowerShellならば**Search-ADAccount**と**Export-Csv**コマンドレットの組み合わせだけで済んでしまいます。

:::note warn
**ADモジュールのインポート**
**Search-ADAccount**を初回に実行する際にエラーが表示される場合PowerShellのADモジュールをインポートしていないことが多いです。**Import-Module**コマンドレットを実行してインポートしましょう！
``` powershell:
Import-Module ActiveDirectory
```
:::
# アカウントを無効化する
不要なアカウントが特定できたので削除となるのですが「本当に削除しても構わないか？」「削除後に思わぬトラブルが起きないか？」と不安が残ります。「ADのゴミ箱」機能もありますが制約もあるので、一定期間(例えば、1ヶ月、3ヶ月等)アカウントを無効化します。今度こそGUIツール(Active Directoryユーザーとコンピューターアカウント)登場と思いますよね。しかし、下図のプロパティパネルをご覧ください。左側が「ユーザーアカウント」右側が「コンピューターアカウント」になります。「ユーザーアカウント」には「**アカウントは無効**」のオプションがありますが「コンピュータアカウント」には該当するオプションがありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526900/967af730-b42a-4d72-13d1-eb24b9e59cb0.png)
ではどうするのか？GUIツール(Active Directoryユーザーとコンピューターアカウント)では対象のアカウントを右クリックすると表示される実行メニューに「アカウントを無効にする」を実行すれば良いのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526900/260f81ae-95c7-2eea-8bd8-7e96e0b2dcf1.png)
今回のお客様環境ではユーザーアカウントは約20個、コンピューターアカウントは約220個もありました。10個ぐらいならGUIをマウスでポチポチすれば良いですが...　流石に250個近くもポチポチはしたくない。そこで再びCUI(PowerShell)の出番です。
**Disable-ADAccount**コマンドレットは **-Identity**オプションで無効化したいユーザーアカウント(**SamAccountName**の値)指定します。
先程の例では無効化するユーザーアカウント「渋谷　ハチ」でしたSamAccountNameの値は「Hachi_Shibuya」の場合は以下の通りです。
``` powershell:ユーザーアカウントの無効化
Disable-ADAccount -Identity Hachi_Shibuya
```
コンピューターアカウント場合は **-Identity**オプションでADオブジェクトの識別名**DN名（DistinguishedName)** 書式を利用することで、無効化するコンピュータアカウントを指定します。DN名は”で囲みます。
``` powershell:コンピューターアカウントの無効化
Disable-ADAccount -Identity ”CN=Hachi_Shibuya-PC,CN=Computers,DC=zzzz,DC=xxxxxx,DC=co,DC=jp”
```
もうお気づきですね。先程、抽出した「UserExport.csv」の**SamAccountName**列の前に1列挿入して「Disable-ADAccount -Identity 」を追加します。「ComputersExport.csv」のDistinguishedName列の前1列、後ろに1列追加して「Disable-ADAccount -Identity ”」と「”」追加すれば**アカウント無効化スクリプト**の完成です。実行したら**Search-ADAccount**と**Export-Csv**コマンドレットの組み合わせを実行してください。**Enabled**の値が「TRUE」から「FALSE」へ変更されます。

# 一定期間が過ぎたら削除
アカウントを無効化してから一定期間が過ぎてアカウントが使えなくても支障が無いことを確認したらいよいよ削除します。
削除はGUIツール(Active Directoryユーザーとコンピューターアカウント)でも可能です。しかし、アカウントが配置されたOUが分散していたり250個近くのアカウントをポチポチは止めましょう。こちらもCUI(PowerShell)の**Remove-ADUser**と**Remove-ADComputer**コマンドレットで解決できます。
``` powershell:ユーザーアカウントの削除
Remove-ADUser  -Identity Hachi_Shibuya
```
``` powershell:コンピューターアカウントの削除
Remove-ADComputer -Identity ”CN=Hachi_Shibuya-PC,CN=Computers,DC=zzzz,DC=xxxxxx,DC=co,DC=jp”
```
実行したらSearch-ADAccountとExport-Csvコマンドレットの組み合わせを実行するなり、GUIツール(Active Directoryユーザーとコンピューターアカウント)ではアカウントが削除されていることを確認してください。
# 最後に
読んでいただいた方のお役に立てば幸いです。GUIツール(Active Directoryユーザーとコンピューターアカウント)では表示されない属性もCUI(PowerShell)から確認することができます。この記事を読んで興味を持っていただきCUI(PowerShell)推進派が増えることを祈ってます。

少しだけ自社のPRさせてください。ADアカウントと同様にファイルサーバーの不要なファイルの棚卸しをする場合、弊社の[**ZiDOMA data**](https://zidoma.com/)をお薦めします。ファイルやフォルダ数が多くなるにつれて ファイルの棚卸しが困難になって来るのは多くの管理者がお悩みの一つではないでしょうか？