Active Directory ユーザ(と移動フォルダなども一緒に)削除スクリプト


Active Directory のユーザと、移動プロファイルなどの関連するフォルダを併せて削除する用の PowerShell スクリプト を作成したので、その記録です。

以前の備忘録(ADユーザーの一括登録 その②) と対に作成したものです。

 


前回のADユーザ登録スクリプトでは .csv を読み込み 一括でユーザ作成するタイプでしたが、今回はユーザーのID( ↓ Name の部分)を入力して、1ユーザづつ削除するタイプのスクリプトにしてます。

 


 

ADユーザを削除する PowerShell スクリプト(.ps1)と、それを実行する用のショートカット(.ps1 を直接実行してもよいのですが、処理結果が流れてしまうので、-noexit で実行する) を 「C:\11.AD_User_Delete」 に設置。

 

ファイル 「01.~ 」 の ショートカットのリンク先は以下のようになってます。

 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit C:\11.AD_User_Delete\11.AD-User-Delete.ps1

 


この 「01. ~」 を右クリックして 「管理者として実行」 すると、

↑ こんなふうにユーザIDの入力を求められるので、IDを入力すると削除処理が実行されます。
(個人フォルダ、移動プロファイル/フォルダリダイレクト ともに、ユーザIDから始まるフォルダ名になっているので、ここで入力された値をキーに削除処理を実行してます。)

 

削除の .ps1 の中身は以下です。
移動プロファイルの削除方法やパスなどはスクリプト内からご確認を。 ><

<###
 
    このスクリプトについて:
    
    ADユーザと関連するディレクトリを削除するスクリプトです。
 
    STEP001: 削除するユーザーのIDを入力。
    STEP002: 個人フォルダ、移動プロファイル、フォルダリダイレクト を削除
 
    【更新履歴】
    2016.10.21   新規作成   o'miz
 
###>
 
 
<###
    STEP 001. ADユーザ名の入力と該当ユーザの削除
###>
 
### ユーザ名の入力
$DeleteADUser = Read-Host "削除するユーザのIDを入力してください"
 
### 入力されたユーザーの存在確認。最初にNULLを代入しておく。一致するユーザがいたらそのIDを代入。
$ExistUser = $NULL
$ExistUser = Get-ADUser $DeleteADUser
 
### ユーザーIDが存在しなかった場合(NULL のままだったら)
if ($ExistUser -eq $NULL)
{
    Write-Warning "存在しないユーザIDです。 処理を中断します。"
    exit
 
### 存在した場合(NULLでなかったら)は Remove-ADUser を実行
}
else
{
    Write-Host ...
    Write-Host ...
    ### 削除の最終確認。
    $DeleteChoice = Read-Host "削除してよろしいですか?(y/n)"

    ### y or n で処理を分岐。(ちなみに Switch は 大文字/小文字を区別しません)
    Switch ($DeleteChoice) 
    {
        ### y が入力されたら削除を実行
        "y" 
        {
            Get-ADUser $DeleteADUser |
            Remove-ADUser -Confirm:$false
            
            Write-Host ...
            Write-Host ...
            Write-Host "$DeleteADUser を削除しました。" -ForegroundColor Cyan
            Write-Host "続いて個人フォルダとユーザープロファイルを削除します。" -ForegroundColor Cyan
        }
        ### n だったら処理を中止。
        "n" 
        {
            Write-Host ...
            Write-Host ...
            Write-Error "処理を中止します。"
            Exit
        }
        ### 上記以外の入力だったら。
        default
        {
            Write-Host ...
            Write-Host ...
            Write-Host "y / n のどちらでもないため、処理を中断します。"
            Exit        
        }
    }
}
 
 
 
<###
    STEP 002. 個人フォルダ、フォルダーリダイレクト、移動ユーザプロファイル の削除
###>
 
 
<### 
    STEP002-1. 個人フォルダの削除
###>

### 個人フォルダのパスを指定
$DeletePrivateFolder = "\\hogehoge.local\share\個人用フォルダ\$DeleteADUser"
 
### 個人フォルダが存在していたら Try を実行
if (Test-Path -Path $DeletePrivateFolder*) 
{
    ### 個人フォルダを Remove-Item
    Try 
    {
        Write-Host ...
        Write-Host ...
        Write-Host "個人フォルダ $DeletePrivateFolder を削除します。" -ForegroundColor Cyan
     
        Remove-Item $DeletePrivateFolder* -Recurse -Force -ErrorAction Stop

    ### 個人フォルダの Remove-Item に例外が発生したら Catch を実行 
    }
    Catch
    {
        Write-Host ...
        Write-Warning "個人フォルダ $DeletePrivateFolder の削除に失敗しました。"
        ### 直前に発生した例外($Error[0])を表示
        Write-Host $Error -ForegroundColor Red
        Write-Host "手動で個人フォルダを削除してください。"
    }
 
### 個人フォルダが存在していなかったら。
}
else
{
    Write-Warning "個人フォルダが見つかりません。"
    Write-Warning "手動でフォルダ検索と削除を実行してください。"
    Write-Host "続行するには何かキーを押してください..."
    [Console]::ReadKey() |
    Out-Null
 
}
 

<### 
    STEP002-2. 移動プロファイルの削除
###>

### 移動プロファイルのパスを指定
$DeleteUserProfile = "\\hogehoge.local\UserProfiles$\$DeleteADUser"+".V2"
 
### 移動プロファイルが存在していたら Try を実行
if (Test-Path -Path $DeleteUserProfile) 
{
    ### 移動プロファイルの所有権を Administrator にしてから Remove-Item
    Try 
    {
        Write-Host ...
        Write-Host ...
        Write-Host ("ユーザーの移動プロファイル $DeleteUserProfile を削除します。")  -ForegroundColor Cyan
 
        ### フォルダの所有権をAdministratorに変更
        ### takeown /f $DeleteUserProfile /a /r /d Y
        $Cmd_Takeown01 = "takeown.exe"
        $Args_Takeown01 = "/f $DeleteUserProfile /a /r /d Y"
        ### -Wait でコマンドの終了を待つ
        Start-Process $Cmd_Takeown01 $Args_Takeown01 -Wait

        ### Administrator にアクセス権を付与
        ### icacls $DeleteUserProfile /grant Administrators:F /t
        $Cmd_icacls01 = "icacls.exe"
        $Args_icacls01 = "$DeleteUserProfile /grant Administrators:F /t"
        ### -Wait でコマンドの終了を待つ
        Start-Process $Cmd_icacls01 $Args_icacls01 -Wait
 
        Remove-Item $DeleteUserProfile -Recurse -Force -ErrorAction Stop
     
    ### 移動プロファイルの Remove-Item で例外が出たら Catch を実行
    }
    Catch
    {
        Write-Host ...
        Write-Warning "ユーザーの移動プロファイル $DeleteUserProfile の削除に失敗しました。"
        ### 直前に発生した例外($Error[0])を表示
        Write-Host $Error -ForegroundColor Red
        Write-Host "手動で削除してください。"
        Write-Host "続行するには何かキーを押してください..."
        [Console]::ReadKey() |
        Out-Null
    }  
}
else
{
    Write-Warning "移動プロファイルが見つかりませんでした。 手動でフォルダ検索と削除を実行してください。"
    Write-Host "続行するには何かキーを押してください..."
    [Console]::ReadKey() |
    Out-Null
 
}
 
 
<### 
    STEP002-3. フォルダリダイレクトの削除
###>

### フォルダリダイレクトのパスを指定
$DeleteFolderRidirect = "\\hogehoge.local\FolderRedirect$\$DeleteADUser"
 
### フォルダリダイレクトが存在していたら Try を実行
if (Test-Path -Path $DeleteFolderRidirect) 
{
    ### Administrator に所有させてから Remove-Item
    Try 
    {
        Write-host ...
        Write-host ...
        Write-host ("ユーザーのプロファイル(フォルダリダイレクト) $DeleteFolderRidirect を削除します。") -ForegroundColor Cyan
 
        ### フォルダの所有権をAdministratorに変更
        ### takeown /f $DeleteFolderRidirect /a /r /d Y
        $Cmd_Takeown02 = "takeown.exe"
        $Args_Takeown02 = "/f $DeleteFolderRidirect /a /r /d Y"
        Start-Process $Cmd_Takeown02 $Args_Takeown02 -Wait

        ### Administrator にアクセス権を付与
        ### icacls $DeleteFolderRidirect /grant Administrators:F /t
        $Cmd_icacls02 = "icacls.exe"
        $Args_icacls02 = "$DeleteFolderRidirect /grant Administrators:F /t"
        Start-Process $Cmd_icacls02 $Args_icacls02 -Wait
 
        Remove-Item $DeleteFolderRidirect -Recurse -Force -ErrorAction Stop
 
    ### Remove-Item で例外が発生したら Catch を実行
    }
    Catch
    {
        Write-Host ...
        Write-Warning "ユーザーのプロファイル(フォルダリダイレクト) $DeleteFolderRidirect の削除に失敗しました。"
        ### 直前に発生した例外($Error[0])を表示
        Write-Host $Error -ForegroundColor Red
        Write-Host "手動で削除してください。"
        Write-Host "続行するには何かキーを押してください..."
        [Console]::ReadKey() |
        Out-Null
    }
}
else
{
    Write-Warning "フォルダリダイレクトが見つかりませんでした。手動でフォルダ検索と削除を実行してください。"
    Write-Host "続行するには何かキーを押してください..."
    [Console]::ReadKey() |
    Out-Null
}

 

今回の備忘録は以上です。