0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者】PowerShell_ユーザープロファイル一括削除

0
Posted at

現状

弊組織では、なぜか定期的に発生する「ユーザープロファイル削除祭り」に悩まされています。

原因はシンプルで、SSDの容量不足。(お金の都合でスペック上げられない😣)
問い合わせ対応を行う職員が多数いる環境のため、気づけばPCのストレージがパンパンになっています。

「容量不足です」(しょうがない🥺)
「PCが重いです」(容量逼迫でまぁわかる)
「お昼までに削除をお願いします」(削除するだけ感謝しろ🤥)

この問い合わせが来るたびに、せっせとユーザープロファイルを削除する日々……。
ただ、GUIからポチポチ削除していると意外と時間がかかります。

しかも社内SEあるあるですが、別の問い合わせ対応や作業を並行していると、
RDP接続した対象PCにおいて、
「あれ?削除する予定だったPCどれだっけ?」
となり、気づけば後回し。
結果、またストレージ不足になるという無限ループに突入します😇

さらに厄介なのが、

「このユーザープロファイル、本当に消していいやつ?」
「PCが重すぎて削除画面までたどり着けない」

というケース。

そんな状況に頭を抱えていたある日、試しにCopilotへ相談してみました。
すると……「これ使えるじゃん!」

というコマンドを生成してくれました。

今回は、そのコマンドを紹介したいと思います。

(すでに知っている方には初歩的な内容かもしれませんが、同じようにユーザープロファイル削除に追われている方の助けになれば幸いです💦)

Power Shell(管理者権限)

# 除外するユーザー(ユーザーID)
$exclude = @(
    "00000001",
    "00000002"
)

Get-CimInstance Win32_UserProfile |
Where-Object {
    $_.LocalPath -match 'C:\\Users\\([0-9]{8})$'
} |
ForEach-Object {
    $username = ($_.LocalPath -replace '^.*\\', '')

    # 除外対象チェック
    if ($exclude -contains $username) {
        Write-Host "Skip (excluded): " $username
    }
    else {
        # SIDからドメイン付きアカウント取得
        try {
            $account = (New-Object System.Security.Principal.SecurityIdentifier($_.SID)).
                Translate([System.Security.Principal.NTAccount]).Value
        } catch {
            $account = ""
        }

        # jafintra ドメイン判定
        if ($account -match '^jafintra\\([0-9]{8})$') {
            Write-Host "Deleting: " $account " (" $_.LocalPath ")"

            # 削除実行
            #Remove-CimInstance $_
        }
        else {
            Write-Host "Skip (not target): " $_.LocalPath
        }
    }
}

上記コマンドで
・「#Remove-CimInstance $_」の#を外せばすぐ削除が可能

・$exclude = @(
"00000001", ⇦消したくないユーザーIDを入れる

PowerShell(管理者)再起動付き

# 管理者権限での実行を強制する(プロファイル削除に必要なため)
#Requires -RunAsAdministrator

# 除外するユーザー(8桁番号のみ)
$exclude = @(
    "00000001",
    "83473918"
)

Get-CimInstance Win32_UserProfile |
Where-Object {
    # 正規表現のバックスラッシュエスケープを修正(4つ重ねる、または [\\] を使用)
    $_.LocalPath -match 'C:\\\\Users\\\\([0-9]{8})$'
} |
ForEach-Object {
    # ユーザー名の切り出し(Splitメソッドを使う方が安全で確実です)
    $username = $_.LocalPath.Split('\')[-1]

    # 除外対象チェック
    if ($exclude -contains $username) {
        Write-Host "Skip (excluded): $username" -ForegroundColor Yellow
    }
    else {
        # SIDからドメイン付きアカウント取得
        try {
            # 改行をなくし、1行に修正
            $account = (New-Object System.Security.Principal.SecurityIdentifier($_.SID)).Translate([System.Security.Principal.NTAccount]).Value
        } catch {
            $account = ""
        }

        # jafintra ドメイン判定(こちらもバックスラッシュを4つに修正)
        if ($account -match '^jafintra\\\\([0-9]{8})$') {
            Write-Host "Deleting: $account ($($_.LocalPath))" -ForegroundColor Cyan

            # 削除実行(本番時はコメントアウトを外してください)
            # Remove-CimInstance $_
        }
        else {
            Write-Host "Skip (not target): $($_.LocalPath)"
        }
    }
}

# すべての処理が終わった後に再起動(テスト時はコメントアウトを推奨)
Write-Host "All tasks completed. Restarting computer..." -ForegroundColor Green
# Restart-Computer -Force

上記コマンドで
・「# Remove-CimInstance $_」の#を外せばすぐ削除が可能

・「# Restart-Computer -Force」のの#を外せば再起動が可能

まとめ今回は、社内SE・情シス業務で役立つちょっとしたテクニックをご紹介しました。

社内のセキュリティポリシーによっては、BATファイルの実行制限や管理者権限を必要とする作業の制約があるため、環境によっては利用できない場合もありますが、参考になれば幸いです☺️

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?