使用 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 具有用于管理本地用户帐户的内置 cmdlet,因此应该优先于自定义模块(前提是您运行的是足够高版本的 PowerShell):

$KeepUsers = “管理员”、“默认帐户”、“DevToolsUser”、“访客”、“sshd”、“用户”、“WDAGUtilityAccount”
获取本地用户 | ? { $KeepUsers -notcontains $_.Name } | 删除本地用户

从左到右:

  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 cmdlet 执行相同的操作。

答案4

删除本地帐户听起来像是一项任务,但它至少包含以下三个步骤:

  1. 从本地帐户数据库中删除该帐户
  2. 删除此账户的配置文件目录
  3. 从注册表中删除帐户配置文件

可能还有更多步骤,但到目前为止我还没有找到任何相关文档。由于要执行多个步骤,因此使用过于原子化的函数可能不是一个好主意。cmdletRemove-LocalUsernet工具(带有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
}

相关内容