jueves, 26 de agosto de 2021

¿Se pueden cambiar los mensajes de error de asp.net MVC del ingles al español?

Como sabemos por defecto asp.Net MVC 5 los mensajes de error por defecto estan en ingles; como sabemos estos se muestran en el ValidationSummary es posible cambiarlos a español de una forma muy sencilla:

  1. Instalar el paquete de idioma en español en Manage Nuget Packages llamado
    • Microsoft.AspNet.Identity.core.es
  2. Después de dentro del archivo web.config del proyecto buscamos la etiqueta <system.web> y dentro de ella agregamos la siguiente linea:
    • <globalization culture="es-MX" uiCulture="es" />
Listo con esto los mensajes de nuestra aplicación aparecerán en español.

Espero les sea útil.

jueves, 5 de agosto de 2021

Carga diferida (Lazy Loading) en Entity Framework

Como sabemos la por defecto Entity Framework carga los datos relacionados con llaves al general una consulta; esto puede llevar mas tiempo de procesador y hace mas tardada.

Desactivándola  podremos cargar datos mas rápidamente.

public partial class DBEntities : DbContext

{

    public SchoolDBEntities(): base("name=DBEntities")

    {

        this.Configuration.LazyLoadingEnabled = false;

    }

 

    protected override void OnModelCreating(DbModelBuilder modelBuilder)

    {

    }

}

También se puede sobre cargar el método del constructor del contexto para activar y desactivarlo según lo necesitemos:

public partial class DBEntities : DbContext

{

    public SchoolDBEntities(): base("name=DBEntities")

    {

        this.Configuration.LazyLoadingEnabled = false;

    }

 

    public SchoolDBEntities(bool LazyLoadingEnabled): base("name=DBEntities")

    {

        this.Configuration.LazyLoadingEnabled = LazyLoadingEnabled;
    }

 

    protected override void OnModelCreating(DbModelBuilder modelBuilder)

    {

    }

}


miércoles, 28 de julio de 2021

Truncar y reducir el tamaño del log de transacciones de SQL Server

Siempre es requerido estar revisando el tamaño de nuestros archivos de base de datos, los archivos de Log pueden crecer de forma diferente al archivo de datos de una base de datos; este archivo puede limpiarse para liberar espacio en nuestro servidor.

El truncamiento del registro de transacciones (log de transacciones)  elimina de manera lógica  los archivos de registro de transacciones  de una base de datos de SQL Server, El truncamiento del registro no reduce el tamaño del archivo de registro físico.

Para reducir el tamaño físico de un archivo de registro físico; la única forma es realizando una copia de seguridad de registros y después realizar el truncado del registro.

Para truncar el log es muy sencillo simplemente se siguen los siguientes pasos:

Paso1: Para truncar el registro de transacciones, se realiza la  copia de seguridad del registro de transacciones.

BACKUP LOG [BasedeDatos] TO  DISK = N'C:\Backup\Backup.bak'

Paso2: Reducir el tamaño físico del registro de transacciones:

USE [BasedeDatos]

GO

DBCC SHRINKFILE (N'nombredelLog', 0, TRUNCATEONLY)

GO

Si no conoces el nombre del archivo de registros podemos usar la instrucción:
Select * from Sys.database_files

domingo, 18 de junio de 2017

Exportar Datagrid a Excel C#

Hola Exportar a Excel es algo muy común que requieren nuestras aplicaciones que trabajan con datos, siempre es útil poder permitir a nuestros usuarios manipular sus datos desde excel

Primero que nada es necesario importar la librería de Office:

using Microsoft.Office.Interop.Excel;

General mente se encuentra en:


C:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Office15\Microsoft.Office.Interop.Excel.dll

La función es la siguiente:

public void _Exportar(System.Data.DataTable dgvDatos)
        {

            try
            {
                string temp;
                int iColumnas = 0;
                //Inicializacion de la conexion
                Microsoft.Office.Interop.Excel.Application xlsApp = new Microsoft.Office.Interop.Excel.Application();
             
                //Objento de Sheet
                Worksheet xlsSheet;
                //Objento de Libro
                Workbook xlsBook;
                //Indica si se ve el Excel o no
                xlsApp.Visible = false;

                xlsBook = xlsApp.Workbooks.Add(true);
                xlsSheet = (Worksheet)xlsBook.ActiveSheet;

                //Inicia a leer el datagrid para preparar la cabecera
                for (int iCol = 0; iCol < dgvDatos.Columns.Count; iCol++)
                {
                    iColumnas++;
                    //Agrega la cabecera a la hoja
                    xlsSheet.Cells[1, iColumnas] = dgvDatos.Columns[iCol].ColumnName;
                }

                for (int iRow = 0; iRow < dgvDatos.Rows.Count; iRow++)
                {
                    int Col = 0;
                    for (int iCol = 0; iCol < dgvDatos.Columns.Count; iCol++)
                    {
                        Col++;
                        temp = dgvDatos.Rows[iRow].ItemArray[iCol].ToString();
                        xlsSheet.Cells[iRow + 2, Col] = temp;

                    }
                }

                xlsSheet.Columns.AutoFit(); //Ajusta ancho de todas las columnas
                xlsApp.Visible = true;
                //xlsApp.Quit();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

Espero les sea útil.

martes, 25 de agosto de 2015

NotifyIcon ocultar aplicación en el área de notificación de Windows

Separar un String en torno a otro (Split con String)
Ocultar nuestro programa en la barra de tareas es algo que podemos usar cueando un programa no requiere de supervision o queremos que se ejecute en segundo plano pudiendo acceder a  el en cualquier momento.

Para lo cual se usa una conjunción de los componenetes notifyIcon y contextMenuStrip

        private void ejecutarLimpiezaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Tipo de icono a mostrar el el globo informativo (Info, Error, None, Warning)
            notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
            //Título del balón informativo (el nombre de la aplicación)
            notifyIcon1.BalloonTipTitle = Application.ProductName;
            //Texto del balón informativo
            notifyIcon1.BalloonTipText = "Ejecutado limpieza";
            //Tiempo que aparecerá hasta ocultarse automáticamente
            notifyIcon1.ShowBalloonTip(3);
            listBox1.Items.Clear();
            listFiles(textBox1.Text);
            LogFile();
            notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
            notifyIcon1.BalloonTipTitle = Application.ProductName;
            notifyIcon1.BalloonTipText = "Limpieza terminada";
            notifyIcon1.ShowBalloonTip(8);
        }

        private void terminarAplicacionToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void mostrarAplicacionToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Show();
            WindowState = FormWindowState.Normal;
            Activate();
            notifyIcon1.Visible = false;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            notifyIcon1.Icon = this.Icon;
            notifyIcon1.ContextMenuStrip = this.contextMenuStrip1;
            notifyIcon1.Text = Application.ProductName;
            notifyIcon1.Visible = true;
            this.Visible = false;

            notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
            notifyIcon1.BalloonTipTitle = Application.ProductName;
            notifyIcon1.BalloonTipText = "La aplicación ha quedado ocultada " +
                "en el área de notificación. Para mostrarla haga " +
                "doble clic sobre el icono";
            notifyIcon1.ShowBalloonTip(8);
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                notifyIcon1.Icon = this.Icon;
                notifyIcon1.ContextMenuStrip = this.contextMenuStrip1;
                notifyIcon1.Text = Application.ProductName;
                notifyIcon1.Visible = true;
                this.Visible = false;

                notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
                notifyIcon1.BalloonTipTitle = Application.ProductName;
                notifyIcon1.BalloonTipText = "La aplicación ha quedado ocultada " +
                    "en el área de notificación. Para mostrarla haga " +
                    "doble clic sobre el icono";
                notifyIcon1.ShowBalloonTip(8);
            }
        }

        private void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            Show();
            WindowState = FormWindowState.Normal;
            Activate();
            notifyIcon1.Visible = false;
        }

viernes, 21 de agosto de 2015

Enviado Correo electronico desde C#

Separar un String en torno a otro (Split con String)
Para enviar correo electrónico desde nuestro código de forma muy sencilla.Para hacerlo necesitaremos 3 objetos o clases integradas en el Framework de .NET :

- System.Net.Mail.MailMessege: Nos permite encapsular todos las propiedades de nuestro mensaje.

- System.Net.Mail.MailAddress: Representa una dirección de correo electrónico.

- System.Net.Mail.SmtpClient: Representa un cliente de correo electrónico basado en el protocolo SMTP.

Veamos el codigo:

    public void EnviarCorreo()
    {
        /*-------------------------MENSAJE DE CORREO Objeto MailMessage----------------------*/
        //Creamos un nuevo Objeto de mensaje
        System.Net.Mail.MailMessage mmsg = new System.Net.Mail.MailMessage();

        //Direccion de correo electronico a la que queremos enviar el mensaje pueden agregarse tantos destinatarios como sea posible mediante la función Add ya que es una coleccion
        mmsg.To.Add("destinatario@servidordominio.com");

        //msg.To.Add("destinatario2@servidordominio.com");
        //msg.To.Add("destinatario3@otrodominio.com");


        //Asunto
        mmsg.Subject = "Asunto del correo";
        mmsg.SubjectEncoding = System.Text.Encoding.UTF8;

        //Direccion de correo electronico que queremos que reciba una copia del mensaje si es que se requiere esto es opcional
        mmsg.Bcc.Add("destinatariocopia@servidordominio.com"); 

        //Cuerpo del Mensaje
        mmsg.Body = "Texto del contenio del mensaje de correo";
        mmsg.BodyEncoding = System.Text.Encoding.UTF8;
        mmsg.IsBodyHtml = false; //Si no queremos que se envíe como HTML se pone en true si se crea el cuerpo con HTML esto noda una amplia funcion en los formatos de correos.

        //Correo electronico desde la que enviamos el mensaje
        mmsg.From = new System.Net.Mail.MailAddress("micuenta@servidordominio.com");


        /*-------------------------CLIENTE DE CORREO Objeto SmtpClient---------------------*/

        //Creamos un objeto de cliente de correo
        System.Net.Mail.SmtpClient cliente = new System.Net.Mail.SmtpClient();

        //Hay que crear las credenciales del correo emisor es decir el acceso de nuestro correo electronico
        cliente.Credentials = new System.Net.NetworkCredential("micuenta@servidordominio.com", "micontraseña");

        //Lo siguiente es obligatorio si enviamos el mensaje desde Gmail o servidores que usan SSL
        /*
        cliente.Port = 587;  
        cliente.EnableSsl = true;
        */

        cliente.Host = "mail.servidordominio.com"; 


        /*-------------------------ENVIO DE CORREO----------------------*/

        try
        {
            //Enviamos el mensaje      
            cliente.Send(mmsg);
        }
        catch (System.Net.Mail.SmtpException ex)
        {
            //Aquí gestionamos los errores al intentar enviar el correo
        }
    }

Determinar si tu laptop usa esta usado la bateria o la corriente usando C#

Separar un String en torno a otro (Split con String)
Para algunos procesos es indispensable poder saber si se usa la batería o el nivel de carga si se esta usando una laptop por ejemplo para no dejar a medias un proceso por falta de batería que pueda dejar colgado el servidor o algo parecido... podemos incluir en nuestras aplicaciones un método para evitar esto; yo en mi caso lo usare para saber en que momento una lap se cambia a la batería lap que dejo conectada para hacer respaldos pero si se va la luz en la noche cambiara a la batería y quiero que me avise para apagar bien los servidores y evitar perdida de información por daños..

C#


private void btnPower_Click(object sender, EventArgs e)
{
   PowerLineStatus status = SystemInformation.PowerStatus.PowerLineStatus;
    if (status == PowerLineStatus.Offline)
        MessageBox.Show("Utilizando Bateria");
    else
        MessageBox.Show("Corriente directa");


}

lunes, 27 de julio de 2015

Contenido de un listbox a un archivo plano

Separar un String en torno a otro (Split con String)
Para agregar los items de ubn list box a un archivo es muy sencillo se usa el siguiente codigo:

        private void BtnToCSV_Click(object sender, EventArgs e)
        {
            String Correccion = "";
            foreach (String Line in listBox2.Items)
            {
                Correccion = Correccion + Line + "\n";
            }

            SaveFileDialog dlg = new SaveFileDialog();

            dlg.Filter = "csv files (*.csv)|*.csv";
            dlg.Title = "Export in CSV format";

            if (dlg.ShowDialog() == DialogResult.OK)
            {
                if (dlg.FileName != "")
                {
                    //Pass the filepath and filename to the StreamWriter Constructor
                    StreamWriter sw = new StreamWriter(dlg.FileName);

                    //Write a line of text
                    sw.Write(Correccion);

                    //Close the file
                    sw.Close();
                }
            }
}

Separar un String en torno a otro (Split con String)

Separar un String en torno a otro (Split con String)
Para poder realizar una separación de cadena usando otra cadena , es muy sencillo solo hay que usar la fucion: public string[] Split( string[] separator, StringSplitOptions options ) creado un String[] de un solo elemento el que deseamos separar ejemplo:
using System;

public class SplitTest {
    public static void Main() {

        string CadenaCompleta= "Esta a es la cadena que separeaemos a partir de aqui.... esta seria la parte separada";
        string[] stringSeparators = new string[] { "aqui...." };

        string [] split = CadenaCompleta.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);

        foreach (string s in split) {

            if (s.Trim() != "")
                Console.WriteLine(s);
        }
    }
}
Esto nos separá la cadena por medio del palabra "aqui...."

sábado, 11 de julio de 2015

¿Conoces el “Modo Dios” de Windows?

 Se trata de un menú oculto que sólo está disponible si realizas un sencillo truco, que te vamos a explicar.
 El “Modo Dios” está disponible en Windows Vista, Windows 7, Windows 8 y Windows 8.1.

¿Qué es el “Modo Dios”?

 El “Modo Dios” es una especie de centro de mando oculto que agrupa en un mismo lugar alrededor de 270 accesos directos a opciones de configuración de Windows (depende del equipo).   Desde este centro de mando puedes controlar cualquier aspecto que se te ocurra de tu PC: credenciales, la barra de tareas, el centro de actividades, las cuentas de usuario, idiomas… y la lista sigue. Cualquier aspecto configurable, ahí está.

 ¿Cómo se activa el “Modo Dios”?

 La verdad es que de lo sencillo que es, da casi hasta risa. Sigue estos pasos para activarlo:  

  1.  Crea una nueva carpeta. Puede ser en el Escritorio o dentro de otra carpeta. Donde tú quieras.
  2.  Nombra la carpeta así:   ModoDios.{ED7BA470-8E54-465E-825C-99712043E01C}     
  3. Automáticamente, el icono de la carpeta cambiará, mostrando el icono del Panel de Control y el nombre ModoDios. Ahora puedes darle el nombre que quieras:    
  4. Entra en la nueva carpeta y explora todas las opciones que hay. Puedes cambiar la vista de los iconos y organizarlos a tu antojo


lunes, 8 de junio de 2015

Respaldo de Configuración IIS

Puede que por muchas razones necesario mantener un respaldo de la configuración de nuestro servidor IIS teniendo en cuenta que se debe almacenar por separado los archivos de cada sitio.

Realizar una copia de respaldo 

Lo primero seria iniciar la sesion como administrador y abrir una consola de comandos (cmd.exe),ya dentro de la consola se debe cambiar el directorio: c:\windows\system32\inetsrv


Microsoft Windows [Versión 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.

C:\Users\Administrador>cd \


C:\>cd Windows\system32\inetsrv


C:\Windows\System32\inetsrv>_



Una vez que no encontremos situados en esta carpeta aremos uso de la herramienta:  appcmd.exe
para realizar el respaldo.

Si se desea mas informaicon sobre el uso de este comando se puede visitar la siguiente dirección:
Comando appcmd.exe

Para ello usaremos el comando appcmd.exe add backup ["nombre del respaldo"]


C:\Windows\System32\inetsrv>appcmd.exe add backup "Respaldo 02062015"
Se agregó el objeto de BACKUP "Respaldo 02062015"


Una vez ejecutado el comando de forma existosa pasamos a comprobar la creacion:


C:\Windows\System32\inetsrv>appcmd.exe list backup
BACKUP "Respaldo 02062015"
BACKUP "CFGHISTORY_0000000120"
BACKUP "CFGHISTORY_0000000121"
BACKUP "CFGHISTORY_0000000122"
BACKUP "CFGHISTORY_0000000123"
BACKUP "CFGHISTORY_0000000124"
BACKUP "CFGHISTORY_0000000125"
BACKUP "CFGHISTORY_0000000126"
BACKUP "CFGHISTORY_0000000127"
BACKUP "CFGHISTORY_0000000128"
BACKUP "CFGHISTORY_0000000129"

C:\Windows\System32\inetsrv>


los archivos para respladar quedan en el subdirectorio BACKUP y dentro tendra un sub direcotrio con el nombre del respaldo.


C:\Windows\System32\inetsrv>cd backup

C:\Windows\System32\inetsrv\backup>dir
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: 28E4-8D99

 Directorio de C:\Windows\System32\inetsrv\backup

02/06/2015  05:53 p.m.    <DIR>          .
02/06/2015  05:53 p.m.    <DIR>          ..
02/06/2015  05:53 p.m.    <DIR>          Respaldo 02062015
               0 archivos              0 bytes
               3 dirs  85,856,223,232 bytes libres

C:\Windows\System32\inetsrv\backup>cd "Respaldo 02062015"

C:\Windows\System32\inetsrv\backup\Respaldo 02062015>dir
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: 28E4-8D99

 Directorio de C:\Windows\System32\inetsrv\backup\Respaldo 02062015

02/06/2015  05:53 p.m.    <DIR>          .
02/06/2015  05:53 p.m.    <DIR>          ..
20/03/2014  02:52 p.m.            25,094 administration.config
25/03/2015  02:13 p.m.            88,139 applicationHost.config
08/09/2011  01:22 a.m.           266,906 MBSchema.xml
01/06/2015  07:16 p.m.            10,515 MetaBase.xml
08/09/2011  01:22 a.m.               490 redirection.config
02/06/2015  05:53 p.m.    <DIR>          schema
               5 archivos        391,144 bytes
               3 dirs  85,849,747,456 bytes libres


C:\Windows\System32\inetsrv\backup\Respaldo 02062015>


Si llegamos a tener un contratiempo, el servidor de daña o tenemos la necesidad de restaurarlo simplemente copiaremos los archivos de los sitios a las carpetas en las rutas correspondientes y el de backup de configuración a la ruta señalada revisameos que se reconosca y ejecutamos el comando para correr el respaldo.


C:\Windows\System32\inetsrv>appcmd.exe list backup
BACKUP "Respaldo 02062015"
BACKUP "CFGHISTORY_0000000120"
BACKUP "CFGHISTORY_0000000121"
BACKUP "CFGHISTORY_0000000122"
BACKUP "CFGHISTORY_0000000123"
BACKUP "CFGHISTORY_0000000124"
BACKUP "CFGHISTORY_0000000125"
BACKUP "CFGHISTORY_0000000126"
BACKUP "CFGHISTORY_0000000127"
BACKUP "CFGHISTORY_0000000128"
BACKUP "CFGHISTORY_0000000129"

c:\Windows\System32\inetsrv>appcmd.exe restore backup "Respaldo 02062015"
Configuración restaurada de la copia de seguridad "Respaldo 02062015"

c:\Windows\System32\inetsrv>


Con eso revisamos que la carpeta que copiamos ha sido reconocida. ahora procederemos a iniciar el la restauracion del respaldo para ello usaremos el comando appcmd.exe add backup ["nombre del respaldo"]


c:\Windows\System32\inetsrv>
appcmd.exe restore backup "Respaldo 02062015"
Configuración restaurada de la copia de seguridad "Respaldo 02062015"


c:\Windows\System32\inetsrv>

Si el mensaje es satisfactorio hemos restaurado la configuración de nuestro IIS


miércoles, 3 de junio de 2015

Cifrado y descifrado simétrico con Rijndael (AES) utilizando C#/

Cascaron DataLayerIng Advanced Encryption Standard (AES), también conocido como Rijndael, es un algoritmo de cifrado por bloques que es parte del estándar de Estados Unidos y actualmente es uno de los algoritmos de cifrado mas populares de criptografia simétrica.

Este tipo de algoritmos se pueden usar tanto para cifrar cadenas como archivos empecemos por las cadenas:

Implementación sobre cadenas (Strings)


La Implementación de este Algoritmo requiere los namespaces:
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

Clave y Vector de Inicio


Estos Valores son los que determinan la encripcion del algoritmo, estos valores pueden ser especificados manualmente o de manera automática por le mismo FrameWork La implementación queda definida por el siguiente código:

Rijndael rijndael = Rijndael.Create();
byte[] key = rijndael.Key;
byte[] iv  = rijndael.IV;

Es posible forzar la generación de nuevas claves y números de vectores de inicio para para el algoritmo utilizando los metodos rijndael.GenerateKey() y rijndael.GenerateIV() respectivamente.

Si el usuario o programador desea insertar los datos  para estos valores se usaran las variables strKey y strIv

byte[] key = UTF8Encoding.UTF8.GetBytes(strKey);
byte[] iv  = UTF8Encoding.UTF8.GetBytes(strIv);

Especificando estos valores manualmente es necesario garantizar que sus longitudes sean válidas para el algoritmo.  En este caso se utilizará una longitud de clave de 32 bits y una longitud de vector de inicio de 16 bits.

Array.Resize(ref key, keySize);
Array.Resize(ref iv, ivSize);

Cifrado de cadenas de texto.


Para cifrar la información se requiere de los siguientes parámetros.

  1. Cadena de texto con los datos a cifrar.
  2. Clave.
  3. Vector de inicio.

El proceso retornará finalmente una cadena de texto con los datos cifrados; para ello se implementa la siguiente funcion.
///
        /// 
        /// Cifrado de Cadenas de Texto
        /// 
        /// Mensaje a Cifrar
        /// Valor de la llave
        /// Vector de Inicio
        /// 
        public static string encryptString(String plainMessage, byte[] Key, byte[] IV)
        {
            Rijndael RijndaelAlg = Rijndael.Create();
            MemoryStream memoryStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                         RijndaelAlg.CreateEncryptor(Key, IV),
                                                         CryptoStreamMode.Write);
            byte[] plainMessageBytes = UTF8Encoding.UTF8.GetBytes(plainMessage);
            cryptoStream.Write(plainMessageBytes, 0, plainMessageBytes.Length);
            cryptoStream.FlushFinalBlock();
            byte[] cipherMessageBytes = memoryStream.ToArray();
            memoryStream.Close();
            cryptoStream.Close();
            return Convert.ToBase64String(cipherMessageBytes);
        }

Descifrado de cadenas de texto.


El proceso inverso, el de descifrado, se realiza de manera antagónica.  Para hacerlo es necesario contar con los siguientes parámetros.

Cadena de texto con los datos cifrados.
Clave.
Vector de inicio.
El proceso retornará finalmente una cadena de texto con los datos descifrados.
///
        /// Descifrado de cadenas de texto
        /// 
        /// Mensaje Encriptado
        /// Valor de la llave
        /// Vector de Inicio
        /// 
        public static string decryptString(String encryptedMessage, byte[] Key, byte[] IV)
        {
            byte[] cipherTextBytes = Convert.FromBase64String(encryptedMessage);
            byte[] plainTextBytes = new byte[cipherTextBytes.Length];
            Rijndael RijndaelAlg = Rijndael.Create();
            MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                         RijndaelAlg.CreateDecryptor(Key, IV),
                                                         CryptoStreamMode.Read);
            int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
            memoryStream.Close();
            cryptoStream.Close();
            return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
        }

Implementación con Archivos

El cifrado y descifrado de mensajes en archivos se realiza de manera similar al expuesto anteriormente con cadenas, sin embargo varían los flujos (streams) utilizados para obtener y dirigir el flujo de la información.

///

        /// Encriptar un Archivo
        /// 
        /// Mensajea Cifrar        
        /// Nombre del archivo
        /// Valor de la llave
        /// Vector de Inicio
        public static void encryptToFile(String plainMessage,String filename, byte[] Key, byte[] IV)
        {
            FileStream fileStream = File.Open(filename, FileMode.OpenOrCreate);
            Rijndael RijndaelAlg = Rijndael.Create();
            CryptoStream cryptoStream = new CryptoStream(fileStream,
                                                         RijndaelAlg.CreateEncryptor(Key, IV),
                                                         CryptoStreamMode.Write);
            StreamWriter streamWriter = new StreamWriter(cryptoStream);
            streamWriter.WriteLine(plainMessage);
            streamWriter.Close();
            cryptoStream.Close();
            fileStream.Close();
        }
        /// 
        /// 
        /// 
        /// Nombre del archivo cifrado
        /// Valor de la llave
        /// Vector de Inicio
        /// Mensaje Encriptado
        public static string decryptFromFile(String filename, byte[] Key, byte[] IV)
        {
            FileStream fileStream = File.Open(filename, FileMode.OpenOrCreate);
            Rijndael RijndaelAlg = Rijndael.Create();
            CryptoStream cryptoStream = new CryptoStream(fileStream,
                                                         RijndaelAlg.CreateDecryptor(Key, IV),
                                                         CryptoStreamMode.Read);
            StreamReader streamReader = new StreamReader(cryptoStream);
            string plainMessage = streamReader.ReadLine();
            
            streamReader.Close();
            cryptoStream.Close();
            fileStream.Close();

            return plainMessage;
        }

viernes, 22 de mayo de 2015

Agregar local Storage a XenServer 6.2 después de la Instalacion

Agregar un disco duro nuevo a un servidor XenServer es en realidad una tarea sencilla; una ves que el disco ha sido agregado físicamente necesitaremos reconocer el disco dentro de XenServer.

El primer Paso es abril la consola de comandos de nuestro servidor ya sea desde el XenCenter o desde el servidor mismo



Lo primero que necesitamos es ejecutar el comando:

# fdisk -l  

Es necesario extraer el UUID del Host:

# xe host-list



Una vez que se identifico el nuevo disco (Puedes usar el tamaño), hay 2 formas de agregar el disco:

# ll /dev/disk/by-id



En los resultados localizar el ID del disoc duro en cuestro caso el sdb el cual debe tener la siguiente forma “scsi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx” or “cciss-xxxxxxxxxxxxxxxxxxxxxxxxxx”

y despues ejecutar el comando:

# xe sr-create content-type=user device-config:device=/dev/disk/by-id/<scsi-xxxxxxxxxxxxxxxxxxxxxxxxx> host-uuid=<host-uuid> name-label=”Local Storage 2” shared=false type=lvm

O:

# xe sr-create content-type=user device-config:device=/dev/disk/by-id/<cciss-xxxxxxxxxxxxxxxxxxxxxxxxx> host-uuid=<host-uuid> name-label=”Local Storage 2” shared=false type=lvm

En mi caso el comando queda asi:

# xe sr-create content-type=user device-config:device=/dev/disk/by-id/scsi-SATA_WDC_WD2003FYPS-_WD-WCAVY5331769 host-uuid=4bed2dba-d650-452c-aaad-81d556e3fea4 name-label=”Local Storage 2” shared=false type=lvm



Opcion 2

Cramos la entrada en el sistema  con el siguiente comando

#pvcreate /dev/sdb

Despues inizilismaos el Storage en XenServer con:

#xe sr-create type=lvm content-type=user device-config:device=/dev/sdc name-label="Local Storage #3"


Como pueden ver al final quedan listas ambas unidades por cualquiera de los 2 metodos