我發現這個腳本由 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 } |刪除本機用戶
由左至右:
- 取得所有本地用戶。
- 透過管道將其輸入
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'
您可以對刪除 cmdlet 執行相同的操作。
答案4
刪除本機帳戶聽起來像是一項任務,但它至少包含以下三個步驟:
- 從本機帳戶資料庫中刪除帳戶
- 刪除該帳號的個人資料目錄
- 從註冊表中刪除帳戶配置文件
可能還有更多步驟,但到目前為止我還沒有找到任何有關它們的文件。由於需要執行多個步驟,因此使用過於原子的函數可能不是一個好主意。 cmdletRemove-LocalUser
和net
工具(有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
}