Encontré este script cortesía de Google, que elimina todas las cuentas locales, pero preferiría conservar estas: Administrador, Cuenta predeterminada, Usuario de DevTools, Invitado, sshd, Usuario, Cuenta WDAGUtility. ¿Alguien puede ayudarme?
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
}
Respuesta1
PowerShell tiene cmdlets integrados para administrar cuentas de usuarios locales, por lo que se deben preferir a un módulo personalizado (siempre que esté ejecutando una versión suficientemente alta de PowerShell):
$KeepUsers = "Administrador", "DefaultAccount", "DevToolsUser", "Invitado", "sshd", "Usuario", "WDAGUtilityAccount" Obtener usuario local | ? { $KeepUsers -notcontains $_.Name } | Eliminar usuario local
De izquierda a derecha:
- Obtenga todos los usuarios locales.
- Conéctelo a
Where-Object
(?
es un alias). - Filtre solo para usuarios cuyos nombres de usuario no aparecen en la
$KeepUsers
matriz. - Canalice los usuarios recién filtrados para
Remove-LocalUser
eliminarlos.
Respuesta2
Prueba esto:
Get-WMIObject -Class Win32_UserAccount -Filter "LocalAccount='True'" | Where-Object {$_.Name -notin @("Administrator", "DefaultAccount", "DevToolsUser", "Guest", "sshd", "User", "WDAGUtilityAccount")} | Foreach {net user "$_.Name" /delete}
- Primero enumere todas las cuentas de usuarios locales a través de WMI.
- Luego use el filtro Dónde-Objeto para excluir las cuentas de usuario que desea conservar.
- Luego pasan los objetos al bloque Foreach.
- Ahora elimine las cuentas de usuario usando
net user
.
Notas a pie de página
- Este script debe ejecutarse con privilegios administrativos.
- Debe hacer esto desde una cuenta de usuario para que no se marque para su eliminación.
Respuesta3
Hay un módulo de PowerShell en PowerShellGallery.com solo para este caso de uso.
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
#>
En PowerShell v5x y PowerShell Core6x o superior.
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
#>
Entonces podrías hacer esto...
Get-LocalUser |
Where Name -NotMatch 'Administrator|DefaultAccount|Guest|WDAGUtilityAccount'
Podrías hacer lo mismo con el cmdlet Eliminar.
Respuesta4
Eliminar una cuenta local parece una tarea, pero al menos constará de los siguientes tres pasos:
- Eliminar la cuenta de la base de datos de cuentas local
- Eliminar el directorio de perfil de esta cuenta
- Eliminar el perfil de la cuenta del registro.
Puede que haya incluso más pasos, pero hasta ahora no he encontrado ninguna documentación sobre ellos. Como hay varios pasos a realizar, probablemente sea una mala idea utilizar funciones demasiado atómicas para ello. El Remove-LocalUser
cmdlet y la net
herramienta (con net user <username> /delete
) son funciones atómicas. Sugieren eliminar un usuario local, lo cual suena bien, pero en realidad (solo) eliminan al usuario de la base de datos de cuentas de usuarios locales. Esto puede ser suficiente para algunos escenarios, pero tenga en cuenta que las claves de registro y el directorio del perfil permanecerán.
Microsoft ofrece una función macro para eliminar completamente una cuenta de usuario local, lamentablemente sólo en la GUI. Puedes encontrarlo a travésConfiguración > Cuentas > Familia y otros usuarios. Simplemente seleccione un usuario y haga clic enEliminar, luego enEliminar cuenta y datos. Esto realizará los tres pasos anteriores.
También hay una función macro para (simplemente) eliminar el perfil de un usuario. Puedes abrirlo a través dePanel de control > Sistema > Configuración avanzada del sistema > Configuración...(botón en elPerfiles de usuariopanel):
También puede abrir esta ventana directamente ejecutándola rundll32 sysdm.cpl,EditUserProfiles
en un PowerShell elevado. Es importante abrir esta ventana con privilegios administrativos para ver todas las cuentas de usuario y no solo la propia cuenta (incluso cuando se abre mediante GUI).
Para eliminar una cuenta de usuario a través de esta ventana se realizarán los pasos 2 y 3 anteriores.
¿Se pregunta cuáles son las dos cuentas desconocidas? Son los restos de dos cuentas eliminadas, una eliminada por el Remove-LocalUser
cmdlet y otra por la net
herramienta.
Mientras busca una solución PowerShell, al menos podemos realizar los tres pasos anteriores manualmente, siempre que PowerShell no proporcione un cmdlet para hacer todo el trabajo a la vez:
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'
Esta función está lista para usarse en una canalización, por lo que puede eliminar todos los usuarios excepto los que desea conservar de esta manera:
Get-LocalUser | ? Name -NotIn Administrator, DefaultAccount, DevToolsUser, Guest, sshd, User, WDAGUtilityAccount | Remove-LocalUserCompletely
Pero actualmente (en PS v5.1.18362.752) la canalización entre Get-LocalUser
y Remove-LocalUser
tiene errores, lo que también afectará mi función anterior. La siguiente canalización (sin Remove-LocalUserCompletely
) solo eliminará una de cada dos cuentas de usuario de la base de datos de cuentas de las cuentas que deben eliminarse:
Get-LocalUser | ? Name -NotIn Administrator, DefaultAccount, DevToolsUser, Guest, sshd, User, WDAGUtilityAccount | Remove-LocalUser
Puedes solucionar esto usando un bucle en lugar de una canalización (ahora con Remove-LocalUserCompletely
):
$users = Get-LocalUser | ? Name -NotIn Administrator, DefaultAccount, DevToolsUser, Guest, sshd, User, WDAGUtilityAccount
foreach ($user in $users) {
Remove-LocalUserCompletely -Name $user.Name
}