Cuando lo utilizan los usuarios (no los administradores de sistemas ni los programadores), uno de los inconvenientes importantes de los scripts de PowerShell es su interfaz de línea de comandos. El resultado de los scripts se muestra en la consola de la CLI de PowerShell y no siempre es conveniente para el usuario final. Sin embargo, PowerShell es una herramienta de automatización potente y moderna para Windows que le permite utilizar de forma transparente una variedad de objetos de .NET Framework. Por ejemplo, utilizando la API .NET, puede crear fácilmente una interfaz gráfica (GUI) simple para sus scripts de PowerShell.
En este ejemplo, mostraremos cómo crear un formulario GUI de Windows simple usando PowerShell y colocar varios elementos de controles estándar de Windows Forms en él: cuadros de texto, botones, etiquetas, casillas de verificación / cuadros de lista, botones de radio, cuadrículas de datos, etc. Por ejemplo, nuestra tarea consiste en crear una GUI simple para un script de PowerShell que muestre la hora del último cambio de contraseña para el usuario de Active Directory. En este ejemplo, usamos PowerShell 3.0+ y PowerShell ISE para facilitar la edición de código.
Crear formulario de Windows con PowerShell
Para usar la funcionalidad .NET para crear formularios, usaremos la clase System.Windows.Forms. Para cargar esta clase en una sesión de PowerShell, puede usar el siguiente código:
Add-Type -assembly System.Windows.Forms
Ahora cree el formulario de pantalla (ventana) para contener elementos:
$main_form = New-Object System.Windows.Forms.Form
Establezca el título y el tamaño de la ventana:
$main_form.Text="GUI for my PoSh script" $main_form.Width = 600 $main_form.Height = 400
Si los elementos del formulario están fuera de los límites de la ventana, use la propiedad AutoSize para hacer que el formulario se estire automáticamente.
$main_form.AutoSize = $true
Ahora puede mostrar el formulario en la pantalla.
$main_form.ShowDialog()
Agregar componentes de cuadro de diálogo a su formulario de PowerShell
Como puede ver, se muestra un formulario vacío. Para agregarle varios diálogos gráficos y elementos de control, agregue el código a continuación antes de la última línea ($ main_form.ShowDialog ()).
Cree un elemento de etiqueta en el formulario:
$Label = New-Object System.Windows.Forms.Label $Label.Text = "AD users" $Label.Location = New-Object System.Drawing.Point(0,10) $Label.AutoSize = $true $main_form.Controls.Add($Label)
Cree una lista desplegable y rellénela con una lista de cuentas del dominio de Active Directory. Puede obtener la lista de usuarios de AD mediante el cmdlet Get-ADuser (del módulo Active Directory para Windows PowerShell):
$ComboBox = New-Object System.Windows.Forms.ComboBox $ComboBox.Width = 300 $Users = get-aduser -filter * -Properties SamAccountName Foreach ($User in $Users) { $ComboBox.Items.Add($User.SamAccountName); } $ComboBox.Location = New-Object System.Drawing.Point(60,10) $main_form.Controls.Add($ComboBox)
Agregue dos etiquetas más al formulario. El segundo mostrará la hora del último cambio de contraseña para la cuenta de usuario seleccionada:
$Label2 = New-Object System.Windows.Forms.Label $Label2.Text = "Last Password Set:" $Label2.Location = New-Object System.Drawing.Point(0,40) $Label2.AutoSize = $true $main_form.Controls.Add($Label2) $Label3 = New-Object System.Windows.Forms.Label $Label3.Text = "" $Label3.Location = New-Object System.Drawing.Point(110,40) $Label3.AutoSize = $true $main_form.Controls.Add($Label3)
Ahora ponga el botón en el formulario:
$Button = New-Object System.Windows.Forms.Button $Button.Location = New-Object System.Drawing.Size(400,10) $Button.Size = New-Object System.Drawing.Size(120,23) $Button.Text = "Check" $main_form.Controls.Add($Button)
El siguiente código se ejecutará cuando el usuario haga clic en el botón. Para convertir la fecha del formato TimeStamp al formato más conveniente, usamos la función [datetime]:: FromFileTime:
$Button.Add_Click( { $Label3.Text = [datetime]::FromFileTime((Get-ADUser -identity $ComboBox.selectedItem -Properties pwdLastSet).pwdLastSet).ToString('MM dd yy : hh ss') } )
Si desea ocultar algunos de los elementos de la GUI en un formulario de Windows, utilice el Visible propiedad. Por ejemplo:
$Label3.Text.Visible = $false # or $True if you want to show it
Ejecute el script de PowerShell. Como puede ver, la lista desplegable se llena automáticamente con los nombres de las cuentas de usuario de Active Directory. Si selecciona la cuenta de usuario y hace clic en el Cheque , el formulario muestra la hora en que se cambió la última contraseña del usuario en Active Directory.
Entonces, creó su primera interfaz gráfica de usuario simple para un script de PowerShell. ¿Que sigue? Ahora puede agregar un elemento de interfaz de usuario más complejo a su formulario de PowerShell.
Elementos de la interfaz de usuario de PowerShell más utilizados
Del mismo modo, puede crear los siguientes elementos gráficos en el formulario:
- CheckBox: se utiliza para enumerar algunas opciones y seleccionarlas antes de ejecutar el script;
- RadioButton: enumera algunas opciones de texto y permite seleccionar solo una de ellas;
- TextBox: el usuario puede escribir texto. Puede usarse para obtener el valor del parámetro de secuencia de comandos PoSh;
- Etiqueta: se utiliza para etiquetar algunas partes de la GUI de los scripts;
- ChekedListBox: muestra una lista de elementos;
- DataGridView: permite ver algunos datos tabulares;
- GroupBox: permite ver y agrupar un conjunto de controles;
- ListBox: puede almacenar varios elementos de texto;
- TabControl: le permite dividir su formulario en diferentes áreas (pestañas);
- ListView: muestra una lista de elementos con texto y (opcionalmente) un icono;
- TreeView - vista de objetos jerárquicos;
- DateTimePicker: permite seleccionar la fecha y la hora;
- TrackBar - control desplazable;
- PictureBox: permite mostrar una imagen en el formulario;
- ProgressBar: indica el progreso de la operación;
- HScrollBar: barra de desplazamiento horizontal;
- VScrollBar: barra de desplazamiento vertical;
- ContextMenu: menús contextuales;
- Menú - menú superior en su formulario.
Uso de componentes estándar del cuadro de diálogo de Windows en scripts de PowerShell
Puede invocar algunos de los cuadros de diálogo gráficos estándar de Windows para informar al usuario y pedirle que elija. Echemos un vistazo a algunas de las llamadas de ventana de gráficos estándar en PowerShell.
Mostrar cuadro de mensaje:
El mensaje es un atributo obligatorio de MessageBox. El título, el botón y el icono son opcionales.
Por ejemplo, para mostrar un cuadro de mensaje solo con Aceptar:
[void] [System.Windows.MessageBox]::Show( "All changes have been implemented successfully ", "Script completed", "OK", "Information" )
Mostrar un cuadro de mensaje con una respuesta obligatoria requerida:
$answer = [System.Windows.MessageBox]::Show( "Dou you want to remove this user?", " Removal Confirmation", "YesNoCancel", "Warning" )
Solicitar credenciales a un usuario y dividirlo en dos variables:
$creds = Get-Credential $UserName $getUsername = $creds.GetNetworkCredential( ).UserName $getPassword = $creds.GetNetworkCredential( ).Password
Mostrar predeterminado Cuadro de diálogo de selección de archivo de Windows con un filtro por nombre de archivo:
Add-Type -AssemblyName System.Windows.Forms $initialDirectory = [Environment]::GetFolderPath('Desktop') $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog $OpenFileDialog.InitialDirectory = $initialDirectory $OpenFileDialog.Filter="Script files (*.ps1;*.cmd;*.bat)|*.ps1;*.bat;*.cmd" $OpenFileDialog.Multiselect = $false $response = $OpenFileDialog.ShowDialog( ) # $response can return OK or Cancel if ( $response -eq 'OK' ) { Write-Host 'You selected the file:' $OpenFileDialog.FileName }
Abre el Busca por carpetas ventana de diálogo:
$shell = New-Object -ComObject Shell.Application $selectedfolder = $shell.BrowseForFolder( 0, 'Select a folder to proceed', 16, $shell.NameSpace( 17 ).Self.Path ).Self.Path
Seleccionar impresora formulario de diálogo:
Add-Type -AssemblyName System.Windows.Forms $prntdlg = New-Object System.Windows.Forms.PrintDialog $prntdlg.AllowCurrentPage = $false $prntdlg.AllowPrintToFile = $trur $prntdlg.AllowSelection = $false $prntdlg.AllowSomePages = $true $prntdlg.ShowNetwork = $true $response = $prntdlg.ShowDialog( )# $response can return OK or Cancel if ( $response -eq 'OK' ) { Write-Host 'Selected printer:' $prntdlg.PrinterSettings.PrinterName }
Otro comando de PowerShell útil para presentar información gráfica de un script a un usuario es Out-GridView. El cmdlet Out-GridView le permite mostrarlo en forma de tabla gráfica, en la que se puede filtrar y ordenar según los criterios deseados.
Por ejemplo, la siguiente secuencia de comandos enumerará los servicios en ejecución en Windows. El usuario debe seleccionar los servicios deseados (se pueden seleccionar varias líneas manteniendo presionada la tecla Ctrl) y guardar la selección en una variable.
$Svcs = Get-Service | Where-Object {$_.Status -EQ "Running"}| Out-GridView -Title "List of running services" -PassThru| Select -ExpandProperty Name
Ahora puede usar la lista de servicios seleccionados por el usuario en Out-GridView para su posterior procesamiento en su script de PowerShell.
Creación de la GUI de PowerShell Scripts con Visual Studio
Puede usar Visual Studio con WPF (Windows Presentation Foundation) como un simple generador de GUI de PowerShell. Descargue e instale la versión 2019 de Visual Studio Community.
WPF es parte de .NET Framework que se puede usar para visualizar interfaces de usuario en aplicaciones de Windows.
Ejecute Microsoft Visual Studio y cree un nuevo proyecto (Archivo> Nuevo> Proyecto). Seleccione Visual C #> Aplicación Windows Forms (.NET Framework)
Utilice el elemento de Windows Forms en el panel de la caja de herramientas de la izquierda para colocar su elemento de control en el formulario (con arrastrar y soltar).
Visual Studio generará un código XAML para usted. Guarde este código en el archivo C: PS Script MainWindow.xaml. Abra este archivo con el Bloc de notas y elimine la siguiente cadena:
x:Class="test.MainWindow”
Y guarde los cambios en el archivo xaml.
Ahora puede leer este código XAML desde su script de PowerShell y mostrar un formulario de Windows.
Use la siguiente función para cargar el objeto XAML:
$XamlPath = “C:PSScriptMainWindow.xaml” [xml]$Global:xmlWPF = Get-Content -Path $XamlPath try{ Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase,system.windows.forms } catch { Throw "Failed to load WPF." } $Global:xamGUI = [Windows.Markup.XamlReader]::Load((new-object System.Xml.XmlNodeReader $xmlWPF)) $xmlWPF.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | %{ Set-Variable -Name ($_.Name) -Value $xamGUI.FindName($_.Name) -Scope Global }
Para mostrar su formulario utilice:
$xamGUI.ShowDialog()
Utilice el editor en línea para crear un formulario para su script PoSh
Para una creación más conveniente de elementos gráficos para formularios de PowerShell, puede utilizar el editor en línea para crear un formulario de GUI para scripts de PowerShell: https://poshgui.com/ (ya no es gratuito). Con él, puede crear una hermosa forma con los elementos de diálogo necesarios.
Y obtenga el código PoSh listo para sus scripts de GUI. Simplemente copie este código en su PowerShell ISE o Visual Studio Code con la extensión PowerShell, cambie los nombres de los elementos (opcionalmente) y ejecute el código para mostrar el formulario generado en su computadora.