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
左から右へ:
- すべてのローカルユーザーを取得します。
- それをパイプします
Where-Object
(?
はエイリアスです)。 - 配列にユーザー名が表示されないユーザーのみをフィルタリングします
$KeepUsers
。 - 新しくフィルタリングされたユーザーをパイプして
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 つの手順で構成されます。
- ローカルアカウントデータベースからアカウントを削除する
- このアカウントのプロファイルディレクトリを削除します
- レジストリからアカウントプロファイルを削除する
さらに多くの手順があるかもしれませんが、今のところそれらに関するドキュメントは見つかりませんでした。実行する手順が複数あるため、そのためにあまりにアトミックな関数を使用するのはおそらくよくありません。Remove-LocalUser
コマンドレットとnet
ツール ( を使用net user <username> /delete
) は、そのようなアトミックな関数です。これらは、ローカル ユーザーを削除することを提案しますが、これは良いように思えますが、実際には、ローカル ユーザー アカウント データベースからユーザーを削除するだけです。これは、いくつかのシナリオでは十分かもしれませんが、レジストリ キーとプロファイル ディレクトリは残ることに注意してください。
Microsoftはローカルユーザーアカウントを完全に削除するマクロ機能を提供していますが、残念ながらGUIのみです。設定 > アカウント > 家族とその他のユーザーユーザーを選択してクリックするだけです取り除く、その後アカウントとデータを削除するこれにより、上記の 3 つの手順がすべて実行されます。
ユーザーのプロフィールを削除するマクロ機能もあります。コントロール パネル > システム > システムの詳細設定 > 設定...(ボタンユーザープロファイルパネル):
管理者権限の PowerShell で実行して、このウィンドウを直接開くこともできますrundll32 sysdm.cpl,EditUserProfiles
。自分のアカウントだけでなく、すべてのユーザー アカウントを表示するには、このウィンドウを管理者権限で開くことが重要です (GUI 経由で開く場合も含む)。
このウィンドウからユーザー アカウントを削除すると、上記の手順 2 と 3 が実行されます。
Remove-LocalUser
2 つの不明なアカウントとは何でしょうか? これらは、コマンドレットによって 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
}