Windows　権限グループ 備忘録

### すべてのファイルおよびフォルダーのパスを取得する方法

指定したディレクトリおよびそのサブディレクトリ内のすべてのファイルとフォルダーのパスを取得し、テキストファイルに保存する方法を説明します。

#### 方法 1：コマンドプロンプト（CMD）を使用

1. コマンドプロンプトウィンドウを開きます。
2. 次のコマンドを実行します：

   ```cmd
   dir "C:\path\to\folder" /s /b > "C:\path\to\filelist.txt"
   ```

   **説明：**
   - **`dir`**：ディレクトリの内容をリストします。
   - **`"C:\path\to\folder"`**：パスを取得する対象のディレクトリです。実際のディレクトリパスに置き換えてください。
   - **`/s`**：すべてのサブディレクトリとファイルを再帰的にリストします。
   - **`/b`**：ファイルパスを簡潔な形式でリストします（追加情報は含まれません）。
   - **`> "C:\path\to\filelist.txt"`**：出力結果を `filelist.txt` ファイルにリダイレクトします。

#### 方法 2：PowerShell を使用

1. PowerShell ウィンドウを開きます。
2. 次のスクリプトを実行します：

   ```powershell
   Get-ChildItem "C:\path\to\folder" -Recurse | Select-Object -ExpandProperty FullName | Out-File "C:\path\to\filelist.txt"
   ```

   **説明：**
   - **`Get-ChildItem "C:\path\to\folder" -Recurse`**：指定したディレクトリおよびすべてのサブディレクトリ内のすべてのファイルとフォルダーを取得します。
   - **`Select-Object -ExpandProperty FullName`**：各ファイルまたはフォルダーの完全なパスを抽出します。
   - **`Out-File "C:\path\to\filelist.txt"`**：結果を `filelist.txt` ファイルに保存します。

---

### `icacls` コマンドによる権限変更

**コマンド例：**

```bash
icacls "C:\path\to\folder" /deny UserA:(W) /grant:r NewGroupName:(F) /T /C
```

**詳細説明：**
- **`icacls`**：ファイルとフォルダーの権限を変更するコマンドラインツール。
- **`"C:\path\to\folder"`**：権限を変更する対象のフォルダーのパスです。実際のパスに置き換えてください。
- **`/deny UserA:(W)`**：
  - **`/deny`**：指定したユーザーの権限を明示的に拒否します。
  - **`UserA`**：権限を拒否するユーザー名。
  - **`(W)`**：書き込み権限を拒否します。
- **`/grant:r NewGroupName:(F)`**：
  - **`/grant:r`**：指定したユーザーグループに権限を再付与します。`:r` は既存の権限をリセットして再付与することを示します。
  - **`NewGroupName`**：新しいユーザーグループの名前。
  - **`(F)`**：完全な制御権限を付与します。
- **`/T`**：すべてのサブフォルダーとファイルに権限を再帰的に適用します。
- **`/C`**：エラーを無視して処理を続行します。

---

### PowerShell スクリプトによるファイルとフォルダーの権限をバッチ処理する方法

**スクリプト例：**

```powershell
# ファイルリストを読み込み、ファイルパスを変数 $files に保存
$files = Get-Content "C:\path\to\filelist.txt"

# バッチ処理するファイルの数を設定。5000は1回の処理で5000個のファイルまたはフォルダーを処理することを意味します
$batchSize = 5000

# インデックスを初期化し、現在のバッチの開始位置を示す
$index = 0

# while ループでファイルをバッチ処理し、すべてのファイルを処理するまで繰り返す
while ($index -lt $files.Count) {

    # 現在のバッチのファイル範囲を計算
    # [math]::Min() を使用してファイルの総数を超えないようにします
    $batch = $files[$index..([math]::Min($index + $batchSize - 1, $files.Count - 1))]

    # 現在のバッチの各ファイルを処理
    foreach ($file in $batch) {
        # icacls を使用してファイルの権限を変更し、新しいユーザーグループに完全な制御権限を付与
        icacls $file /grant:r NewGroupName:(F) /T /C
    }

    # インデックスを更新し、次のバッチの開始位置に移動
    $index += $batchSize

    # システム負荷を軽減し、処理速度が速すぎてシステム応答に影響を与えないように、5秒間待機
    Start-Sleep -Seconds 5
}
```

**詳細説明：**
1. **`$files = Get-Content "C:\path\to\filelist.txt"`**：
   - **`Get-Content`**：ファイルリストを読み込み、変数 `$files` に保存します。
   - **`"C:\path\to\filelist.txt"`**：すべてのファイルとフォルダーのパスを含むテキストファイルです。
2. **`$batchSize = 5000`**：1回のバッチ処理で扱うファイルの数。システムの性能に応じて調整できます。
3. **`$index = 0`**：インデックスを初期化し、現在のバッチの開始位置を示します。
4. **`while ($index -lt $files.Count)`**：ファイルリスト内の各バッチを処理するループです。
5. **`$batch = $files[$index..([math]::Min($index + $batchSize - 1, $files.Count - 1))]`**：現在のバッチのファイル範囲を計算します。
6. **`foreach ($file in $batch)`**：現在のバッチ内の各ファイルを処理します。
7. **`icacls $file /grant:r NewGroupName:(F) /T /C`**：ファイルの権限を変更し、すべてのサブアイテムに再帰的に適用します。
8. **`$index += $batchSize`**：インデックスを更新し、次のバッチを処理します。
9. **`Start-Sleep -Seconds 5`**：各バッチ処理後に5秒間待機し、システム負荷を軽減します。

---

### 権限の継承に関する注意事項

1. **権限の継承**：`icacls` はファイルおよびフォルダーの権限の継承関係を自動的に処理します。`/T` オプションにより、すべてのサブアイテムに権限が再帰的に適用されます。
2. **継承設定の確認**：権限を変更する前に、対象フォルダーの継承設定が期待通りであることを確認してください。
3. **テスト**：大規模な操作を行う前に、小規模な範囲でスクリプトをテストし、権限変更が予期した通りに行われることを確認してください。

以上のコマンドとスクリプトを使用することで、すべてのファイルとフォルダーのパスを取得し、権限を効率的に変更することができます。