Я нашел этот скрипт, любезно предоставленный 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 = "Администратор", "DefaultAccount", "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.
решение4
Удаление локальной учетной записи звучит как одна задача, но на самом деле она будет состоять как минимум из следующих трех шагов:
- Удалить учетную запись из локальной базы данных учетных записей
- Удалить каталог профилей этой учетной записи
- Удалить профиль учетной записи из реестра
Возможно, есть еще больше шагов, но я пока не нашел по ним документации. Поскольку нужно выполнить несколько шагов, вероятно, плохая идея использовать для этого слишком атомарные функции. Командлет Remove-LocalUser
и net
инструмент (с net user <username> /delete
) являются такими атомарными функциями. Они предлагают удалить локального пользователя — что звучит хорошо — но на самом деле они (только) удаляют пользователя из локальной базы данных учетных записей пользователей. Этого может быть достаточно для некоторых сценариев, но имейте в виду, что ключи реестра и каталог профиля останутся!
Microsoft предлагает макрофункцию для полного удаления локальной учетной записи пользователя, к сожалению, только в GUI. Вы можете найти ее черезНастройки > Учетные записи > Семья и другие пользователи. Просто выберите пользователя и нажмите наУдалять, Затем наУдалить учетную запись и данные. Это позволит выполнить все три шага, описанные выше.
Также есть макрос-функция для (простого) удаления профиля пользователя. Вы можете открыть его черезПанель управления > Система > Дополнительные параметры системы > Настройки...(кнопка вПрофили пользователейпанель):
Вы также можете открыть это окно напрямую, выполнив rundll32 sysdm.cpl,EditUserProfiles
PowerShell с повышенными правами. Важно открыть это окно с правами администратора, чтобы увидеть все учетные записи пользователей, а не только собственную учетную запись (даже при открытии через GUI).
Удаление учетной записи пользователя через это окно приведет к выполнению шагов 2 и 3, описанных выше.
Хотите узнать, что это за два неизвестных аккаунта? Это остатки двух удаленных аккаунтов, один из которых был удален командлетом Remove-LocalUser
, а другой — инструментом net
.
Поскольку вы ищете решение PowerShell, мы можем выполнить по крайней мере три шага, описанных выше, вручную, если PowerShell не предоставляет командлет для выполнения всей работы одновременно:
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
Но в настоящее время (в PS v5.1.18362.752) конвейер между Get-LocalUser
и 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
}