PowerShellで複数のcsvファイルを読み込み、ADユーザのOU移動と無効化を行う

# やりたいこと
- 退職したADユーザーのOUを一括で移動
- 退職したADユーザーを無効化
- csvを読み込ませ、バッチでガツンと処理したい
 
## インプット
- csv形式で以下のようなログファイルが日次で出力されている
- ファイル名は「ADlog.日付」

| 更新区分       |    ID    |    名前    |
|:----------------:|:-----------------:|:------------------:|
|   1（新規）／2（変更）／3（削除）          |     user001      |        テスト太郎        |


---
それでは順を追ってスクリプト作成の経緯を以下に記します。
※実際の環境から固有名詞などを書き換えているので、
　どこかタイポがあったらすみません。

## まずはログファイルを１つのファイルにまとめる
- カレントディレクトリの「logs」フォルダ内にログファイルが大量に吐き出されている想定

```powershell

Get-Content .\logs\ADlog* > output.csv
```
## まとまったcsvファイルを読み込む

```powershell
Get-Content .\logs\ADlog* > output.csv
Import-Csv .\output.csv -Header 'FLG','ID','NAME'
```

## 更新区分が削除のものを抽出

```powershell

$DelFLG = 3

Get-Content .\logs\ADlog* > output.csv
Import-Csv .\output.csv -Header 'FLG','ID','NAME' |  Where-Object {$_.FLG -eq $DelFLG }
```

## Foreachで無効化・OU移動
- OUの移動はDN(distinguishedName)で指定しないといけないので、どうやってMove-ADObjectに渡そうか悩んでいたら、同じ悩みを持つ同士を発見。
[move users to a new OU, getting information from .csv file.](https://social.technet.microsoft.com/Forums/scriptcenter/en-US/dd9821b9-9c49-4d93-b5af-c79f927d724c/move-users-to-a-new-ou-getting-information-from-csv-file?forum=ITCG)

```powershell
$DelFLG = 3
$TargetOU = "OU=削除,DC=TESTAD,DC=local"

Get-Content .\logs\ADlog* > output.csv
Import-Csv .\output.csv -Header 'FLG','ID','NAME' |  Where-Object {$_.FLG -eq $DelFLG } | ForEach-Object {
    #無効化
    Set-ADUser -Identity $_.ID -Enabled $false
    
    #OU移動
    $UserDN = (Get-ADUser -Identity $_.ID).distinguishedName
    Move-ADObject -Identity $UserDN -TargetPath $TargetOU
}

```
## ここまででだいたい実装できたものの、以下の懸念

- 既に存在しないIDに対しての処理って気持ち悪くね？

## 既存ユーザー有無確認
以下をそのまま使わせてもらいました！
[PowershellでActiveDirectoryのユーザーを管理する](https://www.code-lab.net/?p=20868)

```powershell
$DelFLG = 3
$TargetOU = "OU=削除,DC=TESTAD,DC=local"

Get-Content .\logs\ADlog* > output.csv
Import-Csv .\output.csv -Header 'FLG','ID','NAME' |  Where-Object {$_.FLG -eq $DelFLG } | ForEach-Object {
    $existUser = $NULL
    $existUser = Get-ADUser -Identity $_.ID
    if ($existUser -eq $NULL)
        {
        #処理なし
        }
    else{
        #無効化
        Set-ADUser -Identity $_.ID -Enabled $false
    
        #OU移動
        $UserDN = (Get-ADUser -Identity $_.ID).distinguishedName
        Move-ADObject -Identity $UserDN -TargetPath $TargetOU
        }
}
```

## もう一声！

- デバッグ中、コンソールに出力される例外が多いと見づらくね？

## 完成

```powershell
$DelFLG = 3
$TargetOU = "OU=削除,DC=TESTAD,DC=local"

Get-Content .\logs\ADlog* > output.csv
Import-Csv .\output.csv -Header 'FLG','ID','NAME' |  Where-Object {$_.FLG -eq $DelFLG } | ForEach-Object {
    # コンソールのエラーを非表示にする
    $ErrorActionPreference = "silentlycontinue"

    $existUser = $NULL
    $existUser = Get-ADUser -Identity $_.ID

    # コンソールのエラーを再表示する
    $ErrorActionPreference = "continue"

    if ($existUser -eq $NULL)
        {
        #処理なし
        }
    else{
        #無効化
        Set-ADUser -Identity $_.ID -Enabled $false
    
        #OU移動
        $UserDN = (Get-ADUser -Identity $_.ID).distinguishedName
        Move-ADObject -Identity $UserDN -TargetPath $TargetOU
        }
}
```

## 参考
[PowerShell 関連～PowerShell でテキストデータを CSV として読み込んでデータベースっぽく操作するメモ～](http://inokara.hateblo.jp/entry/2016/02/20/200241)
[move users to a new OU, getting information from .csv file.](https://social.technet.microsoft.com/Forums/scriptcenter/en-US/dd9821b9-9c49-4d93-b5af-c79f927d724c/move-users-to-a-new-ou-getting-information-from-csv-file?forum=ITCG)
[PowershellでActiveDirectoryのユーザーを管理する](https://www.code-lab.net/?p=20868)
[PowerShellコンソールエラーを非表示にする方法](https://qiita.com/a-hiroyuki/items/8acb873de60f8e4976db)