Mostrando entradas con la etiqueta windows. Mostrar todas las entradas
Mostrando entradas con la etiqueta windows. Mostrar todas las entradas

martes, 7 de mayo de 2013

bat2sh

Cómo convertir fácilmente un archivo bat de windows en un sh para linux.

Para eso comencé a crear este pequeño script en perl (mejorable por cierto) para automatizar un poco esta tarea. Dejo el código en su estado actual aquí abajo, pueden encontrar la última versión (y participar en ella para mejorarla) en éste github.


#!/usr/bin/perl

sub cat_ {
local *F;
open F, $_[0] or return;
my @l = ;
wantarray() ? @l : join '', @l
}
sub output {
my $f = shift;
local *F;
open F, ">$f" or die "output in file $f failed: $!\n";
print F foreach @_; 1
}
  
if (@ARGV != 2) {
die "Usage: bat2sh.pl <input .bat file> <output .sh file>\n";
}
my @contents = cat_($ARGV[0]);

foreach my $line (@contents) {
# rem -> #
$line =~ s/rem /# /i;
# move -> mv
$line =~ s/^\s*move\b/mv/;
# del -> rm
$line =~ s/^\s*del\b/rm/;
# dos eol to unix eol
$line =~ s/\r\n/\n/;
# set
$line =~ s/^\s*set //i;
# \ -> /
$line =~ s/\\/\//g;
# copy -> cp
if ($line =~ m/^\s*copy\b/ig){
$line =~ s/^\s*copy\b/cp/ig;
$line =~ s/\n//; #remove eol
$line .= " ./\n";
}
# %varName% -> $varName
while ($line =~ m/(%\w*%)/ig){
my $word = "\$" . substr($1, 1, -1);
$line =~ s/(%\w*%)/$word/ig;
}
# if ERRORLEVEL 1 goto ERROR -> if [ "$?" = "1" ]; then sub_error fi
if ($line =~ m/^\s*if\s*ERRORLEVEL\s*1\s*goto\s*(\w*)\s*$/ig){
$line = "if [ \"\$?\" = \"1\" ]; then \n exit 1\nfi\n";
}
}
my $line = "#!/bin/sh\n\n\n";
unshift @contents, $line;

output $ARGV[1], @contents;

viernes, 19 de abril de 2013

Tips Windows

Links simbólicos en windows 7 

Ahora windows permite tener links simbólicos al estilo linux, un gran avance... como crearlos:

mklink /D origen destino


El /D se usa para crear un "directorio" simbólico... no se usa /D para crear links a archivos.

viernes, 5 de abril de 2013

Algunas cosas sobre el comando sc

Crear y eliminar servicios en windows desde línea de comandos.

El comando sc, sirve para, entre otras cosas instalar y desinstalar servicios...
Por ejemplo para instalar

sc create nombre_de_mi_servicio binPath= path_del_exe start= auto


Prestar atención a que después de binPath= hay un espacio en blanco y despues el path, así se ponen los parametros, dejando un espacio en blanco, sino no funciona (loquísimo!), igual en start= auto y los demás...

Para eliminar el servicio

sc delete nombre_de_mi_servicio

También hay otros parámetros como start , para iniciar el servicio, stop para detenerlo, y el más útil "sc help" nos da la ayuda sobre SC...

Nota:

Cuando estaba probando instalar mi servicio, tuve que instalarlo y desinstalarlo varias veces con distintos parámetros. Pero me pasaba que una vez desinstalado, cuando quería reinstalarlo me tiraba el siguiente mensaje de error:


The specified service has been marked for deletion.


... y no me instalaba el servicio nuevamente.
A poco de probar descubrí que la "culpa" de ese error la tenía la consola de servicios de windows (ctrl-alt-del -> start task manager -> solapa Services -> botón Services), mientras estaba abierta tira ese error, cuando la cierro el error deja de ocurrir.

lunes, 13 de agosto de 2012

GLPI & Fusion Inventory

GLPI (Gestion Libre de Parc Informatique, algo así como Gestionador Libre del Parque Informático), es, según su web un software libre distribuido bajo licencia GPL, que facilita la administración de recursos informáticos. GLPI es una aplicación basada en Web escrita en PHP, que permite registrar y administrar los inventarios del hardware y el software de una empresa.

GLPI incluye también software de mesa de ayuda para el registro y atención de solicitudes de servicio de soporte técnico, con posibilidades de notificación por correo electrónico a usuarios y al mismo personal de soporte, al inicio, avances o cierre de una solicitud.

Las principales funcionalidades de GLPI están articuladas sobre dos ejes:

1) el inventario preciso de todos los recursos informáticos, y el software existente, cuyas características se almacenan en bases de datos.

2) administración e historiales de las diferentes labores de mantenimiento y procedimientos relacionados, llevados a cabo sobre esos recursos informáticos.

Este soft que estuve probando tiene toda la funcionalidad necesaria para manejar el inventario completo del hardware y el software de una organización, su manejo es fácil e intuitivo.

Instalación GLPI

Para instalar el soft, se puede descargar de la web http://www.glpi-project.org/ en la sección Downloads.
Luego de haberlo bajado su instalación es bastante simple, necesitamos tener le lenguaje PHP y un servidor MySQL instalado, funciona tanto en Linux como en Windows (por ejemplo usando WAMP en windows).  Una vez bajado, descomprimimos el archivo en la carpeta web de nuestro servidor (en linux var/www generalmente); al descomprimirse el GLPI queda en una carpeta llamada glpi. Una vez hecho esto, si entramos en localhost/glpi podemos ver la pantalla de instalación.
Durante la instalación, que es casi automática, se le pedirán algunos datos, como el acceso a la base de datos y se verificará que el servidor tenga lo necesario (permiso de escritura en varios directorios, tal vez alguna configuración en php, etc.). Sin mayores problemas se instala en unos 5 minutos, luego ya podremos entrar en htt.://localhost/glpi y ver el sistema ya en funcionamiento con los usuarios por defecto.

Fusion Inventory

Fusion Inventory es un software que tiene la función de obtener los la información del software y hardware instalado en sus computadoras. También dispone de un plugin que funciona con GLPI (también con OCSInventory) y sirve para transferir la información obtenida de cada máquina al GLPI.
Para ello FusionInventory cuenta con:
  1. Un agente (Fusion Inventory Agent) que se instala en cada máquina. Funciona tanto en entornos Linux como Windows, está programado en Perl y es de muy simple instalación y configuración.
  2. Un plugin que se agrega facilmente a GLPI que recibe la información de los agentes instalados en las máquinas y tiene la capacidad de escanear las redes a las que se encuentre conectado descubriendo impresoras y otros hardwares/softwares conectados a sus redes.

Plugin Fusion Inventory For GLPI 

El plugin fusioninventoryforglpi se baja de http://www.fusioninventory.org/ y se instala facilmente, solo hay que descomprimir el archivo bajado en la carpeta plugins de glpi y luego entrar en el sistema GLPI ->Configuración->Plugins.
Una vez allí tendrá la opción de ir instalando y actualizando los diferentes plugins (son 4). Al hacerlo verá que uno de los plugins requiere tener el plugin glpi-webservices instalado, para ello debe bajarlo de la página de plugins (a la que puede acceder también desde (GLPI ->Configuración->Plugins->See the catalogs of plugins) e instalarlo descomplimiendolo en la carpeta plugins igual que hizo antes (lo mismo es para cualquier plugin).
Una vez instalados estos plugins podrá acceder a los mismos desde GLPI->Plugins->Fusion Inventory o bien Web Services.

Deploy

Deploy es una de las características más interesantes que trae Fusion Inventory, ella permite pasar archivos a las pcs de la red que tengan instalado el agente, instalar o desinstalar programas en las mismas, ejecutar comandos, etc.
Se ingresa a la misma por GLPI->Plugins->Fusion Inventory->Deploy->Package Management->Add a package (para agregar uno nuevo). Una vez allí aparecen dos solapas: Installation y Unninstallation. Ambas solapas presentan 3 secciones: List of checks (lo que se debe chequear antes de seguir la tarea), Files to copy on computer (los archivos que se quieren pasar a la/s computadoras y Actions to archieve (lo que se debe hacer una vez pasados los archivos).

Los archivos a pasar pueden subirse desde el browser o bien pasarlos por ftp al servidor (cuando sean mas grandes que el máximo que permita el servidor). Para cambiar el tamaño por defecto que pueden subirse los archivos se hace en /etc/php5/apache2/php.ini por defecto es 2. Cuando se suben archivos para bajar desde el server, se deben subir a /var/www/cd glpi/files/_plugins/fusinvdeploy/upload por defecto, esto se configura desde Plugins ->Fusion Inventory->Configuración (de la botonera de arriba); solapa Fusion Inventory Deploy.

Fusion Inventory Agent


Cliente en linux


Se baja de http://prebuilt.fusioninventory.org/stable/ ver la versión del SO requerida, se corre directamente desde el directorio en que se descomprime.
O bien se instala desde synaptic o con


apt-get install fusioninventory-agent



es el agente principal, otras características se instalan con:

apt-get install libfusioninventory-agent-task-ocsdeploy-perl


apt-get install libfusioninventory-agent-task-netdiscovery-perl


apt-get install libfusioninventory-agent-task-snmpquery-perl 


La configuración se hace desde agent.cfg en el directorio donde se descomprimió, o si se instaló con apt en /etc/fusioninventory/agent.cfg. En la configuración, cambiar el valor de server por http://<el nombre de su servidor>/glpi/plugins/fusioninventory/front/plugin_fusioninventory.communication.php por defecto trae otro valor que sirve para que funcione el inventario, pero no funciona el deploy.
El cliente deja un log en /var/log/fusioninventory.log muy útil para ver errores y como trabaja el programa.

Cliente en windows

Los datos de configuración se pueden cambiar desde la registry (ejecutar regedit) hkey_local_machine->software->FusionInventory-Agent
Cambiar el valor de server por http://<el nombre de su servidor>/glpi/plugins/fusioninventory/front/plugin_fusioninventory.communication.php por defecto trae otro valor que sirve para que funcione el inventario, pero no funciona el deploy. *1
Revisar luego de instalar que el directorio Program Files/FusionInventory-Agent/var tenga permiso de escritura y también e el archivo agent-log o su directorio para crearlo (Program Files/FusionInventory-Agent)
En windows el log del agente queda en C:\Program Files\FusionInventory-Agent

*1 - Ahora en nuevas versiones del GLPI (del plugin fusioninventory) agregaron una muy útil configuración que nos permite elegir en qué carpeta van a recibirse los datos que envía el agente eso podemos cargarlo en Inicio -> Plugins -> FusionInventory -> Configuración general en el campo Service URL de la pestaña Configuración General, para la configuración que estoy armando en este ejemplo debo poner "http://<el nombre de su servidor>/glpi/".
Es importante para la gente que actualiza de versiones anteriores (como me paso a mi) que carguen ese valor ya que al actualizar (por lo menos a mí) me quedo vacío y no recibía los datos de los agentes.

Ver el estado del FusionInventory-Agent

Bueno,  una vez instalado el agente uno puede ir a la página http://localhost:62354 y ver el estado del Agente de Fusion Inventory, ahí aparece una pagina simple que indica la próxima vez que se va a contactar al servidor, el estado actual del agente y también nos da la posibilidad de lanzar un inventario manualmente haciendo click en "Force an inventory".
También podemos lanzar un inventario por medio de la línea de comandos, entrando en windows en c:/Archivos de programa/FusionInvenotry-Agent/perl/bin
y ejecutando 
perl.exe fusioninventory-agent --h
podemos ver la ayuda del agente que nos indicará como llamarlo con sus diferentes opciones y para qué sirve cada una de ellas.






jueves, 19 de julio de 2012

Cómo convertir una solución o proyecto de C# a VB.NET automáticamente

Muchas páginas permiten pasar pedazos de código de VB.Net a C# y viceversa, pero cuando uno tiene un proyecto o solución grande, utilizar éstas páginas para convertir de lenguaje suele ser tedioso y lento. Por eso para pasar una solución completa tuve que ponerme a buscar una mejor opción....
Luego de buscar bastante por internet encontré una mejor forma de hacerlo.
Para poder hacerlo hay que bajar un interesante programa de internet que se llama SharpDevelop (al momento de escribir este artículo en su version 4.2).

SharpDevelop es un interesane IDE de desarrollo en tecnología .NET el cual es gratuito y open-source, dispone de varios lenguajes para desarrollar (C#, VB.NET, C++, F#, Python, Ruby y algunas cosas más)... Es verdaderamente muy liviano y anda muy rápido, aunque lo utilicé poco le encontre un solo defecto importante: no permite, al estar haciendo debug modificar el código y seguir debuguiando (a no ser que reinicie el debug), esto se debe a que (según leí en sus foros) el compilador .NET de Microsoft no tiene abierta la posibilidad de hacer esto (se me ocurre que así Microsoft se asegura que nadie pueda hacer un IDE mejor, o que le pueda competir al Visual Studio)...

Bueno, el tema es que este IDE, entre otras funcionalidades tiene la de convertir Proyectos enteros de un lenguaje a otro de los que tiene para desarrollar. :-)

Por ejemplo para pasar de C# a .NET mi proyecto hago lo siguiente, abro mi solución con SharpDevelop y en la solapa projects selecciono el proyecto a convertir y con botón derecho->Convert->From C# to VB.NET lo convierto y me deja una copia convertida del proyecto con el mismo nombre pero agregando .Converted... GENIAL!!!

Deja algún que otro pequeño error o advertencia, pero no muchas y fáciles de solucionar. Lo único que tardé un poco en darme cuenta fue que deja los Resources en
Global.<nombre proyecto>.Properties.Resources.<recurso>

cuando debería dejarlos en
Global.<nombre proyecto>.Resources.<recurso>

O sea sin el properties... 
También que a algunos controles se "olvida" de ponerles el WithEvents cuando tienen eventos...
En algunas páginas deja los "Option Strict On" "Option Explicit On" sin estar exactamente al principio, lo cual genera algunos errores.
... Fuera de eso y alguna que otra advertencia ¡Compilo y anda!

domingo, 24 de junio de 2012

Cómo ver si un programa está instalado en nuesta PC

Utilizando el registro de windows se pueden ver todos los programas instalados en nuestra máquina (o cualquier texto que esté en la registry de windows). El código que sigue a continuación se desarrolló para buscar una serie de programas instalados en un cliente.

El llamado al método de búsqueda es algo del estilo:
reg.buscarEnLaRegistry(Registry.LocalMachine.OpenSubKey(@"SOFTWARE"), busqueda);

Siendo busqueda:
private List<RegistroWindows.itemBuscar> busqueda;

Y siendo reg
RegistroWindows reg = new RegistroWindows();

Como notarán uso Registry.LocalMachine.OpenSubKey(@"SOFTWARE") solo buscando en el nodo SOFTWARE de la registry ya que allí se encuentra el soft instalado.


using System;
using System.Collections.Generic;
using Microsoft.Win32;

namespace ProgramasInstalados.Clases
{
    /// <summary>
    /// Clase para trabajar con el registro de windows
    /// </summary>
    public class RegistroWindows
    {
        /// <summary>
        /// Item a buscar
        /// </summary>
        public class itemBuscar
        {
            /// <summary>
            /// Nombre del item o texto a buscar
            /// </summary>
            public string Nombre { get; set; }
            public bool Encontrado { get; set; }
            public string Paths { get; set; }
            public itemBuscar(string nombre)
            {
                Nombre = nombre;
                Encontrado = false;
                Paths = "";
            }
        }


        /// <summary>
        /// Busca un texto en la registry
        /// </summary>
        /// <param name="registryKey">Clave del registro donde se realiza la busqueda (y en sus nodos hijo)</param>
        /// <param name="buscar">Lista de items a buscar del tipo itemBuscar</param>
        public void buscarEnLaRegistry(RegistryKey registryKey, List<itemBuscar> buscar)
        {
            foreach (string keyName in registryKey.GetSubKeyNames())// me fijo si esta en alguna clave de este nivel
            {
                if (!ignorar(keyName))// solo veo las claves que no estan en la lista de ignorar
                {
                    try
                    {
                        using (RegistryKey rk = registryKey.OpenSubKey(keyName))
                        {
                            foreach (string valueName in rk.GetValueNames())
                            {
                                foreach (itemBuscar item in buscar)
                                {
                                    string path = "";
                                    if ((path = rk.GetValue(valueName).ToString()).ToLower().EndsWith(item.Nombre.ToLower()))// me fijo si tiene el .exe que estoy buscando
                                    {// si no esta NO lo seteo en false porque podria haberlo encontrado antes
                                        item.Encontrado = true;
                                        if (!item.Paths.Contains(path))// me fijo que ya no este cargado
                                        {
                                            item.Paths += path;
                                        }
                                    }
                                }
                            }
                            buscarEnLaRegistry(rk, buscar);// me fijo si esta en alguno de sus hijos
                        }
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }

        /// <summary>
        /// Verifica si keyName esta en la lista de ignorar (en los settings, sitting Excluir separado por comas)
        /// </summary>
        /// <param name="keyName">el string a buscar para ver si se debe ignorar</param>
        /// <returns>true si se debe ignorar, sino false</returns>
        private bool ignorar(string keyName)
        {
            foreach (string ignorar in ProgramasInstalados.Properties.Settings.Default.Excluir.Split(','))
            {
             // En settings guardo en un string separado por comas los nodos en los que no quiero
             // que se busque dentro de la registry; ya que por ejemplo el nodo Microsoft tiene
             // todos los programas que instalo Microsoft, tambien se puede evitar el nodo Windows
             // ya que tiene los programas propios de windows, entre otros. Esto hace que sea mas
             // rapida la busqueda dentro de la registry, ya que recorrerla completa si no es
             // necesario insumiria bastante tiempo.
                if (ignorar == keyName)
                {
                    return true;
                }
            }
            return false;
        }
    }
}

sábado, 23 de junio de 2012

Cómo ejecutar un programa con .NET C#

Con una simple instrucción se puede ejecutar un programa que esté instalado en nuestra pd desde .NET... con C# son un par de líneas:

try
{
 Process.Start(item.Paths);
}
catch (Exception exception)
{
 MessageBox.Show("Se ha producido un error al intentar abrir el programa." + Environment.NewLine + "Mensaje de error: " + exception.Message;);
}
 
Para que esto funcione hay que usar también: using System.Diagnostics;

viernes, 22 de junio de 2012

Cómo sacar un ícono de un .exe o .dll en .NET con C#

Aquí una pequeña función que sirve para sacar el ícono de un archivo (.exe, .dll) en windows en c#.



using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ProgramasInstalados.Clases
{
    /// <summary>
    /// Clase para extraer iconos de ficheros de recursos.
    /// </summary>
    class Iconos
    {

 ...

 ...

 ...

  
     /// <summary>
     /// Devuelve el icono del programa
     /// </summary>
     /// <param name="path">
     /// La ruta del programa al que se le quiere sacar el ícono 
     /// ej: "c:/prog.exe" </param>
     /// <returns>
     /// Un objeto Icon con el icono o null
     /// </returns>
     public static Icon IconDelPrograma(string path)
     {
          Icon icono = null;
          try
          {
              icono = Icon.ExtractAssociatedIcon(path);
          }
          catch
          { //capturo la excepcion
          }
       return icono;
     }

  

 .........


    }
} 



miércoles, 25 de enero de 2012

¡No me digas que era eso!!!

Este es uno de esos errores tontos que pueden hacer perder mucho tiempo al programador.
Bueno, resulta que desarrollé un template (plantilla) para Joomla para un sitio web. En mi máquina local del laburo tengo instalado wamp para desarrollar en php. El tema es que hice todo mi sitio y una vez funcionando lo publicamos en el servidor.
Al publicarlo, lamentablemente, la planilla no se ve y aparece un mensaje de error: "Error. La plantilla no está disponible para esta presentación. Por favor, contacte con un administrador del sitio.".
Tras mucho maldecir y hacer distintas pruebas descubro cuál es el problema:
El tema vino por el lado de que linux es case sensitive en los archivos (diferencia entre mayúsculas y minúsculas), no así windows; por lo que si la plantilla se llama "MiPlantilla" o "miplantilla" en windows es indistinto, pero en linux no.
Cuando se tiene una plantilla en Joomla la misma va en el directorio templates en un directorio con el nombre de la plantilla. El nombre del directorio debe ser idéntico al de la plantilla para que funcione en linux, también revisar el xml de la plantilla que tenga el mismo nombre.