Powershell スクリプトでローカル アカウントを削除する

Powershell スクリプトでローカル アカウントを削除する

Google 提供のこのスクリプトを見つけました。このスクリプトはすべてのローカル アカウントを削除しますが、Administrator、DefaultAccount、DevToolsUser、Guest、sshd、User、WDAGUtilityAccount は保持しておきたいです。誰か助けてくれませんか?

Function Remove-LocalUser
{
  <#
      .Synopsis
      This function deletes a local user 
      .Description
      This function deletes a local user
      .Example
      Remove-LocalUser -userName "ed" 
      Removes a new local user named ed. 
      .Parameter ComputerName
      The name of the computer upon which to delete the user
      .Parameter UserName
      The name of the user to delete
      .Notes
      NAME:  Remove-LocalUser
      AUTHOR: ed wilson, msft
      LASTEDIT: 06/29/2011 10:07:42
      KEYWORDS: Local Account Management, Users
      HSG: HSG-06-30-11
      .Link
      Http://www.ScriptingGuys.com/blog
      #Requires -Version 2.0
  #>
  [CmdletBinding()]
  Param(
    [Parameter(Position=0,
        Mandatory=$True,
      ValueFromPipeline=$True)]
    [string]$userName
  )
  $computerName = $env:ComputerName
  $User = [ADSI]"WinNT://$computerName"
  $user.Delete('user',$userName)
} #end function Remove-LocalUser

$localUsers = Get-WmiObject -Class Win32_UserAccount -Filter  "LocalAccount='True'" | Select-Object Name
foreach ($localUser in  $localUsers.Name){
  Write-Host $localUser
  Remove-LocalUser -userName $localUser
}

答え1

PowerShell には、ローカル ユーザー アカウントを管理するための組み込みコマンドレットがあるため、カスタム モジュールよりもこれらを優先する必要があります (PowerShell の十分に高いバージョンを実行している場合)。

$KeepUsers = "管理者"、"デフォルトアカウント"、"DevToolsユーザー"、"ゲスト"、"sshd"、"ユーザー"、"WDAGUtilityAccount"
Get-LocalUser | ? { $KeepUsers -notcontains $_.Name } | Remove-LocalUser

左から右へ:

  1. すべてのローカルユーザーを取得します。
  2. それをパイプしますWhere-Object(?はエイリアスです)。
  3. 配列にユーザー名が表示されないユーザーのみをフィルタリングします$KeepUsers
  4. 新しくフィルタリングされたユーザーをパイプしてRemove-LocalUser削除します。

答え2

これを試して:

Get-WMIObject -Class Win32_UserAccount -Filter "LocalAccount='True'" | Where-Object {$_.Name -notin @("Administrator", "DefaultAccount", "DevToolsUser", "Guest", "sshd", "User", "WDAGUtilityAccount")} | Foreach {net user "$_.Name" /delete}
  • まず、WMI を通じてすべてのローカル ユーザー アカウントを一覧表示します。
  • 次に、Where-Object フィルターを使用して、保持するユーザー アカウントを除外します。
  • 次に、オブジェクトを Foreach ブロックに渡します。
  • 次に、 を使用してユーザー アカウントを削除しますnet user

脚注

  • このスクリプトは管理者権限で実行する必要があります。
  • 削除対象としてマークされないユーザー アカウントからこれを行う必要があります。

答え3

PowerShellGallery.com には、まさにこのユースケース専用の PowerShell モジュールがあります。

Find-Module -Name '*localuser*' | Format-Table -AutoSize
# Results
<#
Version Name                Repository Description                                                   
------- ----                ---------- -----------                                                   
3.0     LocalUserManagement PSGallery  a module that performs various local user management functions
#>

PowerShell v5x および PowerShell Core6x 以上。

Get-Command -Name '*localuser*' | Format-Table -Autosize
# Results
<#
CommandType Name              Version Source                            
----------- ----              ------- ------                            
Cmdlet      Disable-LocalUser 1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      Enable-LocalUser  1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      Get-LocalUser     1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      New-LocalUser     1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      Remove-LocalUser  1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      Rename-LocalUser  1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      Set-LocalUser     1.0.0.0 Microsoft.PowerShell.LocalAccounts
#>

だからこうすればいいんです...

Get-LocalUser | 
Where Name -NotMatch 'Administrator|DefaultAccount|Guest|WDAGUtilityAccount'

Remove コマンドレットでも同じことができます。

答え4

ローカル アカウントの削除は 1 つのタスクのように思えますが、少なくとも次の 3 つの手順で構成されます。

  1. ローカルアカウントデータベースからアカウントを削除する
  2. このアカウントのプロファイルディレクトリを削除します
  3. レジストリからアカウントプロファイルを削除する

さらに多くの手順があるかもしれませんが、今のところそれらに関するドキュメントは見つかりませんでした。実行する手順が複数あるため、そのためにあまりにアトミックな関数を使用するのはおそらくよくありません。Remove-LocalUserコマンドレットとnetツール ( を使用net user <username> /delete) は、そのようなアトミックな関数です。これらは、ローカル ユーザーを削除することを提案しますが、これは良いように思えますが、実際には、ローカル ユーザー アカウント データベースからユーザーを削除するだけです。これは、いくつかのシナリオでは十分かもしれませんが、レジストリ キーとプロファイル ディレクトリは残ることに注意してください。

Microsoftはローカルユーザーアカウントを完全に削除するマクロ機能を提供していますが、残念ながらGUIのみです。設定 > アカウント > 家族とその他のユーザーユーザーを選択してクリックするだけです取り除く、その後アカウントとデータを削除するこれにより、上記の 3 つの手順がすべて実行されます。

ユーザーのプロフィールを削除するマクロ機能もあります。コントロール パネル > システム > システムの詳細設定 > 設定...(ボタンユーザープロファイルパネル):

ここに画像の説明を入力してください

管理者権限の PowerShell で実行して、このウィンドウを直接開くこともできますrundll32 sysdm.cpl,EditUserProfiles。自分のアカウントだけでなく、すべてのユーザー アカウントを表示するには、このウィンドウを管理者権限で開くことが重要です (GUI 経由で開く場合も含む)。

このウィンドウからユーザー アカウントを削除すると、上記の手順 2 と 3 が実行されます。

Remove-LocalUser2 つの不明なアカウントとは何でしょうか? これらは、コマンドレットによって 1 つ削除され、ツールによって 1 つ削除された 2 つの削除されたアカウントの残りですnet

PowerShell ソリューションをお探しの場合は、PowerShell がすべての作業を一度に実行するコマンドレットを提供しない限り、少なくとも上記の 3 つの手順を手動で実行できます。

function Remove-LocalUserCompletely {

    Param(
        [Parameter(ValueFromPipelineByPropertyName)]
        $Name
    )

    process {
        $user = Get-LocalUser -Name $Name -ErrorAction Stop

        # Remove the user from the account database
        Remove-LocalUser -SID $user.SID

        # Remove the profile of the user (both, profile directory and profile in the registry)
        Get-CimInstance -Class Win32_UserProfile | ? SID -eq $user.SID | Remove-CimInstance
    }
}

# Example usage:
Remove-LocalUserCompletely -Name 'myuser'

この関数はパイプラインで使用できる状態になっているため、次のようにして保持したいユーザーを除くすべてのユーザーを削除できます。

Get-LocalUser | ? Name -NotIn Administrator, DefaultAccount, DevToolsUser, Guest, sshd, User, WDAGUtilityAccount | Remove-LocalUserCompletely

Get-LocalUserしかし、現在 (PS v5.1.18362.752)との間のパイプラインにRemove-LocalUserバグがあり、上記の関数にも影響します。次のパイプライン ( なしRemove-LocalUserCompletely) は、削除する必要があるアカウントのアカウント データベースから、2 つおきのユーザー アカウントのみを削除します。

Get-LocalUser | ? Name -NotIn Administrator, DefaultAccount, DevToolsUser, Guest, sshd, User, WDAGUtilityAccount | Remove-LocalUser

パイプラインの代わりにループを使用することで、この問題を回避できます (現在は を使用Remove-LocalUserCompletely)。

$users = Get-LocalUser | ? Name -NotIn Administrator, DefaultAccount, DevToolsUser, Guest, sshd, User, WDAGUtilityAccount
foreach ($user in $users) {
    Remove-LocalUserCompletely -Name $user.Name
}

関連情報