使用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 -不包含 $_.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'

您可以對刪除 cmdlet 執行相同的操作。

答案4

刪除本機帳戶聽起來像是一項任務,但它至少包含以下三個步驟:

  1. 從本機帳戶資料庫中刪除帳戶
  2. 刪除該帳號的個人資料目錄
  3. 從註冊表中刪除帳戶配置文件

可能還有更多步驟,但到目前為止我還沒有找到任何有關它們的文件。由於需要執行多個步驟,因此使用過於原子的函數可能不是一個好主意。 cmdletRemove-LocalUsernet工具(有net user <username> /delete)就是這樣的原子函數。他們建議刪除本地用戶 - 這聽起來不錯 - 但他們實際上(僅)從本地用戶帳戶資料庫中刪除用戶。這對於某些情況可能就足夠了,但請注意註冊表項和設定檔目錄將保留!

微軟提供了一個巨集功能來完全刪除本機使用者帳戶,不幸的是只能在 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
}

相關內容