Eliminar cuentas locales con Powershell Script

Eliminar cuentas locales con Powershell Script

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:

  1. Obtenga todos los usuarios locales.
  2. Conéctelo a Where-Object( ?es un alias).
  3. Filtre solo para usuarios cuyos nombres de usuario no aparecen en la $KeepUsersmatriz.
  4. Canalice los usuarios recién filtrados para Remove-LocalUsereliminarlos.

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:

  1. Eliminar la cuenta de la base de datos de cuentas local
  2. Eliminar el directorio de perfil de esta cuenta
  3. 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-LocalUsercmdlet y la netherramienta (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):

ingrese la descripción de la imagen aquí

También puede abrir esta ventana directamente ejecutándola rundll32 sysdm.cpl,EditUserProfilesen 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-LocalUsercmdlet y otra por la netherramienta.

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-LocalUsery Remove-LocalUsertiene 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
}

información relacionada