我发现这个由 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 具有用于管理本地用户帐户的内置 cmdlet,因此应该优先于自定义模块(前提是您运行的是足够高版本的 PowerShell):
$KeepUsers = “管理员”、“默认帐户”、“DevToolsUser”、“访客”、“sshd”、“用户”、“WDAGUtilityAccount” 获取本地用户 | ? { $KeepUsers -notcontains $_.Name } | 删除本地用户
从左到右:
- 获取所有本地用户。
- 将其通过管道传输到
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 cmdlet 执行相同的操作。
答案4
删除本地帐户听起来像是一项任务,但它至少包含以下三个步骤:
- 从本地帐户数据库中删除该帐户
- 删除此账户的配置文件目录
- 从注册表中删除帐户配置文件
可能还有更多步骤,但到目前为止我还没有找到任何相关文档。由于要执行多个步骤,因此使用过于原子化的函数可能不是一个好主意。cmdletRemove-LocalUser
和net
工具(带有net user <username> /delete
)就是这样的原子函数。它们建议删除本地用户 - 听起来不错 - 但实际上它们(仅)从本地用户帐户数据库中删除用户。这可能在某些情况下就足够了,但请注意注册表项和配置文件目录将保留!
Microsoft 提供了宏功能来彻底删除本地用户帐户,但遗憾的是只能在 GUI 中使用。您可以通过设置 > 帐户 > 家庭和其他用户只需选择一个用户并点击消除,然后删除帐户和数据。这将执行上述所有三个步骤。
还有一个宏功能可以删除用户的个人资料。您可以通过以下方式打开它控制面板 > 系统 > 高级系统设置 > 设置...(按钮位于用户配置文件控制板):
您也可以通过rundll32 sysdm.cpl,EditUserProfiles
在提升的 PowerShell 中执行来直接打开此窗口。务必使用管理员权限打开此窗口,这样才能看到所有用户帐户,而不仅仅是自己的帐户(即使通过 GUI 打开)。
通过此窗口删除用户帐户将执行上述步骤 2 和 3。
想知道这两个未知帐户是什么吗?它们是两个已删除帐户的残留,一个由 cmdlet 删除Remove-LocalUser
,一个由net
工具删除。
当您寻找 PowerShell 解决方案时,我们至少可以手动执行上述三个步骤,只要 PowerShell 不提供可以一次完成所有工作的 cmdlet:
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
)将仅从应删除的帐户的帐户数据库中删除每个第二个用户帐户:
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
}