PowerShellで複数のCSVファイルを取り込んでセキュリティグループを付与する

 複数のCSVファイルを取り込み、各セキュリティグループを付与する際の方法です。
 CSVファイルごとに付与したいセキュリティグループが異なるため、色々と漁ってましたが「これだ！」という記事に出会えず今回自分用にまとめました。
 
* * *
 処理の流れ：
 ①CSVのファイルパスを変数へ代入
 ②セキュリティグループのOU情報を変数へ代入
 ③ハッシュテーブルを作成
 ④foreach文を利用してユーザを取り出す
 ⑤セキュリティグループを付与する



## ①CSVのファイルパスを変数へ代入
まずは　`$変数 = ”CSVのファイルパス”`　でCSVのファイルパスを代入します。
今回は複数のCSVファイルの配列化なので、３つ指定します。

```PowerShell:test.sh
$test1UserCsv = "D:users/test1_Users.csv"
$test2UserCsv = "D:users/test2_Users.csv"
$test3UserCsv = "D:users/test3_Users.csv"
```

## ②セキュリティグループのOU情報を変数へ代入
次にセキュリティグループのOU情報も①と同様に変数に代入していきます。
３つのCSVファイルにそれぞれ異なるセキュリティグループを付与したいため、セキュリティグループも３つ用意します。

```PowerShell:test.sh
$OuPath = "OU=testグループ OU,OU=グループ OU,DC=marui,DC=local"
$test1GroupName = "CN=test1,$OuPath"
$test2GroupName = "CN=test2,$OuPath"
$test3GroupName = "CN=test3,$OuPath"
```
OU情報を`$OuPath`に代入することで、すっきりとしたコードになります。
（ドメイン名は適当にmaruiにしています、適宜指定のドメイン名に変換ください）

## ③ハッシュテーブルを作成
ハッシュテーブルを使い、各セキュリティグループごとにユーザリスト（CSVファイル）を紐付けします。これをしないと付与したいユーザに付与したいセキュリティグループを付与できないため重要です。
[ハッシュテーブルについて](https://x.gd/4XcsI)は適宜参考サイトをご参照ください。

```PowerShell:test.sh
$GroupMappings = @{
    $test1GroupName = $test1UserCsv
    $test2GroupName = $test2UserCsv
    $test3GroupName = $test3UserCsv
}
```
`$test1GroupName`には`$test1UserCsv`を紐づけたいため「＝」で紐付けます。
他のセキュリティグループも同様に紐付けを行います。

## ④foreach文を利用してユーザを取り出す
各グループからユーザ情報を取り出していきます。foreach文を使うことでハッシュテーブルからユーザ情報を取得することが可能になります。
[foreach文について](https://x.gd/s1yBQ)は適宜参考サイトをご参照ください。

```PowerShell:test.sh
foreach ($Group in $GroupMappings.Keys){
    $UserListCsv = $GroupMappings[$Group]
    $Users = Import-Csv -Path $UserListCsv
}
```
下記にて、説明していきます。
```PowerShell:解説１
foreach ($Group in $GroupMappings.Keys){
```
`$GroupMappings`に`.Keys`を指定するとハッシュテーブル$GroupMappingsからキーを取り出すことができます。ハッシュテーブルはキーと値で構成されており、左側がキー／右側が値となります。
```PowerShell:
$GroupMappings = @{
    #   ▼キー　　　　　　　　▼値
    $test1GroupName = $test1UserCsv
    $test2GroupName = $test2UserCsv
    $test3GroupName = $test3UserCsv
}
```
そのため、`$GroupMappings.Keys`と指定するとキーが取得できます。それを`$Group`に１つずつ代入しています。
```PowerShell:解説２
$UserListCsv = $GroupMappings[$Group]
```
取得したキーを使用し、今度は値を取得しています。そして、取得した値を`$UserListCsv`に代入しています。値の取得方法は`ハッシュテーブル名.キー名`です。
そのため、`$GroupMappings[$Group]`は`$GroupMappings[$test1GroupName]`ということになり`$test1UserCsv`が取得されるということです。
```PowerShell:解説３
$Users = Import-Csv -Path $UserListCsv
```
取得した値をもとにCSVファイルをインポートします。インポート方法は`Import-Csv -Path CSVのファイルパス`です。そのため、解説２で取得した値が入った変数を指定しています。

## ⑤セキュリティグループを付与する
最後にセキュリティグループを付与します。foreach文の中にforeach文を追記して使用します。

```PowerShell:test.sh
foreach ($Group in $GroupMappings.Keys){
    $UserListCsv = $GroupMappings[$Group]
    $Users = Import-Csv -Path $UserListCsv

    foreach ($User in $Users){
        try{
            Add-ADGroupMember -Identity $group -Members $User.UserName
        }
        catch{
            Write-Output "処理できませんでした" > error.log
        }
    }
}
```
下記にて、説明していきます。
```PowerShell:解説１
foreach ($User in $Users){
```
取得したユーザリストをforeach文を使って一人ずつ取り出し、`$User`に代入しています。
```PowerShell:解説２
try{
    Add-ADGroupMember -Identity $group -Members $User.UserName
}
catch{
      Write-Output "処理できませんでした" > error.log
}
```
Try文に実行したい処理を記述します。`ADGroupMember`コマンドを使用してセキュリティグループを付与しています。ユーザを指定する場合は`$User.UserName`とします。`.UserName`を付けることでユーザIDを取得できます。
ついでにCatch文も記載しています。Catch文にはエラーが発生した場合の処理を記述します。今回はメッセージをログとして吐き出すことにしています。（ログを吐き出すパスの指定やもろもろ記述が必要ですが、この記事では省略します）

これで複数のCSVファイルを取り込んでセキュリティグループを付与する内容は以上です。
認識齟齬等あればご指摘いただけますと幸いです。

最後の最後に、全コードをまとめて記載しておきます。
```PowerShell:test.sh
#CSVのファイルパスを格納
$test1UserCsv = "D:users/test1_Users.csv"
$test2UserCsv = "D:users/test2_Users.csv"
$test3UserCsv = "D:users/test3_Users.csv"

#セキュリティグループのOU情報を格納
$OuPath = "OU=testグループ OU,OU=グループ OU,DC=marui,DC=local"
$test1GroupName = "CN=test1,$OuPath"
$test2GroupName = "CN=test2,$OuPath"
$test3GroupName = "CN=test3,$OuPath"

#ユーザリストとセキュリティグループの紐付け
$GroupMappings = @{
    $test1GroupName = $test1UserCsv
    $test2GroupName = $test2UserCsv
    $test3GroupName = $test3UserCsv
}

#CSVファイルをインポート
foreach ($Group in $GroupMappings.Keys){
    $UserListCsv = $GroupMappings[$Group]
    $Users = Import-Csv -Path $UserListCsv

    #ユーザを取り出しセキュリティグループを付与
    foreach ($User in $Users){
        try{
            Add-ADGroupMember -Identity $group -Members $User.UserName
        }
        catch{
            Write-Output "処理できませんでした" > error.log
        }
    }
}
```


## 参照サイト

https://learn.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-hashtable?view=powershell-7.5

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_foreach?view=powershell-7.5

https://www.pageone.ne.jp/blog/notes/powershell%E3%81%A7%E3%81%AEtry-catch%E6%A7%8B%E6%96%87%EF%BC%88%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AA%E3%83%B3%E3%82%B0%EF%BC%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/