martes, 2 de abril de 2013

Entrar en Windows Server 2012 con la cuenta de dominio

Enunciado

Instalas Windows 2012 en una maquina virtual vmWare.
Cuando terminas la instalación, haces login con la cuenta del administrador de maquina creada durante la instalación.
Procedes a añadir el equipo al dominio y reinicias.
No encuentras la forma de hacer login con una cuenta de dominio en lugar de la del administrador.

Solución

Supongo que realmente lo que quieres es autorizar una cuenta de dominio para el acceso con el escritorio remoto.
Puedes hacerlo con la cuenta de administrador del equipo y escribiendo el nombre del usuario de dominio de la forma habitual \
Podrás hacer login y además a partir de entonces tendrás opción a elegir el nombre del usuario.

Comentario

Es posible que haya otras formas ¿dar de alta el usuario de dominio en usuarios?.  Pero con esto me funcionó y después de haber perdido una hora con la maravillosa METRO-usabilidad.....no estoy para despilfarros.

jueves, 21 de marzo de 2013

Plantillas Endpoint Proteccion

Enunciado

Estas configurando diversas políticas para la detección de malware en estaciones y servidores con System Center Configuration Manager2012 y End Point Protection.
Especialmente en controladores de dominio, servidores de correo, etc esto puede ser complejo.
¿Hay algo que pueda ayudarte?

Solución:

En http://configmgrblog.com/2012/07/09/out-of-the-box-endpoint-protection-2012-policy-templates/ descubrí que en cualquier ordenador donde tengas instalada la consola de administración puedes acceder a la carpeta:
%programfiles%\"Microsoft Configuration Manager\AdminConsole\XmlStorage\EPTemplates"
Donde encontraras una colección de plantillas para distintas situaciones.

lunes, 11 de marzo de 2013

Problemas con el lenguaje español en umbraco

Síntomas

En Umbraco 6.0 se producen errores por la ausencia de código Java cuando un usuario que tiene establecido el idioma en español edita propiedades del tipo texto enriquecido.
Los errores hacen referencia la ausencia de módulos de lenguaje como es.js o o es_dlg.js.
En Chrome impiden la edición de la propiedad completamente.

Estos módulos es deberían figurar en la carpeta lang de tinyMCE3 y de diversos pluggins (por ejemplo faltan en   Umbraco_Client\Tinymce3\Plugins\Umbracoimg\Langs y en Umbraco_Client\Tinymce3\Plugins\Umbracoembed\Langs

Solución

Haz una copia del modulo en.js, en es.js (o similar).
Editarlo cambiando las referencias de idioma.
Por ejemplo: tinyMCE.addI18n('en.umbracoembed',... por tinyMCE.addI18n('es.umbracoembed',....
También si tienes mucho interés y tiempo puedes cambiar los textos descriptivos.

Actualización:
Tambien puedes copiar las traducciones del tinymce para la versión que usas:
http://www.tinymce.com/i18n3x/index.php?ctrl=lang&act=download&pr_id=1

martes, 5 de marzo de 2013

Error corrector ortográfico de Umbraco

Sintomas

Si intentas utilizar el corrector ortográfico del editor de texto enriquecido de Umbraco (Versión 6) te salta un error.
[ArgumentOutOfRangeException: El índice y la longitud deben hacer referencia a una ubicación en la cadena.
( Index and length must refer to a location within the string)

Solución: 

La solución está esbozada en: http://our.umbraco.org/forum/ourumb-dev-forum/bugs/28540-4711-spell-check-in-RTE.
Lo único que añado en este post son las instrucciones "Using" que faltan en el código del controlador genérico.

Básicamente es:
1.- Modificar /config/tinyMceConfig.config con la línea:
<config key="spellchecker_rpc_url">GSpellChecker.ashx</config>

Y agregar un controlador genérico: /umbraco/GSpellChecker.ashx
using System;
using System.Web;
using umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker;
using System.Xml;
using System.IO;
using System.Web.Script.Serialization;
using System.Net;
using System.Text;
public class GSpellChecker : SpellChecker, IHttpHandler {
  // Methods
  public override SpellCheckerResult CheckWords(string language, string[] words) {
    XmlDocument document = new XmlDocument();
    string data = string.Join(" ", words);
    string xml = SendRequest(language, data);
    document.LoadXml(xml);
    data = HttpContext.Current.Server.UrlEncode(data);
    SpellCheckerResult result = new SpellCheckerResult();
    foreach (XmlNode node in document.SelectNodes("//c")) {
      XmlElement element = (XmlElement)node;
      result.result.Add(data.Substring(Convert.ToInt32(element.GetAttribute("o")), Convert.ToInt32(element.GetAttribute("l"))));
    }
    return result;
  }

  public override SpellCheckerResult GetSuggestions(string language, string word) {
    XmlDocument document = new XmlDocument();
    string xml = SendRequest(language, word);
    document.LoadXml(xml);
    SpellCheckerResult result = new SpellCheckerResult();
    foreach (XmlNode node in document.SelectNodes("//c")) {
      XmlElement element = (XmlElement)node;
      foreach (string str2 in element.InnerText.Split(new char[] { '\t' })) {
        if (!string.IsNullOrEmpty(str2)) {
          result.result.Add(str2);
        }
      }
    }
    return result;
  }

  public void ProcessRequest(HttpContext context) {
    SpellCheckerInput input = SpellCheckerInput.Parse(new StreamReader(context.Request.InputStream));
    SpellCheckerResult suggestions = null;
    string method = input.Method;
    if (method != null) {
      if (!(method == "checkWords")) {
        if (method == "getSuggestions") {
          suggestions = this.GetSuggestions(input.Language, input.Words[0]);
          goto Label_007C;
        }
      } else {
        suggestions = this.CheckWords(input.Language, input.Words.ToArray());
        goto Label_007C;
      }
    }
    suggestions = new SpellCheckerResult();
  Label_007C:
    suggestions.id = input.Id;
    string s = new JavaScriptSerializer().Serialize(suggestions);
    context.Response.Write(s);
  }

  private static string SendRequest(string lang, string data) {
    string str;
    string requestUriString = string.Format("https://www.google.com:443/tbproxy/spell?lang={0}&hl={0}", lang);
    string s = string.Format("<?xml version=\"1.0\" encoding=\"utf-8\" ?><spellrequest textalreadyclipped=\"0\" ignoredups=\"0\" ignoredigits=\"1\" ignoreallcaps=\"1\"><text>{0}</text></spellrequest>", HttpContext.Current.Server.UrlEncode(data));
    StreamReader reader = null;
    HttpWebResponse response = null;
    Stream requestStream = null;
    try {
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUriString);
      request.KeepAlive = false;
      request.Method = "POST";
      request.ContentType = "application/PTI26";
      request.ContentLength = s.Length;
      WebHeaderCollection headers = request.Headers;
      headers.Add("MIME-Version: 1.0");
      headers.Add("Request-number: 1");
      headers.Add("Document-type: Request");
      headers.Add("Interface-Version: Test 1.4");
      requestStream = request.GetRequestStream();
      byte[] bytes = new ASCIIEncoding().GetBytes(s);
      requestStream.Write(bytes, 0, bytes.Length);
      response = (HttpWebResponse)request.GetResponse();
      reader = new StreamReader(response.GetResponseStream());
      str = reader.ReadToEnd();
    } finally {
      if (requestStream != null) {
        requestStream.Close();
      }
      if (reader != null) {
        reader.Close();
      }
      if (response != null) {
        response.Close();
      }
    }
    return str;
  }

  // Properties
  public bool IsReusable {
    get {
      return false;
    }
  }
}

martes, 12 de febrero de 2013

Error java script con Report Viewer e Internet Explorer 9 (window.getComputedStyle)

Contexto

Página con ReportViewer en Internet Explorer 9,

Sintomas

Aparece un "Error en tiempo de ejecución de Microsoft jscript, Interfaz no compatible" al desplegar una de las listas de criterios.
El error esta relacionado con la función window.getComputedStyle.

Solución

Fuente: MikeHoffer en un articulo de Microsoft Community
  1. Prepara la página para usar jquery si aún no existe.
  2. Inserta el siguiente código en la sección de cabecera.
<!-- IE 9 throws an error when this is called, so we need to override it and catch that error -->
    <!--[if IE 9]>
    <script language="javascript" type="text/javascript">
        $(window).ready(function () {
            window.getComputedStyle = function (el, pseudo) {
                this.el = el;
                this.getPropertyValue = function (prop) {
                    var re = /(\-([a-z]){1})/g;
                    if (prop == 'float') prop = 'styleFloat';
                    if (re.test(prop)) {
                        prop = prop.replace(re, function () {
                            return arguments[2].toUpperCase();
                        });
                    }
                    //error occures on the currentStyle
                    //return el.currentStyle[prop] ? el.currentStyle[prop] : null;
                    if (typeof(el.currentStyle) == 'undefined') {
                        return null;
                    } else {
                        return el.currentStyle[prop] ? el.currentStyle[prop] : null;
                    }
                }
                return this;
            }
        })        
    </script>
    <![endif]-->

lunes, 11 de febrero de 2013

Insertar código de seguimiento Google Analytics sin editar todas las páginas

Problema

Tienes un sitio escrito que a lo largo de los años has rellenado con abundantes páginas HTML, ASP, ASPX,....etc.
Ahora quieres incorporarle el código Javascript para el seguimiento con Google Analytics.
Pero no quieres editar todas las páginas del sitio ni modificar todos los desarrollos.
¿Cómo lo haces?
(El sitio se aloja bajo IIS7.5)

Antes que nada

Esta solución es parecida a la propuesta por Ruslan Yakushev en:

Using Outbound Rules to add Web Analytics tracking code


Pero no es la misma y he añadido algún detalle necesario, al final del post detallo los cambios.

Solución

Primer paso

Copia el código de google analytics y salvalo en un archivo accesible de tu sitio web.
A efectos de este ejemplo supondremos que lo guardamos con el nombre google.js en un directorio /scripts
El código lo puedes copiar y pegar de:
Panel Analytics / tu sitio / administrador / Información de seguimiento

Segundo paso

Utiliza el modulo URL Rewrite y crea una regla de salida (outbound Rule)
Le creas una pre-condición con esta información:
  1. Name: "EsHTML"
  2. Using: "Regular Expressions"

Haz clic en "Add" para que tener el cuadro de dialogo  "Add condition"
En el cuadro de dialogo escribe:

  1. Condition input: "{RESPONSE_CONTENT_TYPE}"
  2. Check if input string: "Matches the pattern"
  3. Pattern: "^text/html"

Ahora debes 
  1. El matching scope : Content
  2. The content:  matches the Pattern
  3. Pattern:</head>
Marca la casilla ignorar mayúsculas (Ignore case)
La acción debe ser:

  1. Action type: Rewrite
  2. Value: <script src="/scripts/google.js" type="text/javascript"></script></head>

Explicación

Lo que hacemos es localizar el final de los encabezados de página para insertar el código Java que necesita Google Analytics.
Lo hacemos con una simple búsqueda y reemplazo. Solo procesamos los archivos con HTML que es para los que tiene sentido.

Hay dos diferencias con el articulo de Ruslan Yakushev  mencionado más arriba:
  1. Utilizamos una archivo externo. De hecho si intentamos usar el código Java directamente en el valor de reemplazo tendremos problemas porque los simbolos $ utilizados entran en contradicción con la sintaxis de URL rewriter.
  2. Reemplazamos </head> en lugar </body>. Es mas acorde con las recomendaciones de Google Analytics.

miércoles, 6 de febrero de 2013

El cliente del SCCM no se intala en algunos ordenadores

Síntomas

Cuando ya creías que tenias resuelta la instalación del cliente para System Configuration Center mediante las actualizaciones de Windows Update  resulta que en algunos ordenadores no se instala.
Ni siquiera se crea el directorio %windir%\CCM.

Solución

En %windir%\windowsupdate.log encuentras una linea sospechosa  # AU is not configured yet que te lo dice todo.
Tienes que habilitar "Configurar actualizaciones automática"s en la sección Windows Update de la GPO donde has configurado "Especificar la ubicación del servidor de Windows Update en la Intranet"

Explicación

¿Por qué funcionaba en unas maquinas y en otras no?
En muchas maquinas la persona que instala configura los servicios de Windows Updates en el primier arranque. En otros casos no se hace, confiando que las actualizaciones se descargaran del WSUS.
Para ello la GPO del WSUS anterior configuraba las actualizaciones automáticas para que se instalaran a una hora determinada.
Pero al cambiar la GPO se recuperaba la configuración propia de la maquina en el apartado configuración de Actualizaciones de Windows.