Pages

Thursday, February 10, 2011

Exchange 2007: Mover elementos de un calendario a otro

Utilizando la API de Exchange para comunicarnos con los web services, es posible realizar muchas acciones. En particular podemos mover los elementos de un calendario a otro.

Esto es útil por ejemplo cuando realizamos una migración y las carpetas quedan cambiadas, es decir tenemos un "Calendar" y un "Calendario".



string usuario = "";
string pass = "";
string servidorCorreo = "";
string correoUsuario = "";
string dominio = "";
string origen = "Calendar"
string destino = "Calendario"
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
 service.Url = new Uri("https://" + servidorCorreo +"/ews/exchange.asmx");
 service.Credentials = new NetworkCredential(usuario, pass, dominio);
 service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, correoUsuario);

 FolderView view = new FolderView(200);
 view.Traversal = FolderTraversal.Deep;
 
 FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.Root, view);
 FolderId elid = null;
 FolderId idDestino = null;
 foreach (Folder myFolder in findFolderResults.Folders)
 {
     if (myFolder != null)
     {
         if (myFolder.DisplayName != null)
         {
             if (myFolder.DisplayName.CompareTo(origen) == 0)
                 elid = myFolder.Id;
             if (myFolder.DisplayName.CompareTo(destino) == 0)
             {
                 idDestino = myFolder.Id;
             }
         }

     }
 }
 FindItemsResults<Item> findResults = service.FindItems(elid, new ItemView(5000));
 IEnumerable<ItemId> itemIds = from item in findResults
                               select item.Id;
 Console.WriteLine("Moviendo items desde: " + origen + " " + destino);

 if (idDestino == null) //Si no se especifica un destino se toma el Calendario de sistema como destino
       service.MoveItems(itemIds, WellKnownFolderName.Calendar);
 else
       service.MoveItems(itemIds, idDestino);

Friday, January 28, 2011

Actualizar e-Trust Antivirus ITM 8.1 con vbscript

Una vez instalado el antivirus en un ambiente corporativo, lo natural sería que lo primero que haga el mismo sea actualizarse contra el servidor de firmas central.


Bueno con CA, esto no sucede, si nos descuidamos tendremos el antivirus instalado con una firma del 2006 y probablemente una licencia inválida.


Como workaround a este problema con algunas líneas de vbscript podemos:

  1. Actualizar el archivo de licencia del equipo de trabajo
  2. Actualizar los parámetros del servidor de firmas
  3. Forzar una actualización de políticas
  4. Forzar una actualización de firmas.
El mismo debe correr en el servidor de firmas.

1- Actualizar el archivo de licencia del equipo de trabajo
ruta = "\\equipoDestino\c$\CA\SharedComponents\SubscriptionLicense"
Set fs = CreateObject("Scripting.FileSystemObject")
fs.CopyFile "C:\Program Files\CA\SharedComponents\SubscriptionLicense\license.xml",ruta

2- Actualizar los parámetros del servidor de firmas
'Actualizo el servidor de distribucion de firmas en el cliente
CONST HKLM = &H80000002
servidorITM = "192.168.1.1"
puerto = 42511
set objReg = GetObject("winmgmts:\\" & equipo & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\ComputerAssociates\Shared\CAUpdate\ProductConfig\ITM\ServerConfig\Server0"
objReg.SetStringValue HKLM,strKeyPath,"Server",servidorITM
objReg.SetDWORDValue  HKLM,strKeyPath,"ServerPort",puerto

3- Forzar actualización de políticas y parámetros de discovery
'Forzar discovery
cadena = "winmgmts:\\" & listaEquipos(k) & "\root\default:StdRegProv"
servidorITM = Array(&Hc0,&Ha8,&H1,&H1) ' --- Aqui va la IP convertida a hexadecimal
servidorITMStr = "|192.168.1.1|"
IPServerITM = "192.168.1.1"
WScript.Echo "-- Actualizando claves del registro... --"
set objReg = GetObject(cadena)
strKeyPath = "SOFTWARE\ComputerAssociates\eTrustITM\CurrentVersion\NameCli"
objReg.SetBinaryValue HKLM,strKeyPath,"ServerList",servidorITM
strKeyPath = "SOFTWARE\ComputerAssociates\eTrustITM\CurrentVersion\PhoneHome"
objReg.SetStringValue HKLM,strKeyPath,"ServerList",servidorITMStr
        
WScript.Echo "-- Forzando discovery... --"
comando = "psexec \\" & equipo & " " & """c:\Archivos de programa\CA\eTrustITM\phonhome.exe""" & " " & IPServerITM
WScript.Echo "-- Ejecutando: " & comando
Set oexec = ws.Exec(comando)

Thursday, January 13, 2011

Cargar archivos en Sharepoint con la fecha "Modified" que deseemos

¿A quien no le ha pasado necesitar subir un reporte o informe con fecha del mes pasado?


En sharepoint la fecha de Modificado es de solo lectura, pero podemos cambiarla utilizando unas pocas lineas de código c#.


El siguiente código sube un archivo a una biblioteca de documentos, dentro de una subcarpeta, con la fecha y comentario deseado.



static void cargar(string archivo,string destino, string comentario,string fecha)
        {
            string ruta = "C:\\ubicacion\\archivos\\";
            String fileToUpload = ruta + archivo;
            String sharePointSite = "http://misitio";
            String documentLibraryName = "MiBiblioteca";
            String subcarpeta = "UnaSubcarpeta";
            Guid id;
            using (SPSite oSite = new SPSite(sharePointSite))
            {
                using (SPWeb oWeb = oSite.OpenWeb())
                {
                    if (System.IO.File.Exists(fileToUpload))
                    {
                        SPFolder myLibrary = oWeb.Folders[documentLibraryName];
                                               
                        String fileName = System.IO.Path.GetFileName(fileToUpload);
                        FileStream fileStream = File.OpenRead(fileToUpload);
                        
                        Hashtable MetaDataTable = new Hashtable();
                        MetaDataTable.Add("Comments", comentario);
                           
                        
                        SPFile spfile = myLibrary.SubFolders[documentLibraryName + "/" + subcarpeta].Files.Add(destino, fileStream,true,comentario,true);
                        


                        id = spfile.Item.UniqueId;
                        myLibrary.Update();
                        
                        
                    }
                    else
                    {
                        throw new FileNotFoundException("File not found.", fileToUpload);
                    }
                }
            }
            cambiarFecha(id, fecha);
        }










  private static void cambiarFecha (Guid id, string fecha) 
        {
            SPSite site = new SPSite("http://misitio");
            SPWeb myWeb = site.OpenWeb();


            SPList list = myWeb.Lists["MiBiblioteca"];
            SPListItem doc = list.Items[id];
            doc["Modified"] = DateTime.Parse(fecha);
            doc.UpdateOverwriteVersion();
            myWeb.Close();
            site.Close();


        }




        private static string leerArchivo(string camino)
        {
            StreamReader streamReader = new StreamReader(camino, System.Text.Encoding.Default);


            string texto = streamReader.ReadToEnd();
            streamReader.Close();
            return texto;


        }
        private static string[] obtenerRutas(string dir, string tipo)
        {
            string[] filePaths = Directory.GetFiles(@dir, tipo, SearchOption.AllDirectories);
            return filePaths;
        }








HTTP Status 404 - Servlet invoker is not available

A partir de Tomcat 6 se avisa que se va quitar el invoker en la versión 7

fix
The invoker servlet has been deprecated and will be removed in Tomcat 7 onwards. (markt)
(http://tomcat.apache.org/tomcat-6.0-doc/changelog.html)
Si tenemos aplicaciones que utilizan el invoker recibiremos el siguiente mensaje de error:


HTTP Status 404 - Servlet invoker is not available


type Status report
message Servlet invoker is not available
description The requested resource (Servlet invoker is not available) is not available.

Apache Tomcat/7.0.5


La solución no es otra que definir en nuestros web.xml los servelts que utilizamos!