Mostrar y eliminar perfiles

de usuarios Windows en Powershell
Posted by Miguel Mora on January 18, 2022

ÍNDICE

1. Introducción
2. Prerrequisitos
3. ¿Qué vamos a hacer?
4. Pasos
     4.1. Funciones
          Función "ShowMenu"
          Función "ShowUsers"
          Función "RemoveUsers"
     4.2. Código Principal
          Filtrar Usuarios
          Seleccionar Menú
          Mostrar Usuarios
          Eliminar Usuarios
5. Extras
     5.1. Ejecutar como Administrador
     5.2. Error "La ejecución de scripts está deshabilitada en este sistema"
          Evitarlo: “Bypass” Execution Policy Flag
          Designar permisos
6. Quiero el código

 

1. Introducción

Trabajar en un entorno dinámico de trabajo hace que “reciclar” equipos que han sido previamente utilizados, para nuevos usuarios de la empresa, sea una tarea muy común.

Muchas veces no tenemos ese tiempo para poder reinstalar completamente el Sistema Operativo, instalar todas las aplicaciones de empresa y demás operaciones necesarias; es por ello que, eliminando los perfiles de usuario de un equipo es la tarea más eficiente.

En esta web nos gusta optimizar nuestro tiempo, por lo que vamos a mostrarte cómo mostrar y eliminar perfiles usuarios para equipos Windows usando Powershell. ¡Vamos a ello!

 

 

 

2. Prerrequisitos

Para este lab necesitaremos:

  • Un equipo con sistema operativo Windows
  • Permisos de Administrador en dicho equipo
  • Que el equipo posea al menos Powershell 3.0

 

3. ¿Qué vamos a hacer?

En resumen, estas son las tareas que vamos a realizar:

  1. Muestra el menú principal
  2. Mostrar Usuarios

 

Este es el diagrama de flujo de lo que vamos a hacer.

 

 

4. Pasos

4.1. Funciones

Para las tareas repetitivas, crearemos funciones que “lanzaremos” en nuestro código principal. En este caso, necesitaremos:

  • Función ShowMenu: Será el menú principal
  • Función ShowUsers: Muestra los usuarios por pantalla
  • Función RemoveUsers: Elimina usuarios

 

Función "ShowMenu”

Esta función tendrá el contenido del menú principal de nuestro GUI (Graphical User Interface).

En este caso crearemos un diccionario (o tabla hash) ordenado.

 

¿Qué es un Diccionario o Tabla Hash?

Una tabla hash es una estructura de datos, en gran medida como una matriz, excepto que cada valor (objeto) se asocia a una clave

Nuestro menú será sencillo, sólo tendrá tres valores:

  • Para mostrar usuarios
  • Para eliminar usuarios
  • Para salir
function ShowMenu {
    $Menu = [ordered]@{
      1 = 'Show Users'
      5 = 'Remove Multiple Users'
      q = 'Exit'
      }
    return $Menu
}

 

Función "ShowUsers”

Esta función recibe como entrada un grupo de usuarios, y permitirá mostrarlos en la pantalla de forma interactiva.

function ShowUsers {
    param (
        [Object[]]$User,
        [String]$Title
    )
    $ShowUsersTemp = $User | Out-GridView -PassThru -Title $Title
    return $ShowUsersTemp
}

 

param: Nos permite definir los parámetros que recibimos. En este caso, el título de nuestra ventana del menú, y un grupo de objectos, donde cada uno será un usuario.

ShowUsersTemp: esta variable utilizará el grupo de objectos y los pondrá en nuestra ventana interactiva. Para ello usaremos el comando “Out-GridView”, que envía nuestro resultado a una ventana de vista de cuadrícula.

 

Función "RemoveUsers”

Esta función recibirá como entrada un grupo de usuarios, los mostrará por pantalla y permitirá elegir los que queremos eliminar.

Una vez hemos seleccionado dichos usuarios, nos aparecerá una ventana pidiendo confirmación.

 

function RemoveUsers {
    param (
        [Object[]]$User,
        [Object[]]$Userpath
    )

    $title    = 'Remove Users'
    $question1 = "The following profiles will be deleted:"
    $question2 = $Userpath -Join "`r"
    $question3 = "Are you sure you want to proceed?"

    $question = "$question1{0}$question2{0}$question3" -f [environment]::NewLine
    $choices  = '&Yes', '&No'

	$popup = New-Object -ComObject wscript.shell
	$decision = $popup.Popup("$question",0,"$title",64+1)

    if ($decision -eq 1) 
    {
        $User | Remove-WmiObject
    } else {
        Write-Host 'Cancelled'
    }
}

 

param: Definimos los parámetros de entrada de la función. En este caso, nuestro grupo de usuarios, y el grupo de la ubicación de los perfiles de dichos usuarios.

title, question1, question2, question3: Definimos lo que vamos a mostrar en la ventana de confirmación. En este caso, mostramos un listado de todos los perfiles que se van a eliminar.

popup: Definiremos una ventana popup donde permita confirmar la eliminación de los perfiles de usuarios. Para ello creamos un acceso directo a un objeto COM llamado wscript.shell, y lo almacenamos en la variable popup.

wscript.shell: Objeto que permitirá interactuar con varios aspectos de la Shell de Windows; en nuestro caso, utilizaremos el método popup para mostrar una ventana emergente.

decision: Configuramos el objeto wscript.shell para definir el título del popup así como lo que debe mostrar. Concretamente los valores definidos son:

 question: Definimos el texto que muestra por pantalla.

 0: Tiempo que estará visible nuestra ventana. En nuestro caso, no desaparecerá automáticamente.

 title: Título de la ventana

 64+1: los tipos de botones e iconos que aparecerán en la venta. En este caso, nos muestra el icono “Information Mark” (64), así como los botones “Aceptar” y “Cancelar” (1)

Remove-WmiObject: En el caso de que aceptemos proceder con la eliminación, eliminaremos los usuarios seleccionados.

 

4.2. Código Principal

Una vez hemos definido las funciones que vamos a realizar, vamos a definir nuestro código principal paso a paso.

 

Filtrar Usuarios

Como primer paso, extraeremos de nuestro sistema los usuarios locales junto con sus propiedades, y filtraremos la información de cada usuario.

 

accounts: Extraemos del sistema los perfiles de usuario. Para ello, utilizamos el comando “Get-WmiObject”. Además, excluiremos aquellos usuarios que pertenecen al propio sistema (como NETWORK SERVICE o LOCAL SERVICE).

$accounts = Get-WmiObject -Class Win32_UserProfile | Where-Object {$_.Special -ne 'Special'}

 

selection: Ejecuta nuestra función “ShowMenu”, y muestra por pantalla el menú principal con los datos extraídos de la función anterior.

$selection = ShowMenu | Out-GridView -PassThru  -Title 'STT User Profile Manager - [by SalvaTuTiempo]'

 

allusers: Utilizando los usuarios filtrados en la variable “accounts”, de todos los campos que tiene cada usuario, extraeremos únicamente:

  • Username: El nombre del usuario
  • LocalPath: La ubicación del perfil
  • Loaded: Si se encuentra activo (es decir, si su sesión está en uso)
  • SID: Es el identificador de dicho perfil
  • LastUsed: Indica la última vez que se utilizó dicho perfil

 

$allusers = $accounts | Select-Object @{Name='UserName';Expression={Split-Path $_.LocalPath -Leaf}}, LocalPath, Loaded, SID, @{Name='LastUsed';Expression={$_.ConvertToDateTime($_.LastUseTime)}}

 

Seleccionar Menú

Trataremos en este apartado la selección del menú principal. Para ello, controlaremos con la instrucción “switch” el valor elegido en dicho menú, almacenado en la variable “selection”.

switch ($selection)
{

}

 

El resto del código estará dentro de dicho condicional.

 

Mostrar Usuarios

En el caso de que el resultado de la selección sea “1” (seleccionando la opción “Show Users”), mostrará los perfiles de usuarios locales. Para ello, ejecutaremos la función “ShowUsers” y mandaremos los usuarios filtrados a través del campo “User”

{$Selection.Name -eq 1} 
{        
     ShowUsers -User $allusers -Title "Show User Profiles"
}

 

Eliminar Usuarios

En el caso de que el resultado de la selección sea “5” (seleccionando la opción “Remove Users”), nos mostrará los usuarios locales. En este caso, nos permitirá seleccionar usuarios, y serán almacenados en la variable “_SelectUser”.

$_Selectuser = ShowUsers -User $allusers -Title "Remove Users"

 

Una vez se han seleccionado los usuarios que se van a eliminar, eliminaremos sus perfiles.

rmvuser: filtraremos los perfiles de usuarios con los que han sido seleccionados en el menú. Para ello, filtraremos por su identificador SID.

RemoveUsers: Ejecutaremos la función “RemoveUsers” y le pasaremos como parámetro de entrada:

  • User: Los perfiles de los usuarios filtrados a través de la variable “rmvuser”
  • Userpath: La ubicación de dichos perfiles

 

if ($_Selectuser) 
{
     $rmvuser = $accounts | Where-Object {$_.SID -in $_Selectuser.SID}
     RemoveUsers -User $rmvuser -Userpath $_SelectUser.LocalPath
} 

 

5. Extras

5.1. Ejecutar como Administrador

Una vez hemos terminado de escribir nuestro codigo, para eliminar perfiles de usuario será necesario ejecutar nuestro código como Administrador.

Para hacerlo, podemos lanzar la ventana de "Ejecutar" presionando CTRL+R

 

Y escribimos el siguiente código:

powershell -Command "Start-Process PowerShell -Verb RunAs"

 

Esto abrirá la consola de Powershell como Administrador.

Una vez estamos dentro de la Shell, ejecutaremos nuestro codigo.

PS C:\WINDOWS\system32> & "D:\salvatutiempo\stt_winprofile_manager.ps1"

 

5.2. Error "La ejecución de scripts está deshabilitada en este sistema"

Puede que ejecutando nuestro script nos aparezca el error "La ejecución de scripts está deshabilitada en este sistema".

 

Este error es debido a que la opción de scripting requiere ser habilitada en nuestro sistema para ejecutar nuestro código. Para ello tenemos dos alternativas para solucionarlo: evitarlo o definir permisos.

 

Evitarlo: “Bypass” Execution Policy Flag

Para evitar este error, podemos usar el flag "Bypass". Este flag permite derivar la política de ejecución cuando se ejecutan scripts desde un fichero. Cuando usamos este flag, definimos que "Nada está bloqueado y no hay advertencias". 

Para ejecutarlo, una vez nos encontremos en la Shell de Powershell, ejecutaremos nuestro código de la siguiente manera:

PS C:\WINDOWS\system32> powershell.exe -ExecutionPolicy Bypass -File D:\Users\Miguel\Documents\salvatutiempo\stt_winprofile_manager.ps1

 

Definir Permisos

La otra solución que tenemos es definir los permisos requeridos.

Para ello, una vez estemos en la Shell de Powershell, ejecutaremos el siguiente comando:

C:\WINDOWS\system32> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

 

Una vez los permisos han sido aplicados, podremos ejecutar nuestro código 

PS C:\WINDOWS\system32> & "D:\salvatutiempo\stt_winprofile_manager.ps1"

 

6. Quiero el código

El código completo lo podrás encontrar en el repositorio:

Código

¿Te ha gustado?

Si te ha gustado y quieres aportar tu granito de arena para que esta comunidad crezca: