Error Magento y PayPal Express

MagentoHace unos días publiqué una entrada hablando sobre cómo integrar Magento (1.4.1.1) con PayPal Express. Todo parecía funcionar de fábula cuando se realizaban compras desde cuentas de PayPal. Sin embargo, si el comprador no tenía una cuenta de PayPal y únicamente quería efectuar un pago con tarjeta de crédito, la compra se realizaba de forma satisfactoria pero mostraba el siguiente mensaje al final del proceso de venta:

«El pago no se puede procesar mediante su cuenta de paypal en este momento»

¡Toma ya! La compra se realiza correctamente pero se le dice al comprador justo lo contrario. Feo, feo.

Después de mucho pelearme contacté con el soporte técnico de PayPal, quien ha estado ayudándome (y mucho) a solucionar la incidencia.

El problema es el siguiente:

Cuando se realiza el proceso de compra, se utiliza una función de PayPal llamada «DoExpressCheckoutPayment». En las compras que funcionan, el campo «successpageredirectrequested» está a «false», mientras que las compras que también funcionan pero a las que se les muestra el mensaje de error anterior, este campo está a «true».

En palabras del soporte ténico de PayPal:

De acuerdo con este enlace
https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_r_DoExpressCheckoutPayment

«Flag to indicate whether you need to redirect the customer to back to PayPal after completing the transaction. »

Es una opción para indicar si se necesitar redirigir al comprador de nuevo a PayPal tras completar la transacción, que no tiene mucho sentido ya que la transacción ya ha finalizado correctamente.

Finalmente, he aquí la conclusión por parte de PayPal:

SUCCESSPAGEREDIRECTREQUESTED se solía utilizar en versiones muy antiguas de PayPal, y tenía como propósito indicar que el comprador había pagado con tarjeta directamente, para que las integraciones que así lo tuvieran dispuesto, redirigieran al comprador de nuevo a la página de PayPal por si quería abrir una cuenta para usarla en un futuro (en vez de seguir pagando como invitado).

Parece que esto ya no está en vigor, por lo que una redirección final provocaría un error.

Es decir, Magento está usando un método obsoleto, y esto está devolviendo un mensaje de error falso, en el proceso de compra.

Siguiendo las indicaciones de este foro de discusión (y también los consejos del soporte de PayPal), he pasado a modificar el archivo app/code/core/Mage/Paypal/Controller/Express/Abstract.php

Concretamente, de la siguiente función, he comentado las líneas en negrita:

public function placeOrderAction()
{
try {
$this->_initCheckout();
$this->_checkout->place($this-

>_initToken());

// prepare session to success or cancellation page
$session = $this->_getCheckoutSession();
$session->clearHelperData();

// «last successful quote»
$quoteId = $this->_getQuote()->getId();
$session->setLastQuoteId($quoteId)->setLastSuccessQuoteId($quoteId);

// an order may be created
$order = $this->_checkout->getOrder();
if ($order) {
$session->setLastOrderId($order->getId())
->setLastRealOrderId($order->getIncrementId());
// as well a billing agreement can be created
$agreement = $this->_checkout->getBillingAgreement();
if ($agreement) {
$session->setLastBillingAgreementId($agreement->getId());
}
}

// recurring profiles may be created along with the order or without it
$profiles = $this->_checkout->getRecurringPaymentProfiles();
if ($profiles) {
$ids = array();
foreach($profiles as $profile) {
$ids[] = $profile->getId();
}
$session->setLastRecurringProfileIds($ids);
}

// redirect if PayPal specified some URL (for example, to Giropay bank)
$url = $this->_checkout->getRedirectUrl();
//if ($url) {
//$this->getResponse()->setRedirect($url);
// return;
//}

$this->_initToken(false); // no need in token anymore
$this->_redirect(‘checkout/onepage/success’);
return;
}
catch (Mage_Core_Exception $e) {
$this->_getSession()->addError($e->getMessage());
}
catch (Exception $e) {
$this->_getSession()->addError($this->__(‘Unable to place the order.’));
Mage::logException($e);
}
$this->_redirect(‘*/*/review’);
}

Con esto se evita la redirección por parte de Magento al recibir el parámetro obsoleto, y se consigue completar correctamente el proceso de compra, esta vez, sin mensajes de error.

ATENCIÓN: Se recomienda realizar todos los tests que se crean convenientes antes de adaptar esta solución a tu sitio web en producción.

PD: Sí, ya he contactado con Magento para avisarles de este error, que podéis ver explicado aquí (si tenéis cuenta en Magento).

Actualizar WordPress

MiedoLa verdad es que paso miedo cada vez que actualizo WordPress.

Me entran sudores fríos solo de pensar que algo puede salir mal, con lo que tendría que volver a cargar la versión anterior.

Ya me pasó una vez, hace ya bastante, que no recuerdo por qué razón, tuve que restaurar un blog, del que tenía copia de seguridad (tanto a mano con PHPMyAdmin como con alguno de los plugins de WordPress) pero no hubo manera de restaurarlo. Siempre daba un error durante la ejecución de la query con PHPMyAdmin. Algo de la estructura de la base de datos no cuadraba con las instrucciones de la query, es decir, había instalado una versión que no concordaba con la versión que tenía en el momento del último backup.

No conseguí de ninguna de las maneras encontrar por el backup la versión de WordPress que necesitaba, y después de muchos intentos, decidí que ese blog tampoco era tan importante… Ahora lo echo en falta.

En cualquier caso, nunca falla, siempre que tengo que actualizar, visito esta web donde explica en 4 sencillos pasos cómo hacerlo para asegurarnos de que no hay problemas, que paso a reproducir a continuación (copy & paste):

  1. Descarga la nueva versión y la descomprimes en tu ordenador
  2. Desactiva los plugins instalados en tu instalación actual (todos)
  3. Sube los ficheros de la nueva instalación a tu servidor pero no sobreescribas la carpeta wp-content. Por si acaso haz copia de esta carpeta en tu ordenador antes de actualizar y así salvaguardar tus plugins, temas y archivos subidos.
  4. Visita la página : http://tublog.com/wp-admin/upgrade.php para actualizar la base de datos.
  5. Y aquí un paso que añado yo:

  6. Activa de nuevo tus plugins, desactivados en el punto 2

Mira que es fácil, pero siempre lo paso mal.

Flickr! Foto por Arturo J. Paniagua

421 4.2.1 unable to connect

SPAMBajo este título tan descriptivo, se encuentra un problema con el que me he peleado esta mañana.

El servidor de correo MS Exchange 2007 de un cliente, no podía enviar correos de salida (los correos enviados dentro de su propia red sí funcionaban) y no dejaban de amontonarse en la cola de salida del servidor de mail.

El Exchange, mostraba el siguiente mensaje:

«451 4.4.0 Primary Target IP address responded 421 4.2.1 unable to connect. Attempted failover to alternate host, but that did not suceed. Either there are no aternate hosts or delivery failed to the all alternate host.»

Hemos estado mirando documentación al respecto, intentando detectar el problema:

Finalmente, hemos pensado que podía tratarse de un bloqueo que se realizaba una vez pasado el firewall, puesto que hemos visto que los correos parecían llegar a él. Hemos pasado a utilizar MXToolbox para comprobar la dirección IP de salida de correo, en la siguiente dirección:

http://mxtoolbox.com/SuperTool.aspx

Hemos introducido el siguiente texto en la casilla:

blacklist:IP_de_salida ,donde IP_de_salida corresponde con la IP pública de salida de correo

Ahí hemos visto que efectivamente, estábamos dentro de una blacklist, en la cual habíamos entrado un día antes de que empezaran los bloqueos. En la misma página de la blacklist, hemos podido comprobar las (pobres) razones del bloqueo hacia nuestra IP, y por tanto, encontrar la presumible causa del problema.

Finalmente, hemos cambiado la dirección IP de salida de correo (contábamos con varias ADSL de salida) y la incidencia se ha solucionado.

Esto nos ha hecho pensar en que seguramente exista la necesidad de implementar algún tipo de mecanismo de monitorización de correo de salida, de igual forma que las empresas tienen sistemas de antispam de entrada, puesto que las consecuencias del «spam» de salida pueden llegar a ser mucho peores que las molestias que provoca el spam de entrada.

Tendremos que buscar si existe una solución así.

Flickr! Foto por freezelight

Wake On LAN

Encendido del PCWake On LAN, como su nombre indica (o debería indicar) es un método para encender equipos remotamente que se encuentran dentro de nuestra misma red de área local.

Para poder encender equipos mediante Wake On LAN, es necesario que la tarjeta de red del equipo soporte Wake On LAN (verás que la tarjeta de red tiene una entrada con 3 pins donde podremos conectar un cable que irá a la placa base). Puedes consultar tu modelo de tarjeta de red para comprobarlo, aunque yo lo he hecho y en la página del fabricante (3com) no indica nada de WakeOnLAN.

Además de la tarjeta de red, se necesita que la placa base soporte WakeOnLAN (tendrá una entrada de 3 pins idéntica a la de la tarjeta de red con la indicación WOL).

Así pues, deberemos conectar la entrada de la tarjeta de red con la de la placa.

Finalmente, se necesitará configurar la BIOS para dejar el WakeOnLAN preparado para funcionar. Para ello, desde «Power Management Features» o «Power Management Setup» dependiendo de la BIOS, marcando la función «Wake Up On LAN/Ring» a «Enabled», dentro de la sección «Wake Up Events».

Fuente: http://www.adslzone.net/tutorial-20.21.html#1.2

Flickr! Foto por whyamiKeenan

Integrar Magento con PayPal

A día de hoy, la mejor integración que he encontrado para realizar pagos con PayPal a través de Magento es usar el método PayPal Express. Esto nos permite que los datos recogidos por el formulario de Magento se envíen al formulario de pago de PayPal, consiguiendo así que el usuario no tenga que introducir sus datos por duplicado (una vez en Magento y otra en PayPal).

Para conseguir esta integración, hemos de seguir estos pasos:

  1. Desde nuestra cuenta de Paypal, iremos a Mi cuenta -> Perfil -> Más opciones
  2. En la columna izquierda, iremos a Información de cuenta -> Acceso a API
  3. Desde aquí, seleccionaremos la segunda opción «Opción 2: Solicitar credenciales de API para crear su nombre de usuario y su contraseña propios de API.». Esta opción será la ideal para trabajar con nuestro Magento. Una vez creada la firma de API, deberemos guardar a buen recaudo esta información (siempre será accesible desde esta opción en PayPal).
  4. Posteriormente, desde la administración de Magento, nos dirigiremos a Sistema -> Configuración -> Ventas -> Paypal, desde donde activaremos el checkbox PayPal Express (yo recomendaría deshabilitar la casilla de PayPal normal, para no crear confusión al usuario).
  5. Desde «API/Integration Settings» podremos añadir el nombre de usuario, password y firma creados en el punto 3.
  6. Desde «Express Checkout Settings» podremos personalizar un poco el tipo de compra que se realizará. Así por ejemplo, podremos cambiar la «Acción de pago» por «Venta», así como permitir las compras de usuarios «Invitado» en Magento.

Actualización 1: En el segundo comentario se explica con detalle esta configuración.

Actualización 2: Se ha detectado un error con PayPal Express y Magento 1.4.1.1, explicado y solucionado en este otro post.

Cambiar el idioma en Magento

MagentoPodemos cambiar el idioma de Mangento al Español (o a cualquier otro lenguaje) siguiendo estos pasos:

  1. Descargar el paquete del idioma seleccionado en la página oficial de Magento, sección de traducciones.
  2. Una vez descargado, subir el directorio «app» que contiene el paquete de la traducción, a la raíz de la instalación de Magento en nuestro servidor. De esta manera, no subiríamos el directorio «es_ES» si no que en su lugar subiríamos directamente el directorio «app» que se encuentra dentro de «es_ES».
  3. Posteriormente, desde el panel de administración de Magento, nos dirigiremos a System -> Configuration -> General tab -> Locale options, y seleccionaremos el idioma del paquete que acabamos de subir. En el ejemplo «español (España)».
  4. Guardaremos los cambios.
  5. Finalmente, desde System -> Caché Management, seleccionaremos todas las opciones y pulsaremos sobre «Enviar» una vez seleccionada la opción «Refresh».
  6. Con esto tendremos Magento configurado al Español.

Fuentes:

Primeros pasos con Magento

¿Cómo empezar con Magento?

Una vez instalado Magento, he pasado a intentar configurarlo siguiendo los pasos descritos a continuación:
  • Entrar en el panel de control de Magento, desde http://myweb.com/magento/index.php/admin
  • Desde System -> Configuration -> General, configurar las opciones básicas sobre la tienda, además de delimitar las ventas para un determinado país (Paypal no nos lo permitía).
  • En mi caso he tenido que re-indexar algunas tablas de la base de datos al advertir un aviso en el menú superior de Magento, símplemente pinchando en el enlace que me ha proporcionado el mensaje de aviso, y seleccionando «reindexación».
  • También he tenido que aplicar el parche 1.4.1.1 (tenía otro aviso al respecto) descargándolo desde aquí y subiéndolo directamente al servidor, pero parece que no se da por enterado y continúa apareciéndome el mensaje.

Ahora, bien, ¿Cómo empezamos a montar nuestra tienda?

Productos y Categorías

  • Desde Catalog -> Manage Categories, podemos empezar por crear una nueva categoría que cuelgue de la categoría Default Category. Es importante no eliminar esta categoría por defecto, puesto que nuestra tienda por defecto (System -> Manage Stores -> Main Website Stores) tiene como «root category» esta categoría «Default Category».
  • Una vez creada la categoría, podremos crear nuestro primer producto desde Catalog -> Manage Products, donde deberemos indicar todo un seguido de detalles respecto a nuestro producto. Destaco lo siguiente:
    • Prices -> Price: El precio sin IVA ni gastos de envío ni manipulación.
    • Prices -> Cost: El coste real del producto (únicamente como información interna, y por lo tanto, no visible para el cliente final).
    • Prices -> Tax Class: Aquí seleccionaremos el tipo de impuestos que se le aplicará al producto. Se recomienda dejar la opción por defecto y posteriormente modificarla.
  • Posteriormente, y de nuevo desde Catalog -> Manage Categories, deberemos seleccionar la pestaña «Category Products» y marcar el producto que hemos creado, recordando guardar los cambios, para incluir el producto en la nueva categoría.
  • IMPORTANTE: Para que el producto sea visible en la web, deberemos desde Catalog -> Manage Products, editar el producto y desde la opción «Inventory», asegurarnos de tener como «Qty» (cantidad) un valor mayor que el indicado en «Qty for Item’s Status to become Out of Stock», que por defecto es cero. Así, podemos poner como «Qty» por ejemplo, que tenemos un stock de «50» unidades. Además, deberemos asegurarnos de cambiar el valor de «Stock Availability» de la misma sección, a «In Stock».

Impuestos

  • Desde Sales -> Tax -> Products Tax Clases, crearemos un nuevo impuesto para nuestros productos. Desde aquí únicamente crearemos el nombre del impuesto (por ejemplo, IVA).
  • Una vez creado el nuevo impuesto, desde Sales -> Tax -> Manage Tax Zones & Rates, podremos definir un nuevo valor para nuestro impuesto creado en el punto anterior. Por defecto, vienen dos reglas de impuestos para Estados Unidos. Para España, bastará con crear un nueva entrada seleccionando como país «España», como «Rate Percent» un «18» (por ciento), con el resto de opciones por defecto.
  • Finalmente, desde Sales -> Tax -> Manage Tax Rules, podremos crear el nuevo impuesto seleccionando el «Product Tax Class» y el «Tax Rate» creados en los dos pasos anteriores. Esta nueva «Tax Rule» será la que deberemos especificar en nuestros productos desde Catalog -> Manage Products -> Editamos el producto -> Prices -> Tax Class.
Gastos de envío

  • Los gastos de envío se pueden especificar desde System-> Configuration -> Sales -> Shipping Methods, donde en primer lugar deberemos desactivar el método de envío «Flat Rate» cambiando «Enabled» a «No».
  • Posteriormente, cambiaremos a «Table Rates» para habilitar esta opción, haciendo los cambios deseados, y a continuación guardaremos. Hay que tener en cuenta, que los campos «Title» y «Method Name» se mostrarán durante el proceso de compra del artículo, al cliente.
  • Una vez guardado, desde la opción «Current Configuration Scope» en la parte superior del menú izquierdo, seleccionaremos la opción «Main Website«. Desde aquí, podremos primero descargar un archivo csv que rellenaremos con los datos de los envíos, para posteriormente subir este mismo archivo, ya con los precios de los envíos. A continuación un ejemplo de hoja de envío, donde se ha introducido el código ESP para España, y las regiones de Barcelona y Baleares tal cual aparecen en el desplegable que muestra Magento al seleccionar las regiones de España durante una compra:
Country Region/State Zip/Postal Code Weight (and above) Shipping Price
ESP Barcelona * 10 15,7
ÊSP Baleares * 10 25,8
ESP * * 10 20,82
Enlaces
Y finalmente, enlaces útiles con más información sobre estas configuraciones:

Apuntes de EventoSEO

Hoy he tenido la fortuna de asistir a EventoSEO en Barcelona. No era nada planeado (en realidad me he apuntado una hora antes que empezara el evento) pero ha merecido la pena.

A modo de recordatorio, dejo aquí mis anotaciones:

PERFORMANCE

  • Hoy en día Google está valorando muy positivamente el «performance» o rendimiento de las páginas web, es decir, la velocidad de carga.
  • Google tiene a disposición de los usuarios Google Page Speed para evaluar el performance.
  • La media de carga de las páginas en España según Google es de 1,5 segundos, sin imágenes. Lo cual quiere decir que deberíamos llegar a este valor, y nunca sobrepasar los 2,5 segundos.
  • Para mejorar el performance, se puede optar por usar CSS Sprites, así como por eliminar las imágenes e iconos irrelevantes.
  • Sabiendo que los navegadores pueden descargar hasta 3 imágenes en paralelo por dominio o sub-dominio, se puede mejorar el performance incluyendo las 3 primeras imágenes de la web en el sub-dominio 1, las siguientes 3 en el sub-dominio 2, y así sucesivamente.
  • Algo que puede mejorar mucho el performance, es eliminar los espacios, puntos y coma innecesarios, intros, etc. de nuestras hojas de estilo, así como eliminar todas las clases e identificadores no usados, además de usar GZIP para los CSS.
  • Finalmente, pero no menos importante, es la conectividad del servidor que aloja la web. El servidor tiene que tener suficientes recursos y una buena conexión para obtener un buen performance, en otro caso, puede impactar muy negativamente en el tiempo de carga, y por tanto, en la indexación.

PENALIZACIONES

  • El contenido duplicado causará una de las dos penalizaciones más importantes de Google. Se puede prevenir el contenido duplicado con «No index» o con «Canonical» (calculado por página, nunca de forma global) pero nunca usando ambos a la vez.

GEOLOCALIZACIÓN

  • Para webs en múltiples idiomas, se recomienda usar dominios geolocalizados. De esta manera, tendremos un dominio .es para España, otro .it para Italia, etcétera.
  • La redirección de la home al dominio geolocalizado deberá hacerse con la redirección pertinente. No es lo mismo usar una redirección 301, que una 302 o una 307. Con algo de polémica entre los ponentes, se recomienda usar esta última, para prevenir generar contenido duplicado con la 302.

NOTAS

  • Algunas utilidades para la monitorización web del performance, son YSlow y Page Speed de Google, aunque si no se dispone de una línea suficientemente buena (9 MegaBytes) solo nos quedará usar las herramientas para webmasters de Google como analizador del performance.
  • Otra utilidad para el código es Firebug.
  • Se recomienda que el 75% del código sea contenido, por un 25% de código utilizado para la navegación (el propio código fuente para la maquetación). Para reducir el tanto por ciento de código utilizado para navegación, se puede usar ajax, por ejemplo para incluir el menú en javascript (que no cuenta como código indexable).
  • Se aconseja, programar con CSS que lo primero que se muestre sean los H1, seguidos de H2, contenido y finalmente el código de navegación, por tema indexación.

Sin duda, habrá que estar atento a este tipo de eventos.

Cómo instalar Magento

MagentoÚltimamente me había interesado por cómo crear un carrito de la compra con Paypal, para vender productos a través de Internet. Sin embargo, después de mucho buscar, el servicio técnico de Paypal, muy amablemente me ha comentado que:

  1. Paypal no puede restringir las compras según la ubicación geográfica. Así pues, si vendes usando los botones de compra de Paypal, tienes que vender forzosamente a todo el mundo, y no únicamente a una región o país concreto.
  2. Paypal no puede calcular los costes de envío según la dirección de destino del cliente. Así pues, con Paypal tienes que definir los gastos de envío para un paquete que irá a tu misma ciudad, o a la otra punta del mundo.

Sin embargo, el servicio técnico de Paypal me ha recomendado mirar «carritos de terceros» que se integran con Paypal, para realizar este tipo de configuraciones. Desde Paypal, recomiendan los siguientes:

Carros de código fuente abierto

Carros alojados

Me he decidido a probar Magento, básicamente porqué era el que más me sonaba (por no decir que era el único que me sonaba, a parte de osCommerce).

¿Cómo instalar Magento?

  • Primero tenemos que registrarnos en la web de Magento y descargar la última versión.
  • Después, en mi caso, he modificado el archivo robots.txt de mi servidor para denegar el acceso a la carpeta que contendrá el e-commerce (no me interesa que Google y el resto de buscadores indexen este tipo de contenido), tal y como sigue:

User-agent: Googlebot
Disallow: /magento/

User-agent: *
Disallow: /magento/

  • Una vez subida la nueva versión del archivo robots.txt, he subido el directorio magento (que contiene los más de 9000 ficheros que componen la aplicación) a la raíz de mi servidor.
Siguiendo los pasos descritos aquí, he conseguido instalar y configurar Magento. Por si las moscas, describo los pasos a continuación, ya que algún paso extra he tenido que hacer:
  • En mi hosting, he creado una nueva base de datos MySQL que usará Magento. Esto dependerá del hosting, pero la mayoría de hostings ponen muchas facilidades para hacer este tipo de tareas.
  • Posteriormente, he cambiado los atributos de los siguientes archivos y directorios, a 777 (tranquilos, esto también lo comenta la documentación oficial de instalación de Magento). Esto se puede hacer con el comando «chmod» o haciendo click derecho sobre el arhivo o carpeta desde tu cliente FTP favorito:
    • Archivo magento/var/.htaccess
    • Directorios magento/app/etc y magento/var
    • Todos los directorios dentro de magento/media (no incluido)
  • Además de esto (y con tal de solucionar un «ERROR 500 – Internal Server Error»), he tenido que modificar el archivo .htaccess de la raíz de mi servidor (no el archivo .htaccess de magento), para permitir la escritura del directorio magento, añadiéndo la siguiente línea:

RewriteBase /magento/

  • Una vez cambiados los permisos y el archivo .htaccess de mi servidor, he entrado por navegador a la dirección http://miweb.com/magento/install.php, el cual ha mostrado un asistente para la configuración de Magento, que ha consistido en:
    • Aceptar las condiciones de uso
    • Seleccionar las opciones de ubicación, zona horaria, y moneda.
    • Indicar el nombre del host, base de datos y credenciales para la base de datos MySQL creada anteriormente para Magento. En este punto, además, se me han presentado diversas opciones para modificar el acceso web a Magento, así como para almacenar las opciones de sesión. NOTA: Al aceptar este punto, se ha pasado a crear la base de datos de Magento, lo cual en mi caso, ha tardado varios minutos.
    • Indicar los diversos datos del que será el administrador de Magento, así como los datos de inicio de sesión.
  • Con esto he conseguido tener Magento instalado en mi servidor.
En breve (espero) un nuevo post sobre los primeros pasos con la configuración de una tienda con Magento.

Planifica el apagado del PC

ShutdownRevisando los posts, me he encontrado con un porrón de entradas «borrador» que nunca he llegado a publicar, vete tú a saber por qué razón. Entre ellas, me he decidido a recuperar esta entrada que escribí a principios del 2009.

Ahí va:
Más de una vez he pensado en que sería una buena idea, planificar el antivirus en las máquinas de la oficina al finalizar la jornada laboral. De esta manera, nadie se podrá quejar de que su máquina le va lenta o que no puede trabajar cuando el antivirus está escaneando. El problema que tiene esto, es que no todos los antivirus vienen con la opción de apagar la máquina automáticamente al finalizar el escaneo, y la opción de dejar las máquinas encendidas las 24h del día ininterrumpidamente no es nada interesante si tenemos en cuenta cuestiones como el ahorro de energía.

Para ello, podemos hacer un script que apague la máquina, y otro script que se encargue de planificar la tarea a una determinada hora. Seguramente haya una mejor forma de hacerlo, pero la que explicaré a continuación funciona a la perfección.

/*Apagado.bat*/
REM Cerramos (-s) el PC con un retraso de 10 segundos (-t 10), forzando el cierre de aplicaciones sin previo aviso (-f) pero mostrando un comentario en pantalla (-c)

shutdown -s -t 10 -f -c «Apagado automático de equipo»

Este script apagado.bat, podríamos planificarlo manualmente desde:
{Inicio}->{Programas}->{Accesorios}->{Herramientas del sistema}->{Tareas programadas}
Agregar tarea programada
Seleccionamos el script anterior
Realizar esta tarea: diariamente
Seleccionamos la hora y si queremos lanzar la tarea únicamente los días laborables o todos los días de la semana
Finalmente, introducimos los credenciales con los que se ejecutará la tarea

Si tenemos muchos PCs, no nos interesará tener que ir PC a PC, manualmente, añadiendo esta planificación, así que para ello, tenemos este segundo script:

/* Planificador.bat */
C:\Windows\system32\schtasks.exe /create /RU DOMAIN\admin /RP AdminPass /SC daily /ST 21:30:00 /TN «Shutdown» /TR C:\apagado.bat

Este script se encargará de crear una tarea planificada llamada «Shutdown» que se ejecutará diariamente a las 21:30, con credenciales DOMAIN\admin, y que llamará al script anterior, apagado.bat.

Únicamente necesitaremos una herramienta de distribución de software para crear un paquete con los dos scripts, que se encargue de primero copiar apagado.bat a C:, y posteriormente ejecute planificador.bat.

Como nota final, dos apuntes: en planificador.bat, podemos añadir al principio una instrucción «copy apagado.bat C:\» para que sea este script el encargado de copiar el planificador.bat a C:\. Finalmente, decir que Windows Home no tiene la utilidad schtasks, así que no podremos usar el script planificador.bat en estos SO.

Fuentes:
http://support.microsoft.com/?kbid=814596
http://technet.microsoft.com/en-us/library/bb490996.aspx
http://wpkg.org/Schtasks_for_XP_Home

Flickr! Foto por cellanr