GUI de PowerShell – Cómo empezar

He creado muchos scripts de PowerShell durante los últimos años. Todo con un solo propósito para automatizar mi trabajo de TI tanto como sea posible.

Pero esta semana necesitaba crear un script que pudieran ejecutar los propios usuarios. Y los usuarios y la línea de comandos no son la mejor combinación, así que echemos un vistazo al uso de la GUI de PowerShell.

A todos nos encanta PowerShell por su simplicidad y eficiencia cuando se trata de secuencias de comandos, pero para los usuarios normales, trabajar con una CLI no es algo a lo que estén acostumbrados.

En este artículo, explicaré cómo puede crear una GUI simple para su secuencia de comandos y lo ayudaré a superar los obstáculos básicos.

El proyecto de ejemplo

En este artículo usaré uno de mis propios proyectos como ejemplo, así que primero déjame contarte un poco sobre el problema que necesitaba resolver.

Trabajo para una empresa de construcción y nuestros sitios de construcción están conectados a través de una red IPVPN 4G con el centro de datos. Debido al doble natting, no podemos implementar impresoras con un servidor de impresión.

Nuestros usuarios pueden instalar una impresora ellos mismos, pero debido a que no figuran en el servidor de impresión, pueden buscar fácilmente la impresora. Deberán crear un puerto TCP/IP, buscar la dirección IP de la impresora, seleccionar el controlador y dar un nombre a la impresora.

Creé un script de PowerShell que podía ejecutar de forma remota para hacer esto en segundo plano, pero eso requeriría que me llamaran, para poder ejecutar el script en segundo plano.

Ahora podría simplemente instalar todas las impresoras, pero eso solo sería confuso y daría como resultado una larga lista de impresoras.

Así que pensé que el script de PowerShell solo necesita el modelo de impresora, la dirección IP y un nombre.

Podemos buscar la dirección IP, de modo que si el usuario puede seleccionar un modelo y completar un nombre, hemos terminado. Ahorrándome 2 llamadas a la semana.

Los conceptos básicos de la interfaz gráfica de usuario de PowerShell

Antes de comenzar a crear un formulario, es importante saber que el script de PowerShell se ejecuta secuencialmente.

Así que defines tu formulario y lo muestras. Pero cualquier código después de mostrar el formulario no se ejecutará hasta que cierre el formulario.

Esto es algo que me llevó 30 minutos descubrir… Simplemente pensé que podía mostrar el formulario y manejar la entrada debajo de él en PowerShell.

Creando el formulario

Comenzamos con un formulario en blanco. Primero, agregamos .Net Windows. formularios Además, necesitamos definir un tamaño para el formulario (ancho, alto), título y color de fondo.

Simplemente copie y pegue el código a continuación en PowerShell ISE y haga clic en ejecutar

# Init PowerShell Gui
Add-Type -AssemblyName System.Windows.Forms

# Create a new form
$LocalPrinterForm                    = New-Object system.Windows.Forms.Form

# Define the size, title and background color
$LocalPrinterForm.ClientSize="500,300"
$LocalPrinterForm.text               = "LazyAdmin - PowerShell GUI Example"
$LocalPrinterForm.BackColor          = "#ffffff"

# Display the form
[void]$LocalPrinterForm.ShowDialog()

Verá un formulario simple como este a continuación:

Formulario de PowerShell

Agregando elementos a tu formulario

En nuestro formulario, podemos agregar elementos. Estos se pueden usar para mostrar información y recopilar información del usuario. El lugar de la entrada se basa en puntos/píxeles del lado izquierdo y del lado superior. Entonces, la ubicación 20,50 está a 20 píxeles del lado izquierdo y 50 puntos del lado superior.

Disponemos de los siguientes elementos que podemos utilizar en nuestros formularios:

  • TextBox (para obtener la entrada del usuario)
  • Etiqueta
  • Botón
  • Cuadro de imagen
  • Caja
  • ComboBox (lista desplegable)
  • Vista de la lista
  • Cuadro de lista
  • Boton de radio
  • Panel
  • Groupbox (Para agrupar elementos juntos)
  • Barra de progreso
  • DataGridView

Así que vamos a crear algunos elementos en nuestro formulario. Agregue el siguiente código a su script.

Asegúrese de que ShowDialog esté al final de su secuencia de comandos.

# Create a Title for our form. We will use a label for it.
$Titel                           = New-Object system.Windows.Forms.Label

# The content of the label
$Titel.text                      = "Adding new printer"

# Make sure the label is sized the height and length of the content
$Titel.AutoSize                  = $true

# Define the minial width and height (not nessary with autosize true)
$Titel.width                     = 25
$Titel.height                    = 10

# Position the element
$Titel.location                  = New-Object System.Drawing.Point(20,20)

# Define the font type and size
$Titel.Font="Microsoft Sans Serif,13"

# Other elemtents
$Description                     = New-Object system.Windows.Forms.Label
$Description.text                = "Add a new construction site printer to your computer. Make sure you are connected to the network of the construction site."
$Description.AutoSize            = $false
$Description.width               = 450
$Description.height              = 50
$Description.location            = New-Object System.Drawing.Point(20,50)
$Description.Font="Microsoft Sans Serif,10"

$PrinterStatus                   = New-Object system.Windows.Forms.Label
$PrinterStatus.text              = "Status:"
$PrinterStatus.AutoSize          = $true
$PrinterStatus.location          = New-Object System.Drawing.Point(20,115)
$PrinterStatus.Font="Microsoft Sans Serif,10,style=Bold"

$PrinterFound                    = New-Object system.Windows.Forms.Label
$PrinterFound.text               = "Searching for printer..."
$PrinterFound.AutoSize           = $true
$PrinterFound.location           = New-Object System.Drawing.Point(75,115)
$PrinterFound.Font="Microsoft Sans Serif,10"

# ADD OTHER ELEMENTS ABOVE THIS LINE

# Add the elements to the form
$LocalPrinterForm.controls.AddRange(@($Titel,$Description,$PrinterStatus,$PrinterFound))

# THIS SHOULD BE AT THE END OF YOUR SCRIPT FOR NOW
# Display the form
[void]$LocalPrinterForm.ShowDialog()

Lo que ves aquí es que cada elemento es creado. Todos estos son elementos simples de texto o etiquetas.

Puede definir el ancho y el alto de cada elemento, pero si su contenido es más largo, el elemento solo se mostrará parcialmente.

Entonces, al establecer el Tamaño automático a verdaderotiene la seguridad de que el usuario puede leer toda la etiqueta.

A cada elemento se le asigna una ubicación, el primer dígito es el número de píxeles desde el lado izquierdo, el segundo el número de píxeles desde la parte superior.

El resultado se verá así:

Adición de elementos al formulario GUI de PowerShell

Usar una lista desplegable

Nuestro usuario debe seleccionar el fabricante de la impresora, solo usamos dos marcas, por lo que el botón de radio también podría funcionar. Usamos controladores de impresión genéricos, por lo que no necesito saber el modelo específico de la impresora.

$PrinterType                     = New-Object system.Windows.Forms.ComboBox
$PrinterType.text                = ""
$PrinterType.width               = 170
$printerType.autosize            = $true

# Add the items in the dropdown list
@('Canon','Hp') | ForEach-Object {[void] $PrinterType.Items.Add($_)}

# Select the default value
$PrinterType.SelectedIndex       = 0
$PrinterType.location            = New-Object System.Drawing.Point(20,210)
$PrinterType.Font="Microsoft Sans Serif,10"

Creo que el código anterior es bastante claro, creamos el cuadro combinado y agregamos los elementos con un bucle foreach de una sola línea a la lista.

Nuevamente también definimos la posición y he establecido un ancho mínimo para el elemento.

Puede establecer un valor predeterminado para su lista desplegable seleccionando el índice.

Asegúrese de agregar la variable del elemento al $LocalPrinterForm.controles.AddRange, de lo contrario, no se mostrará.

Agregar botones

También vamos a agregar algunos botones a nuestro formulario. Un botón puede tener una acción estándar, como (
Aceptar, Cancelar, Abortar, Reintentar, Ignorar, Sí o No) o puede asignarle una función personalizada.

Los botones que vamos a agregar son Cancelar y Agregar impresora. Cancelar simplemente cerrará el formulario y no hará nada más, mientras que AddPrinter ejecutará nuestra lógica para agregar la impresora.

Agregue los botones con el código a continuación, nuevamente asegúrese de agregar las variables de los botones al $LocalPrinterForm.controles.AddRange

$AddPrinterBtn                   = New-Object system.Windows.Forms.Button
$AddPrinterBtn.BackColor         = "#a4ba67"
$AddPrinterBtn.text              = "Add Printer"
$AddPrinterBtn.width             = 90
$AddPrinterBtn.height            = 30
$AddPrinterBtn.location          = New-Object System.Drawing.Point(370,250)
$AddPrinterBtn.Font="Microsoft Sans Serif,10"
$AddPrinterBtn.ForeColor         = "#ffffff"

$cancelBtn                       = New-Object system.Windows.Forms.Button
$cancelBtn.BackColor             = "#ffffff"
$cancelBtn.text                  = "Cancel"
$cancelBtn.width                 = 90
$cancelBtn.height                = 30
$cancelBtn.location              = New-Object System.Drawing.Point(260,250)
$cancelBtn.Font="Microsoft Sans Serif,10"
$cancelBtn.ForeColor             = "#000"
$cancelBtn.DialogResult          = [System.Windows.Forms.DialogResult]::Cancel
$LocalPrinterForm.CancelButton   = $cancelBtn
$LocalPrinterForm.Controls.Add($cancelBtn)

Ahora muchos ejemplos en otros sitios web descartan los resultados del diálogo usando [void]$formulario.MostrarDiálogo(). Pero el valor de retorno del diálogo debe usarse para indicar cómo el usuario ha cerrado el formulario.

Así que vamos a modificar el cmd ShowDialog.

$result = $LocalPrinterForm.ShowDialog()

De esta forma podemos comprobar si el usuario ha pulsado Cancelar o cualquier otro botón predeterminado en el formulario.

if ($result –eq [System.Windows.Forms.DialogResult]::Cancel)
{
    write-output 'User pressed cancel'
}

Agregar una función personalizada a un botón

Cuando el usuario hace clic Agregar impresora se debe ejecutar un script personalizado.

Podemos crear una función con nuestra lógica y asignarle la función al botón con el siguiente cmd

$AddPrinterBtn.Add_Click({ AddPrinter })

Y nuestra función

function AddPrinter { 
	# ADDING PRINTER LOGIC GOES HERE
}

Resultado

Entonces, después de agregar todos los elementos y agregar algunas etiquetas adicionales, nuestro formulario final de GUI de PowerShell se ve así:

Ejemplo de GUI de PowerShell

Ahora solo tenemos que terminar nuestro script para que se agregue una impresora.

Agregando la lógica

Entonces, con nuestro formulario en su lugar, podemos comenzar agregando la lógica.

Durante la ejecución de su secuencia de comandos, es posible que desee cambiar el texto, mostrar o eliminar campos o realizar una acción específica.

Comencemos primero con la descripción de nuestro script de PowerShell.

#------------[Initialisations]------------

# Init PowerShell Gui
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing


#---------------[Form]-------------------

# Our form goes here

[System.Windows.Forms.Application]::EnableVisualStyles()

$LocalPrinterForm                    = New-Object system.Windows.Forms.Form
$LocalPrinterForm.ClientSize="480,300"
$LocalPrinterForm.text               = "LazyAdmin - PowerShell GUI Example"
$LocalPrinterForm.BackColor          = "#ffffff"
$LocalPrinterForm.TopMost            = $false
$Icon                                = New-Object system.drawing.icon ("./form.ico")
$LocalPrinterForm.Icon               = $Icon

# THE REST OF THE FORM

$LocalPrinterForm.controls.AddRange(@( "<ALL FORM ELEMENTS>" ))

#------------[Functions]------------

function AddPrinter { 
    # Function that is triggered with the add printer button
}

#------------[Script]------------

$AddPrinterBtn.Add_Click({ AddPrinter })

# REST OF YOUR SCRIPT


#------------[Show form]------------

# Show the form
$result = $LocalPrinterForm.ShowDialog()

# Catch any output of the form
if ($result –eq [System.Windows.Forms.DialogResult]::Cancel)
{
    write-output 'User pressed cancel'
}

En su sección de funciones o secuencia de comandos, es posible que desee dar algunos comentarios al usuario o utilizar los datos de los campos de entrada.

Lectura y cambio de elementos de la GUI de PowerShell

Leer datos del cuadro de texto es bastante sencillo. En nuestro ejemplo, queremos usar el nombre que ingresaron los usuarios y verificar si el nombre de la impresora ya existe. Si el nombre existe queremos mostrar un error.

if (Get-Printer -Name $printerName.text) {
	$PrinterStatus.ForeColor = "#D0021B"
	$PrinterStatus.Text="Printer name already exists."
}

En el ejemplo anterior, verificamos el nombre de la impresora dada, si existe, cambiamos el color de fuente de la etiqueta «Estado de la impresora» para leer y cambiamos el texto de la etiqueta para mostrar un mensaje a los usuarios.

No es necesario actualizar el formulario o la entrada, solo puede cambiar el texto sobre la marcha.

Mostrar y ocultar campos

Antes de que se cargue el formulario, verifico si hay una impresora disponible en la dirección de red esperada.

De lo contrario, no es necesario que el usuario continúe. Entonces, cuando inicializo los elementos del formulario, he ocultado algunos elementos.

Si tenemos una conexión, entonces muestro los elementos o cambio la etiqueta de los botones, por ejemplo. Ocultar y mostrar elementos en la GUI de PowerShell se puede hacer con el siguiente código:

$PrinterNameLabel.Visible = $false # or $true of course 😉

Editor de GUI de PowerShell en línea PoshGUI

Crear un formulario más grande o complejo solo desde la línea de comandos puede ser un poco desafiante. Deberá colocar todos los elementos en el lugar correcto, crear todo el código necesario. Afortunadamente, hay un editor de GUI de PowerShell en línea PoshGUI.

Editor de PowerShell en línea PoshGUI

Esta es una gran herramienta para crear su diseño de formulario inicial. Puedes descargar el archivo PS1 y seguir trabajando en tu formulario en tu editor favorito.

Conclusión

Así que espero que este artículo lo ayude a comenzar a crear su primer formulario de PowerShell.

Si bien PowerShell no está realmente diseñado para crear formularios, puede ser una excelente manera de hacer que un script sea más útil para su usuario o colegas.

Suscríbase al boletín para recibir el último artículo sobre PowerShell u Office 365 en su buzón.

El código completo queda de la siguiente manera:

#---------------------------------------------------------[Initialisations]--------------------------------------------------------
# Init PowerShell Gui
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing


#---------------------------------------------------------[Form]--------------------------------------------------------

[System.Windows.Forms.Application]::EnableVisualStyles()

$LocalPrinterForm                    = New-Object system.Windows.Forms.Form
$LocalPrinterForm.ClientSize="480,300"
$LocalPrinterForm.text               = "Printers"
$LocalPrinterForm.BackColor          = "#ffffff"
$LocalPrinterForm.TopMost            = $false
$Icon                                = New-Object system.drawing.icon ("//thunnissen.local/netlogon/printer.ico")
$LocalPrinterForm.Icon               = $Icon

$Titel                           = New-Object system.Windows.Forms.Label
$Titel.text                      = "Add new printer"
$Titel.AutoSize                  = $true
$Titel.width                     = 25
$Titel.height                    = 10
$Titel.location                  = New-Object System.Drawing.Point(20,20)
$Titel.Font="Microsoft Sans Serif,13"

$Description                     = New-Object system.Windows.Forms.Label
$Description.text                = "To add a printer, make sure you are connected to the same network as the printer.."
$Description.AutoSize            = $false
$Description.width               = 450
$Description.height              = 50
$Description.location            = New-Object System.Drawing.Point(20,50)
$Description.Font="Microsoft Sans Serif,10"

$PrinterStatus                   = New-Object system.Windows.Forms.Label
$PrinterStatus.text              = "Status:"
$PrinterStatus.AutoSize          = $true
$PrinterStatus.width             = 25
$PrinterStatus.height            = 10
$PrinterStatus.location          = New-Object System.Drawing.Point(20,115)
$PrinterStatus.Font="Microsoft Sans Serif,10,style=Bold"

$PrinterFound                    = New-Object system.Windows.Forms.Label
$PrinterFound.text               = "Searching for printer..."
$PrinterFound.AutoSize           = $true
$PrinterFound.width              = 25
$PrinterFound.height             = 10
$PrinterFound.location           = New-Object System.Drawing.Point(100,115)
$PrinterFound.Font="Microsoft Sans Serif,10"

$PrinterDetails                  = New-Object system.Windows.Forms.Label
$PrinterDetails.text             = "Printer details"
$PrinterDetails.AutoSize         = $true
$PrinterDetails.width            = 25
$PrinterDetails.height           = 10
$PrinterDetails.location         = New-Object System.Drawing.Point(20,150)
$PrinterDetails.Font="Microsoft Sans Serif,12"
$PrinterDetails.Visible          = $false

$PrinterNameLabel                = New-Object system.Windows.Forms.Label
$PrinterNameLabel.text           = "Name:"
$PrinterNameLabel.AutoSize       = $true
$PrinterNameLabel.width          = 25
$PrinterNameLabel.height         = 20
$PrinterNameLabel.location       = New-Object System.Drawing.Point(20,180)
$PrinterNameLabel.Font="Microsoft Sans Serif,10,style=Bold"
$PrinterNameLabel.Visible        = $false

$PrinterName                     = New-Object system.Windows.Forms.TextBox
$PrinterName.multiline           = $false
$PrinterName.width               = 314
$PrinterName.height              = 20
$PrinterName.location            = New-Object System.Drawing.Point(100,180)
$PrinterName.Font="Microsoft Sans Serif,10"
$PrinterName.Visible             = $false

$PrinterTypeLabel                = New-Object system.Windows.Forms.Label
$PrinterTypeLabel.text           = "Brand:"
$PrinterTypeLabel.AutoSize       = $true
$PrinterTypeLabel.width          = 25
$PrinterTypeLabel.height         = 20
$PrinterTypeLabel.location       = New-Object System.Drawing.Point(20,210)
$PrinterTypeLabel.Font="Microsoft Sans Serif,10,style=Bold"
$PrinterTypeLabel.Visible        = $false

$PrinterType                     = New-Object system.Windows.Forms.ComboBox
$PrinterType.text                = ""
$PrinterType.width               = 170
$PrinterType.height              = 20
@('Canon','Hp') | ForEach-Object {[void] $PrinterType.Items.Add($_)}
$PrinterType.SelectedIndex       = 0
$PrinterType.location            = New-Object System.Drawing.Point(100,210)
$PrinterType.Font="Microsoft Sans Serif,10"
$PrinterType.Visible             = $false

$AddPrinterBtn                   = New-Object system.Windows.Forms.Button
$AddPrinterBtn.BackColor         = "#ff7b00"
$AddPrinterBtn.text              = "Add"
$AddPrinterBtn.width             = 90
$AddPrinterBtn.height            = 30
$AddPrinterBtn.location          = New-Object System.Drawing.Point(370,250)
$AddPrinterBtn.Font="Microsoft Sans Serif,10"
$AddPrinterBtn.ForeColor         = "#ffffff"
$AddPrinterBtn.Visible           = $false

$cancelBtn                       = New-Object system.Windows.Forms.Button
$cancelBtn.BackColor             = "#ffffff"
$cancelBtn.text                  = "Cancel"
$cancelBtn.width                 = 90
$cancelBtn.height                = 30
$cancelBtn.location              = New-Object System.Drawing.Point(260,250)
$cancelBtn.Font="Microsoft Sans Serif,10"
$cancelBtn.ForeColor             = "#000"
$cancelBtn.DialogResult          = [System.Windows.Forms.DialogResult]::Cancel
$LocalPrinterForm.CancelButton   = $cancelBtn
$LocalPrinterForm.Controls.Add($cancelBtn)

$LocalPrinterForm.controls.AddRange(@($Titel,$Description,$PrinterStatus,$PrinterFound,$PrinterName,$PrinterNameLabel,$PrinterType,$AddPrinterBtn,$cancelBtn,$PrinterTypeLabel,$PrinterDetails))

#-----------------------------------------------------------[Functions]------------------------------------------------------------

function AddPrinter { 
	$PrinterFound.ForeColor = "#000000"
	$PrinterFound.Text="Adding printer..."
	# Check printer port
	$portName = "TCPPort:"+$printerIp
	$portExists = Get-Printerport -Name $portname -ErrorAction SilentlyContinue

	# Create port if it not exists
	if (-not $portExists) {
		$PrinterFound.Text="Creating printer port..."
		Add-PrinterPort -name $portName -PrinterHostAddress $printerIp
	}

	# Select the correct driver
	if ($PrinterType.SelectedItem -eq 'Canon') {
		$printerDriverName = "Canon Generic Plus PCL6"
	}else{
		$printerDriverName = "HP LaserJet M227-M231 PCL-6"
	}

	# Check if printer driver exists
	$printDriverExists = Get-PrinterDriver -name $printerDriverName -ErrorAction SilentlyContinue

	# Install printer or printer driver and printer
	if ($printDriverExists) {
		$PrinterFound.Text="Installing printer..."
		Add-Printer -Name $printerName.text -PortName $portName -DriverName $printerDriverName 
	}else{
		$PrinterFound.Text="Installing printer driver..."
		Add-PrinterDriver -name $printerDriverName

		$PrinterFound.Text="Installing printer..."
		Add-Printer -Name $printerName.text -PortName $portName -DriverName $printerDriverName
	}

	if (Get-Printer -Name $printerName.text) {
		$PrinterFound.ForeColor = "#7ed321"
		$PrinterFound.Text="The printer is installed"
	}
	else {
		$PrinterFound.ForeColor = "#D0021B"
		$PrinterFound.Text="Installation failed"
	}
	$PrinterNameLabel.Visible = $false
	$PrinterName.Visible = $false
	$PrinterType.Visible = $false
	$AddPrinterBtn.Visible = $false
	$PrinterDetails.Visible = $false
	$PrinterTypeLabel.Visible = $false
	$cancelBtn.text = "Close"
}

#---------------------------------------------------------[Script]--------------------------------------------------------
# Get printers IP Address
$clientIP = (
    Get-NetIPConfiguration |
    Where-Object {
        $_.IPv4DefaultGateway -ne $null -and
        $_.NetAdapter.Status -ne "Disconnected"
    }
).IPv4Address.IPAddress

$networkAddress = $clientIP.Split('.')
$networkAddress = $networkAddress[0]+"."+$networkAddress[1]+"."+$networkAddress[2]

# Check if printer is online
$printerIp =  $networkAddress + ".31" 
$testConnection = Test-Connection $printerIp -count 1 -Quiet

If ($testConnection) {
	$PrinterFound.text = "Printer found"
	$PrinterFound.ForeColor = "#7ed321"
	$PrinterNameLabel.Visible = $true
	$PrinterName.Visible = $true
	$PrinterType.Visible = $true
	$AddPrinterBtn.Visible = $true
	$PrinterDetails.Visible = $true
	$PrinterTypeLabel.Visible = $true
}else{
	$PrinterFound.text = "No printers found"
	$PrinterFound.ForeColor = "#D0021B"
	$cancelBtn.text = "Sluiten"
}

$AddPrinterBtn.Add_Click({ AddPrinter })

[void]$LocalPrinterForm.ShowDialog()

Otros artículos relacionados

Explicación de Set-ADUser: cómo modificar usuarios de AD con PowerShell

Explicación de Set-ADUser: cómo modificar usuarios de AD con PowerShell

¿Necesita actualizar varios usuarios en su Active Directory? ¿O busca una forma más eficiente de modificar las propiedades de los ...
Leer Más
Obtenga el informe de métricas de almacenamiento de OneDrive con PowerShell

Obtenga el informe de métricas de almacenamiento de OneDrive con PowerShell

¿Sabe cuánto almacenamiento de OneDrive utilizan sus usuarios? Probablemente no, y en la mayoría de los casos, tampoco importa. Obtienen ...
Leer Más
PSDrive - Cómo usar la alternativa PowerShell Net Use

PSDrive – Cómo usar la alternativa PowerShell Net Use

Todos conocemos el comando Net Use que podemos usar para mapear unidades de red desde la línea de comandos. Aunque ...
Leer Más
PowerShell For Loop, ForEach y Do While/Hasta que se explique

PowerShell For Loop, ForEach y Do While/Hasta que se explique

Una de las funciones más fundamentales en la programación además de "If, Else" son los bucles. Le permiten procesar datos ...
Leer Más
Cómo ejecutar un script de PowerShell

Cómo ejecutar un script de PowerShell

Los scripts de PowerShell son una excelente manera de automatizar tareas, recopilar información o modificar propiedades de forma masiva. La ...
Leer Más
Encuentra direcciones de correo electrónico en Office 365 con PowerShell

Encuentra direcciones de correo electrónico en Office 365 con PowerShell

A veces necesita encontrar el usuario o un buzón que está usando una dirección de correo electrónico en particular. En ...
Leer Más

Deja un comentario