|
|
CSharp: Administración VMware ESXi y vCenter con PowerCLI y VIX API con C#
![]() Tutorial donde mostramos paso a paso cómo administrar y acceder a la información de un servidor de virtualización VMware ESXi o a un clúster de servidores VMware ESXi con VMware vCenter Server. Mostramos cómo realizar tareas habituales (encender, apagar, reiniciar, resetear, snapshot, cambiar nombre, etc) a máquinas virtuales mediante VMware vSphere PowerCLI y una aplicación completa en C# C Sharp para ejemplo de uso de VMware VIX API, con el código fuente incluido: AjpdSoft Gestión VMware ESXi y vCenter.
Videotutorial AjpdSoft Acceso VMware ESXi y vCenter en funcionamientoAjpdSoft Gestión VMware ESXi y vCenter, aplicación desarrollada en Visual Studio .NET 2013 (C# CSharp) con código fuente incluido 100% open source totalmente gratuito. AjpdSoft Gestión VMware ESXi y vCenter permite acceder a servidores de virtualización ESXi y clúster de servidores ESXi con VMware vCenter y permite obtener las máquinas virtuales (aplicando filtros) con sus datos básicos: nombre, poweredstate, tiempo inicio, estado, vRAM, vCPU, vCores, estado Vmware Tools, hostname, IP, sistema operativo, UUID, path, ficheros, alarmas, anotaciones, número de discos, etc. La aplicación también permite (si disponemos de la licencia de VMware ESXi apropiada) realizar acciones sobre las máquinas virtuales: encender, apagar, pausar, snapshot de máquina virtual, apagar, reiniciar el sistema operativo, instalar VMware Tools, montar y desmontar CD VMware Tools, cambiar nombre de máquina virtual, exportar resultados a CSV. A continuación mostramos un videotutorial sobre el uso y funcionamiento de AjpdSoft Gestión VMware ESXi y vCenter: Requisitos para usar VMware PowerCLI y VIX API con C# C SharpEn este tutorial explicaremos paso a paso cómo usar VMware vSphere PowerCLI para acceder a servidores VMware ESXi y VMware vCenter Server
Descarga e instalación de VMware vSphere PowerCLI y VIX APIEn primer lugar descargaremos el software gratuito VMware vSphere PowerCLI, que nos permitirá acceder a un servidor VMware ESXi o un clúster de servidores VMware vCenter Server, con esta herramienta de la línea de comandos podremos realizar cualquier acción sobre una máquina virtual: encenderla, detenerla, reiniciarla, crear un snapshot, etc. y podremos obtener datos de las las máquinas virtuales: snapshot, listado de máquinas virtuales, sistema operativo, IP, vRAM y vCPU asignadas, etc. Para descargar VMware PowerCLI accederemos a la web oficial de VMware, necesitaremos ser usuario registrado de VMware (es gratuito). Accederemos a la URL correspondiente para la descarga de VMware vShere PowerCLI:
En nuestro caso descargaremos VMware vSphere PowerCLI 5.5.0, pulsaremos en "Download Now": Leeremos los términos de licencia para VMware vSphere Software Developmen Kit (SDK), si estamos de acuerdo marcaremos "I agree to the terms and conditions outlined in the End User License Agreement" y pulsaremos "Accept": Descargaremos el fichero "VMware-PowerCLI-5.5.0-1295336.exe": Una vez descargado el fichero lo ejecutaremos para iniciar la instalación de VMware vSphere Software Development Kit SDK (vSphere PowerCLI y VIX API): Pulsaremos en "Ejecutar": El asistente para instalar VMware vSphere PowerCLI nos indicará que se requieren los componentes VMware Remote Console Plug-in 5.1 y VMware VIX 1.12.1, pulsaremos "Install" para instalarlos: Se iniciará el asistente para instalar VMware Remote Console Plug-in, pulsaremos "Next": Pulsaremos "Install" La instalación de VMware Remote Console Plug-in concluirá, pulsaremos "Finish": Se iniciará ahora la instalación de VMware VIX API, pulsaremos "Next": Leeremos los términos de licencia para VMware Software Development Kit (SDK), para Vmware VIX Application Programming Interface (VIX API), si estamos de acuerdo marcaremos "I accept the terms in the license agreement" y pulsaremos "Next": Indicaremos la carpeta donde se instalará VMware VIX API, pulsaremos "Next": Pulsaremos "Install": La instalación de VMware VIX API concluirá, pulsaremos "Finish": A continuación el asistente para instalar VMware vSphere PowerCLI nos indicará que se requiere una política de ejecución "RemoteSigned" para poder usar PowerCLI, posteriormente indicaremos cómo habilitarla, pulsaremos "Continue":
Se iniciará el asistente para instalar VMware vSphere PowerCLI, pulsaremos "Next": Leeremos los términos de licencia de VMware vSphere PowerCLI, si estamos de acuerdo marcaremos "I accept the terms in the license agreement" y pulsaremos "Next": Se instalará vSphere PowerCLI y vCloud Director PowerCLI, pulsaremos "Next": Pulsaremos "Install": Tras la instalación, el asistente nos indicará que ha concluido satisfactoriamente, pulsaremos "Finish": De esta sencilla forma ya tendremos disponibles las PowerCLI para administrar y consultar sevidores VMware ESXi y VMware vCenter Server:
Cómo usar PowerCLI para obtener datos y realizar tareas en servidor VMware ESXi y vCenter ServerUna vez instaladas las VMware vSphere PowerCLI (como indicamos aquí), pulsaremos en el botón Inicio de Windows, en la carpeta "VMware vSphere PowerCLI" ejecutaremos "VMware vSphere PowerCLI": En el primer inicio de las shell de la línea de comandos de las PowerCLI nos indicará que debemos activar "RemoteSigned" para poder usarlas:
Para activar RemoteSigned ejecutaremos el comando:
Nos avisará de que se va a cambiar una directiva de ejecución, introduciremos "s" y pulsaremos INTRO:
Si la directiva se aplica correctamente se inciará el shel de comandos VMware vSphere PowerCLI:
Lo primero que haremos será conectarnos a nuestro servidor VMware ESXi o bien a nuestro clúster de servidores VMware vCenter Server, para ello necesitaremos saber la IP de dicho servidor y un usuario y contraseña con permisos suficientes. El parámetro a ejecutar para establecer la conexión será:
Donde:
Si todo es correcto el shell PowerCLI nos mostrará un mensaje indicando que se ha establecido la conexión con el servidor. Es posible que nos muestre alguna advertencia referente al certificado de seguridad: Con el texto:
A partir de ahora podremos ejecutar comandos que serán lanzados contra el servidor ESXi o vCenter al que estemos conectados. Por ejemplo, para obtener todas las máquinas virtuales del servidor (tanto las iniciadas como las apagadas) ejecutaremos el comando:
Nos mostrará el nombre de la máquina virtual, el estado (PowerState), el número de vCPUs asignados y la cantidad de vRAM asiganda: Podremos hacer filtros, por ejemplo para mostrar sólo las máquinas virtuales encendidas (con PowerState = PoweredOn) ejecutaremos:
Para mostrar solo las máquinas virtuales apagadas:
Además de obtener datos también podremos interactuar con las máquinas virtuales. Por ejemplo, para iniciar una máquina virtual detenida ejecutaremos el comando:
El comando anterior iniciará la máquina virtual con nombre "Ubuntu 10":
Para detener una máquina virtual ejecutaremos el comando:
Donde "XPDelphi" será el nombre de la máquina virtual a detener. Dependiendo de la acción puede que nos pida confirmación, de ser así introduciremos "s" y pulsaremos INTRO: Otros ejemplos para obtener datos estadísticos, por ejemplo para obtener métricas de acceso a disco desde una fecha a una fecha, para una máquina virtual (por ejempo "SRVPROYECTOA", ejecutaremos el comando:
Para métricas de memoria RAM:
Para métricas de CPU:
Para obtener todos los snapshot realizados a una máquina virtual ejecutaremos el comando:
Donde "SRVPROYECTOA" será la máquina virtual de la que mostraremos los snapshots realizados: Si queremos desactivar los mensajes de aviso (warnings) al ejecutar determinados comandos ejecutaremos este otro comando:
Los resultados de la ejecución de comandos que devuelven datos se pueden formatear y personalizar. Por ejemplo, para mostrar los datos de los snapshot de una máquina virtual en forma de detalle ejecutaremos el comando:
Para mostrar todos los snapshots de todas las máqunias virtuales del servidor al que estamos conectados, mostrando las columnas vm, name, iscurrent, sizegb:
Para mostrar los snapshots de las máquinas virtuales de un Resource Pool determinado ejecutaremos el comando:
También podremos guardar los resultados en un ficheor de texto. Por ejemplo, para guardar las máquinas virtuales del servidor al que estamos conectados en un fichero de texto ejecutaremos:
Nos guardará los datos en un fichero de texto plano: Para guardar más datos de las máquinas virtuales (nombre, estado, vCPU, vRAM, espacio aprovisionado, espacio usado, notas, versión):
Nos habrá guardado algo así en el fichero de salida:
El comando anterior eliminará el snapshot con descripción "Antes de Service Pack 2" de la máquina virtual "SRVCERCO":
Cómo usar VMware VIX API para desarrollar aplicación Visual Studio .NET C# C Sharp para administrar ESXi y vCenterVMware nos proporciona, junto con las VMware vSphere PowerCLI las VMware VIX API, que básicamente son los mismos comandos disponibles en las PowerCLI pero para plataformas .NET. Con VMware VIX API podremos desarrollar nuestras propias aplicaciones para gestión y administración de nuestros servidores VMware ESXi y VMware vCenter Server. A continuación mostraremos una aplicación completa con código fuente disponible (gratuito) como ejemplo de uso de VMware VIX API. En primer lugar deberemos disponer de Microsoft Visual Studio .NET en alguna de sus versiones. A continuación mostramos alguinos tutoriales sobre cómo instalarlo y crear una aplicación con Visual Studio .NET:
Abriremos Microsoft Visual Studio .NET, en nuestro caso usaremos la versión 2013, y crearemos un nuevo proyecto C# C Sharp (el procedimiento será el mismo para Visual Basic VB.NET). En los tutoriales anteriores explicamos cómo crear un nuevo proyecto paso a paso. Una vez creado el proyecto Visual Studio .Net (C#), agregaremos la referencia correspondiente a VMware VIX API. Para ello pulsaremos en el menú "PROYECTO" - "Agregar referencia": Pulsaremos en "Examinar": Accederemos a la carpeta de instalación de VMware VIX API, por defecto en:
Y seleccionaremos la librería dll "VMware.Vim.dll", pulsaremos "Agregar": Accederemos al código de nuestro formulario principal, donde usaremos VIX API, y añadiremos el using siguiente:
A partir de ahora ya podremos usar VMware VIX API para gestionar y acceder a servidores VMware ESXi y VMware vCenter Server desde nuestra aplicación C# .NET. Como ejemplo hemos desarrollado una aplicación completa que permite obtener todas las máquinas virtuales (y realizar filtros) y muchos datos como: nombre máquina virtual, estado (PowerState), tiempo de inicio, estado conexión, vRAM, vCPU, cores por socket, estado VMware Tools, hostname, IP, sistema operativo , ruta ficheros MV, ID Guest, Uuid, WWN, anotaciones, número de discos, tamaño, ficheros que componen la MV, alarmas, etc. Esta aplicación también permite realizar acciones sobre máquinas virtuales tales como: iniciar máquina virtual, apagar, pausar, resetear, reiniciar sistema operativo, apagar sistema operativo, actualizar VMware Tools, instalar VMware Tools, desmontar CD VMware Tools, cambiar nombre a máquina virtual, crear snapshot, etc. Los componentes que usaremos para realizar la aplicación AjpdSoft Gestión VMware ESXi y vCenter: El enlace para descargar la aplicación completa con el código fuente en Visual C# .NET 2013: La aplicación AjpdSoft Gestión VMware ESXi y vCenter en funcionamiento: Anexo: listado código fuente completo de apliación de ejemplo VIX API en C SharpA continuación mostramos el código fuente (source code) completo de la aplicación AjpdSoft Gestión VMware ESXi y vCenter:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using VMware.Vim; using System.Collections.Specialized; using System.Configuration; namespace AjpdSoftAccesoVMwareESX { public partial class formAjpdSoftVMwareESX : Form { public VimClient accesoESX = new VimClient(); public formAjpdSoftVMwareESX() { InitializeComponent(); } public bool ampliarTamanoDiscoVirtual(string nombreVM, int numeroDisco, int nuevoTamanoBytes) { NameValueCollection filter = new NameValueCollection(); filter.Add("Summary.vm", nombreVM); VMware.Vim.VirtualMachine vm = (VMware.Vim.VirtualMachine)accesoESX.FindEntityView(typeof(VMware.Vim.VirtualMachine), null, filter, null); try { NameValueCollection nvc = new NameValueCollection(); nvc.Add("name", "Datacenter"); VMware.Vim.Datacenter dc = (VMware.Vim.Datacenter)accesoESX.FindEntityView(typeof(VMware.Vim.Datacenter), null, nvc, null); VirtualDiskManager vdm = new VirtualDiskManager(accesoESX, new ManagedObjectReference()); vdm.ExtendVirtualDisk_Task(vm.Layout.Disk[numeroDisco].DiskFile[0].ToString(), dc.MoRef, nuevoTamanoBytes * 1024 * 1024, false); return true; } catch (Exception errorC) { MessageBox.Show("Ha habido un error:" + Environment.NewLine + Environment.NewLine + errorC.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return false; } } private void btPowerOn_Click(object sender, EventArgs e) { string mvSel; if (lsMVESX.SelectedItems.Count > 0) { mvSel = lsMVESX.SelectedItems[0].Text; if (MessageBox.Show("¿Está seguro que desea encender la máquina virtual " + mvSel + "?", "Encender máquina virtual", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { ManagedObjectReference _svcRef = new ManagedObjectReference(); _svcRef.Type = "ServiceInstance"; _svcRef.Value = "ServiceInstance"; try { NameValueCollection filterForVM = new NameValueCollection(); filterForVM.Add("Name", mvSel); VirtualMachine vm = (VirtualMachine)accesoESX.FindEntityView(typeof(VirtualMachine), null, filterForVM, null); vm.PowerOnVM(vm.Runtime.Host); } catch (Exception errorC) { MessageBox.Show("Ha habido un error:" + Environment.NewLine + Environment.NewLine + errorC.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } else MessageBox.Show("Debe seleccionar la máquina virtual a encender.", "Encender máquina virtual", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } private void formAjpdSoftVMwareESX_FormClosed(object sender, FormClosedEventArgs e) { GuardarConfiguracion proUtilidades = new GuardarConfiguracion(); proUtilidades.guardarValorConfiguracion("URL Servidor ESX vCenter", txtURLESX.Text); proUtilidades.guardarValorConfiguracion("Usuario", txtUsuarioESX.Text); proUtilidades.guardarValorConfiguracion("Filtrar por", lsFiltrarPor.Text); proUtilidades.guardarValorConfiguracion("Valor filtro", lsValorFiltro.Text); //guardar contraseña cifrada cifrarAES cifradoAES = new cifrarAES(); proUtilidades.guardarValorConfiguracion("Contraseña", cifradoAES.cifrarTextoAES(txtContrasenaESX.Text, "AjpdSoft_Frase_Encriptado", "AjpdSoft_Frase_Encriptado", "MD5", 22, "1234567891234567", 128)); try { //Cerramos la conexión con el servidor ESX accesoESX.Disconnect(); } catch { } } private void btPowerOff_Click(object sender, EventArgs e) { string mvSel; if (lsMVESX.SelectedItems.Count > 0) { mvSel = lsMVESX.SelectedItems[0].Text; if (MessageBox.Show("¿Está seguro que desea apagar la máquina virtual " + mvSel + "?", "Apagar máquina virtual", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { ManagedObjectReference _svcRef = new ManagedObjectReference(); _svcRef.Type = "ServiceInstance"; _svcRef.Value = "ServiceInstance"; try { NameValueCollection filterForVM = new NameValueCollection(); filterForVM.Add("Name", mvSel); VirtualMachine vm = (VirtualMachine)accesoESX.FindEntityView(typeof(VirtualMachine), null, filterForVM, null); vm.PowerOffVM(); } catch (Exception errorC) { MessageBox.Show("Ha habido un error:" + Environment.NewLine + Environment.NewLine + errorC.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } else MessageBox.Show("Debe seleccionar la máquina virtual a apagar.", "Apagar máquina virtual", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } private void btRenombrarMV_Click(object sender, EventArgs e) { string mvSel; if (lsMVESX.SelectedItems.Count > 0) { if (txtNombreVM.Text == "") { MessageBox.Show("Debe indicar el nuevo nombre de la máquina virtual.", "Renombrar máquina virtual", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else { mvSel = lsMVESX.SelectedItems[0].Text; if (MessageBox.Show("¿Está seguro que desea renombrar la máquina virtual [" + mvSel + "] por [" + txtNombreVM.Text + "]?", "Renombrar máquina virtual", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { ManagedObjectReference _svcRef = new ManagedObjectReference(); _svcRef.Type = "ServiceInstance"; _svcRef.Value = "ServiceInstance"; try { NameValueCollection filterForVM = new NameValueCollection(); filterForVM.Add("Name", mvSel); VirtualMachine vm = (VirtualMachine)accesoESX.FindEntityView(typeof(VirtualMachine), null, filterForVM, null); VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec(); vmConfigSpec.Name = txtNombreVM.Text; // Cambiar nombre a MV vm.ReconfigVM_Task(vmConfigSpec); } catch (Exception errorC) { MessageBox.Show("Ha habido un error:" + Environment.NewLine + Environment.NewLine + errorC.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } } else MessageBox.Show("Debe seleccionar la máquina virtual a renombrar.", "Renombrar máquina virtual", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } private void btReiniciarGuest_Click(object sender, EventArgs e) { string mvSel; if (lsMVESX.SelectedItems.Count > 0) { mvSel = lsMVESX.SelectedItems[0].Text; if (MessageBox.Show("¿Está seguro que desea reiniciar el sistema operativo " + "de la máquina virtual [" + mvSel + "]?", "Reiniciar sistema operativo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { ManagedObjectReference _svcRef = new ManagedObjectReference(); _svcRef.Type = "ServiceInstance"; _svcRef.Value = "ServiceInstance"; try { NameValueCollection filterForVM = new NameValueCollection(); filterForVM.Add("Name", mvSel); VirtualMachine vm = (VirtualMachine)accesoESX.FindEntityView(typeof(VirtualMachine), null, filterForVM, null); vm.RebootGuest(); } catch (Exception errorC) { MessageBox.Show("Ha habido un error:" + Environment.NewLine + Environment.NewLine + errorC.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } else MessageBox.Show("Debe seleccionar la máquina virtual a reiniciar.", "Reiniciar máquina virtual", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } private void btExportarCSV_Click(object sender, EventArgs e) { dlGuardar.Filter = "Fichero CSV (*.csv)|*.csv"; dlGuardar.FileName = "Máquinas virtuales ESX"; dlGuardar.Title = "Exportar a CSV"; if (dlGuardar.ShowDialog() == DialogResult.OK) { StringBuilder csvMemoria = new StringBuilder(); foreach (ColumnHeader columnasLista in lsMVESX.Columns) { csvMemoria.Append(String.Format(""{0}";", columnasLista.Text)); } csvMemoria.AppendLine(); foreach (ListViewItem elementosLista in lsMVESX.Items) { foreach (ListViewItem.ListViewSubItem lvs in elementosLista.SubItems) { if (lvs.Text.Trim() == string.Empty) csvMemoria.Append(""";"); else csvMemoria.Append(String.Format(""{0}";", lvs.Text)); } csvMemoria.AppendLine(); } System.IO.StreamWriter sw = new System.IO.StreamWriter(dlGuardar.FileName, false, System.Text.Encoding.Default); sw.Write(csvMemoria.ToString()); sw.Close(); } } private void btSuspender_Click(object sender, EventArgs e) { string mvSel; if (lsMVESX.SelectedItems.Count > 0) { mvSel = lsMVESX.SelectedItems[0].Text; if (MessageBox.Show("¿Está seguro que desea suspender la " + "máquina virtual [" + mvSel + "]?", "Suspender MV", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { ManagedObjectReference _svcRef = new ManagedObjectReference(); _svcRef.Type = "ServiceInstance"; _svcRef.Value = "ServiceInstance"; try { NameValueCollection filterForVM = new NameValueCollection(); filterForVM.Add("Name", mvSel); VirtualMachine vm = (VirtualMachine)accesoESX.FindEntityView(typeof(VirtualMachine), null, filterForVM, null); vm.SuspendVM(); } catch (Exception errorC) { MessageBox.Show("Ha habido un error:" + Environment.NewLine + Environment.NewLine + errorC.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } else MessageBox.Show("Debe seleccionar la máquina virtual a suspender.", "Reiniciar máquina virtual", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } private void btActualizarVMwareTools_Click(object sender, EventArgs e) { string mvSel; if (lsMVESX.SelectedItems.Count > 0) { mvSel = lsMVESX.SelectedItems[0].Text; if (MessageBox.Show("¿Está seguro que desea actualizar las VMware Tools de la " + "máquina virtual [" + mvSel + "]?", "Actualizar VMware Tools", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { ManagedObjectReference _svcRef = new ManagedObjectReference(); _svcRef.Type = "ServiceInstance"; _svcRef.Value = "ServiceInstance"; try { NameValueCollection filterForVM = new NameValueCollection(); filterForVM.Add("Name", mvSel); VirtualMachine vm = (VirtualMachine)accesoESX.FindEntityView(typeof(VirtualMachine), null, filterForVM, null); vm.UpgradeTools(""); } catch (Exception errorC) { MessageBox.Show("Ha habido un error:" + Environment.NewLine + Environment.NewLine + errorC.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } else MessageBox.Show("Debe seleccionar la máquina virtual a actualizar las VMware Tools.", "Actualizar VMware Tools", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } private void btInstalarVMwareTools_Click(object sender, EventArgs e) { string mvSel; if (lsMVESX.SelectedItems.Count > 0) { mvSel = lsMVESX.SelectedItems[0].Text; if (MessageBox.Show("¿Está seguro que desea instalar las VMware Tools en la " + "máquina virtual [" + mvSel + "]?", "Instalar VMware Tools", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { ManagedObjectReference _svcRef = new ManagedObjectReference(); _svcRef.Type = "ServiceInstance"; _svcRef.Value = "ServiceInstance"; try { NameValueCollection filterForVM = new NameValueCollection(); filterForVM.Add("Name", mvSel); VirtualMachine vm = (VirtualMachine)accesoESX.FindEntityView(typeof(VirtualMachine), null, filterForVM, null); vm.MountToolsInstaller(); } catch (Exception errorC) { MessageBox.Show("Ha habido un error:" + Environment.NewLine + Environment.NewLine + errorC.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } else MessageBox.Show("Debe seleccionar la máquina virtual para instalar las VMware Tools.", "Instalar VMware Tools", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } private void btApagarSO_Click(object sender, EventArgs e) { string mvSel; if (lsMVESX.SelectedItems.Count > 0) { mvSel = lsMVESX.SelectedItems[0].Text; if (MessageBox.Show("¿Está seguro que desea apagar el sistema operativo " + "de la máquina virtual [" + mvSel + "]?", "Apagar sistema operativo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { ManagedObjectReference _svcRef = new ManagedObjectReference(); _svcRef.Type = "ServiceInstance"; _svcRef.Value = "ServiceInstance"; try { NameValueCollection filterForVM = new NameValueCollection(); filterForVM.Add("Name", mvSel); VirtualMachine vm = (VirtualMachine)accesoESX.FindEntityView(typeof(VirtualMachine), null, filterForVM, null); vm.ShutdownGuest(); } catch (Exception errorC) { MessageBox.Show("Ha habido un error:" + Environment.NewLine + Environment.NewLine + errorC.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } else MessageBox.Show("Debe seleccionar la máquina virtual a apagar el sistema operativo.", "Apagar Sistema Operativo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } private void formAjpdSoftVMwareESX_Load(object sender, EventArgs e) { //Establecemos las propiedades del ListView lsMVESX.View = System.Windows.Forms.View.Details; lsMVESX.GridLines = true; lsMVESX.FullRowSelect = true; //Añadimos las columnas al ListView lsMVESX.Columns.Add("MV", 130); lsMVESX.Columns.Add("PW Estado", 70); lsMVESX.Columns.Add("Tiempo inicio", 110); lsMVESX.Columns.Add("Estado", 70); lsMVESX.Columns.Add("vRAM", 60); lsMVESX.Columns.Add("vCPU", 60); lsMVESX.Columns.Add("Cores x socket", 80); lsMVESX.Columns.Add("Estado Tools", 100); lsMVESX.Columns.Add("Hostname", 80); lsMVESX.Columns.Add("IP", 100); lsMVESX.Columns.Add("SO", 150); lsMVESX.Columns.Add("Path", 150); lsMVESX.Columns.Add("ID Guest", 80); lsMVESX.Columns.Add("Uuid", 80); lsMVESX.Columns.Add("WWN", 80); lsMVESX.Columns.Add("Anotaciones", 80); lsMVESX.Columns.Add("Nº Discos MV", 50); lsMVESX.Columns.Add("Tamaño Discos MV", 50); lsMVESX.Columns.Add("Nº Discos Guest", 50); lsMVESX.Columns.Add("Tamaño Discos Guest", 80); lsMVESX.Columns.Add("Ficheros MV", 80); lsMVESX.Columns.Add("Alarma", 80); GuardarConfiguracion proUtilidades = new GuardarConfiguracion(); txtURLESX.Text = proUtilidades.leerValorConfiguracion("URL Servidor ESX vCenter"); txtUsuarioESX.Text = proUtilidades.leerValorConfiguracion("Usuario"); lsFiltrarPor.Text = proUtilidades.leerValorConfiguracion("Filtrar por"); lsValorFiltro.Text = proUtilidades.leerValorConfiguracion("Valor filtro"); //leer contraseña cifrada cifrarAES cifradoAES = new cifrarAES(); string contrasenaCifrada = ""; contrasenaCifrada = proUtilidades.leerValorConfiguracion("Contraseña"); txtContrasenaESX.Text = cifradoAES.descifrarTextoAES(contrasenaCifrada, "AjpdSoft_Frase_Encriptado", "AjpdSoft_Frase_Encriptado", "MD5", 22, "1234567891234567", 128); } private void lsMVESX_SelectedIndexChanged(object sender, EventArgs e) { if (lsMVESX.SelectedItems.Count > 0) txtNombreVM.Text = lsMVESX.SelectedItems[0].Text; } private void btSnapshot_Click(object sender, EventArgs e) { string mvSel; if (lsMVESX.SelectedItems.Count > 0) { if (txtSnapshotNombre.Text == "") { MessageBox.Show("Debe indicar el nombre del snapshot que se creará.", "Snapshot máquina virtual", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else { mvSel = lsMVESX.SelectedItems[0].Text; if (MessageBox.Show("¿Está seguro que desea crear un snapshot del momento actual para la MV [" + mvSel + "]?", "Snapshot máquina virtual", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { ManagedObjectReference _svcRef = new ManagedObjectReference(); _svcRef.Type = "ServiceInstance"; _svcRef.Value = "ServiceInstance"; try { NameValueCollection filterForVM = new NameValueCollection(); filterForVM.Add("Name", mvSel); VirtualMachine vm = (VirtualMachine)accesoESX.FindEntityView(typeof(VirtualMachine), null, filterForVM, null); vm.CreateSnapshot(txtSnapshotNombre.Text, txtSnapshotDescripcion.Text, opSnapshotMemoria.Checked, opSnapshotQuiesceFileSystem.Checked); } catch (Exception errorC) { MessageBox.Show("Ha habido un error:" + Environment.NewLine + Environment.NewLine + errorC.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } } else MessageBox.Show("Debe seleccionar la máquina virtual a renombrar.", "Renombrar máquina virtual", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } private void btDesconectarESXvCenter_Click(object sender, EventArgs e) { try { accesoESX.Disconnect(); } catch (Exception errorC) { MessageBox.Show("Ha habido un error:" + Environment.NewLine + Environment.NewLine + errorC.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } private void btConectarESXvCenter_Click(object sender, EventArgs e) { if (!opLimpiarLista.Checked) lsMVESX.Items.Clear(); try { // Conectamos con vSphere ESX - vCenter servicio web accesoESX.Connect(txtURLESX.Text); // Iniciamos sesión en el servidor VMware ESX - vCenter con usuario y contraseña accesoESX.Login(txtUsuarioESX.Text, txtContrasenaESX.Text); //Filtramos las máquinas virtuales (por el campo y valor que queramos) NameValueCollection filter = new NameValueCollection(); if (opAplicarFiltro.Checked) filter.Add(lsFiltrarPor.Text, lsValorFiltro.Text); IList
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; using System.Windows.Forms; namespace AjpdSoftAccesoVMwareESX { class GuardarConfiguracion { //leer valor de configuración del fichero app.config public string leerValorConfiguracion(string clave) { try { string resultado = ConfigurationManager.AppSettings[clave].ToString(); return resultado; } catch { return ""; } } //escribir valor de configuración en fichero app.config public void guardarValorConfiguracion(string clave, string valor) { try { Configuration ficheroConfXML = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); //eliminamos la clave actual (si existe), si no la eliminamos //los valores se irán acumulando separados por coma ficheroConfXML.AppSettings.Settings.Remove(clave); //asignamos el valor en la clave indicada ficheroConfXML.AppSettings.Settings.Add(clave, valor); //guardamos los cambios definitivamente en el fichero de configuración ficheroConfXML.Save(ConfigurationSaveMode.Modified); } catch { /* MessageBox.Show("Error al guardar valor de configuración: " + System.Environment.NewLine + System.Environment.NewLine + ex.GetType().ToString() + System.Environment.NewLine + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);*/ } } } }
using System; using System.Security.Cryptography; using System.Text; using System.IO; namespace AjpdSoftAccesoVMwareESX { class cifrarAES { public string cifrarTextoAES(string textoCifrar, string palabraPaso, string valorRGBSalt, string algoritmoEncriptacionHASH, int iteraciones, string vectorInicial, int tamanoClave) { try { byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(vectorInicial); byte[] saltValueBytes = Encoding.ASCII.GetBytes(valorRGBSalt); byte[] plainTextBytes = Encoding.UTF8.GetBytes(textoCifrar); PasswordDeriveBytes password = new PasswordDeriveBytes(palabraPaso, saltValueBytes, algoritmoEncriptacionHASH, iteraciones); byte[] keyBytes = password.GetBytes(tamanoClave / 8); RijndaelManaged symmetricKey = new RijndaelManaged(); symmetricKey.Mode = CipherMode.CBC; ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, InitialVectorBytes); MemoryStream memoryStream = new MemoryStream(); CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write); cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); cryptoStream.FlushFinalBlock(); byte[] cipherTextBytes = memoryStream.ToArray(); memoryStream.Close(); cryptoStream.Close(); string textoCifradoFinal = Convert.ToBase64String(cipherTextBytes); return textoCifradoFinal; } catch { return null; } } public string descifrarTextoAES(string textoCifrado, string palabraPaso, string valorRGBSalt, string algoritmoEncriptacionHASH, int iteraciones, string vectorInicial, int tamanoClave) { try { byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(vectorInicial); byte[] saltValueBytes = Encoding.ASCII.GetBytes(valorRGBSalt); byte[] cipherTextBytes = Convert.FromBase64String(textoCifrado); PasswordDeriveBytes password = new PasswordDeriveBytes(palabraPaso, saltValueBytes, algoritmoEncriptacionHASH, iteraciones); byte[] keyBytes = password.GetBytes(tamanoClave / 8); RijndaelManaged symmetricKey = new RijndaelManaged(); symmetricKey.Mode = CipherMode.CBC; ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, InitialVectorBytes); MemoryStream memoryStream = new MemoryStream(cipherTextBytes); CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read); byte[] plainTextBytes = new byte[cipherTextBytes.Length]; int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); memoryStream.Close(); cryptoStream.Close(); string textoDescifradoFinal = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); return textoDescifradoFinal; } catch { return null; } } } }
Artículos relacionados
CréditosArtículo realizado íntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft. Anuncios
Enviado el Domingo, 20 abril a las 23:33:59 por ajpdsoft
|
|