Agregando lógica a los scripts

La lógica permite que los scripts puedan hacer cosas con las variables que están utilizando y tomar decisiones acerca de qué hacer. Necesitamos saber dos conceptos básicos de lógica para escribir scripts de PowerShell; bucles (loops) y condiciones.

Los bucles o loops le permiten pasar a través de una colección de artículos y hacer algo para cada elemento, por ejemplo, si ejecuta el CmdLet Get-Process en un equipo, PowerShell mostrará una lista de procesos que se estén ejecutando y también, puede asignar la salida de Get-Process a una variable, con el siguiente comando:

$RunningProcesses = Get-Process

En la variable $RunningProcesses, cada proceso está representado por un objeto diferente, se podría recorrer los objetos en esta variable y hacer algo para cada objeto, como mostrar el ID de cada proceso, la forma de lograr esto es con el CmdLet ForEach-Object, como se muestra a continuación:

$RunningProcesses = Get-Process | ForEach-Object {
				  Write-Host "$($_.Name) : $($_.Id)"}

Por medio del Pipeline (|) en la instrucción, la variable $RunningProcesses es recorrida a través de todos los objetos, ejecutando el o los comando dentro de las llaves ({…}) para cada uno de los objetos procesados por el Loop.

Otro tipo de ciclo que podemos utilizar es Do, el ciclo Do le permite recorrer todos los objetos hasta que se cumpla una condición específica. Hay dos tipos de ciclos Do: Do-While y Do-Until.

En un ciclo Do-While, el código se ejecuta una y otra vez, siempre y cuando algo está pasando, por ejemplo, considere el siguiente fragmento de código script:

$Counter = 0

Do {
        Write-Host "Numero Actual: $Counter"
        $Counter++;
        }

While ($Counter -lt 10)

La instrucción Do recorre el código dentro de las llaves por el tiempo que la condición especificada en la instrucción While sea válida, en este ejemplo, el ciclo Do va a seguir adelante, siempre y cuando la variable $Counter sea inferior a 10 (-lt 10), después que el contador ($Counter) llegue a 10 el ciclo se detiene, y por lo tanto sólo los números 0, 1, 2, 4, 5, 6, 7, 8, 9 se muestran.

Con un Do-While, el código dentro de las llaves se ejecuta en primer lugar, y luego se evalúa la condición para determinante si debe continuar o detenerse.

Por otro lado, un ciclo Do-Until  procesa primero la condición. Para entender esto, vamos a convertir el código anterior en un ciclo Do-Until:

$Counter = 0

Do {

    Write-Host "Current Number: $counter"
    $Counter++;
    }

Until ($Counter -gt 10)

Esta vez, el ciclo Do continuará procesando hasta que el contador ($Counter) sea mayor que 10, antes que el código en el ciclo Do se procese se evalúa la condición asegurarse de $Counter sigue siendo 10 o menos.

Después de que la secuencia de comandos muestra que el número actual es 10, $Counter se incrementa a 11, esto hace que la condición ($Counter -gt 10) se cumpla ya que 11 es mayor que 10 y el ciclo Do ya no se procesa.

En nuestros scripts se pueden utilizar las condiciones o ciclos condicionales para tomar decisiones dentro de un script,  una condición que utilizaremos a es If-Else, este ciclo prueba sí determinada condición es verdadera, sí es así, se ejecuta algún código, si no, el ciclo If puede realizar otras comparaciones para evaluar sí alguna otra condición se cumple, por ejemplo:

$RunningProcesses = Get-Process

$RunningProcesses | ForEach-Object {

    $MemUsageMB = $_.PrivateMemorySize / 1024 / 1024

    If ($MemUsageMB -lt 50) {

        Write-Host $_.Name ": Using less than 50MB of memory"
    }
    Else {

        Write-Host $_.Name ": Using " $MemUsageMB "MB of memory"
   	   }
    }

Si ejecutamos este script, obtendremos todos los procesos en ejecución y si está utilizando más de 50 MB de memoria. El comando ForEach-Object recorre todos los procesos, para cada proceso, se evalúa la instrucción If.

El ciclo If recorre los objetos en búsqueda del valor PrivateMemorySize  para verificar si la cantidad de memoria es inferior a 50, sí es así, escribe a la pantalla que el proceso está utilizando menos de 50 MB de memoria, de lo contrario sí el proceso está utilizando más de 50 MB, se ejecuta la instrucción Else.

El parámetro -lt indica que la instrucción If comprueba (en su condición) si $MemUsageMB es menor a 50, además de la instrucción If, se puede utilizar el CmdLet Where-Object, que evalúa los objetos y filtra todo lo que no cumple con la expresión que se ha establecido, por ejemplo, puede utilizar el CmdLet Where-Object siguiendo en una secuencia de comandos para filtrar todos los procesos que utilizan menos de 50 MB de memoria:

Get-Process | Where-Object 
{ $_.PrivateMemorySize / 1024 / 1024 -gt 50 } | 
ForEach-Object { Write-Host $_.Name }

En este comando, el CmdLet Where-Object está pasando por todos los procesos que utiliza más de 50 MB de memoria, los procesos que se superan el filtro se canalizan al CmdLet ForEach-Object para que puedan ser procesados.

También útil para el trabajo con ciclos tenemos los operadores de comparación, aca una buena referencia:

https://technet.microsoft.com/en-us/library/hh847759.aspx

Hasta la próxima !!!

Matrices y Hash Tables Con PowerShell

Las variables también pueden almacenar matrices que por definición son una lista indexada de valores, a cada elemento se le asigna un número de índice único, el primer elemento de una matriz se le asigna el valor de (0), el siguiente elemento (1), luego (2), y así sucesivamente.

Uno de los usos más populares de una matriz es ejecutar una secuencia de comandos en equipos remotos (entre otros). Por ejemplo, sí usted observa en un script la variable $strComputer = “.” esto significa que el script solo se ejecutará en el equipo local, sin embargo, usted podría ejecutar el script en un equipo remoto mediante la modificación del código como este:

$strComputer = "RemoteComputerName"

Pero, y si desea ejecutar la secuencia de comandos en varios equipos de la red, la respuesta es mediante el uso de una matriz.

Para crear una matriz, creamos una variable y la asignamos la matriz. Las matrices se crean con el símbolo “@”, por ejemplo; tomemos el debate anterior y utilicemos una matriz para ejecutar el script a varios equipos remotos:

$strComputers = @("Server1", "Server2", "Server3")

Ahora tenemos tres valores almacenados en la variable $strComputers, también podemos observar que cada valor de la matriz está separado por una coma.

Para obtener los valores de esta matriz solo basta con llamarla por su nombre desde nuestro script o haciendo énfasis a sus índices como lo mencionamos anteriormente, por ejemplo para obtener el valor “Server2” tenemos que llamar la matriz de esta forma:

$strComputers[1]

Otro tipo de matriz que podemos manejar en PowerShell son las Hash Table también se conoce como un diccionario. Es una matriz que permite almacenar datos de manera “clave-valor”, la “clave” y las entradas de “valor” puede ser cualquier tipo de datos y longitud, los elementos deben estar entre comillas dobles si contienen espacios.

Al igual que en un matriz, una Hash Table se inicia con el símbolo (@), hay diferencias entre ambas, por ejemplo, los elementos de la matriz se encierran entre paréntesis () mientras que en el Hash Table entre llaves {} y sus elementos están separados por punto y coma. Veamos cómo crear un Hash Table de usuarios asociados a su número de empleado:

$EmpNumbers = @{"Carlos Mata" = "112233";
                "Vanessa Paez" = "223344";
                "Richard Villalobos" = "334455"}

Esto nos creará una “mini base de datos”, donde almacenaremos los valores mencionados, sin embargo, como obtendremos acceso a los datos, por ejemplo de Vanessa Páez, lo hacemos de la siguiente forma:

$EmpNumbers["Vanessa Paez"]

Hasta la próxima !!!

Etiquetado , ,

Un Nuevo Comienzo | ITPro.es

mudanza

Hace unos 5 meses cuando inicie este blog como proyecto, no imagine que la experiencia iba a ser tan gratificante y enriquecedor desde todo el sentido de la palabra.

Actualmente he publicado unos 28 artículos y recibido un poco mas de 2000 visitas en todo este tiempo.

Un par de días atrás recibí la invitación para mover mi contenido y seguir posteando en ITPro.es así que he decidido moverme y continuar con esta gran aventura.

Espero verlos a tod@s en mi nueva casa

http://blogs.itpro.es/jimcesse

Etiquetado ,

SharePoint Single Server: Consideraciones de Implementación

server-icon

La arquitectura de SharePoint Server se compone de tres roles principales: Web End-Front (WEF), Application Server y Database Server a la unión de estos roles se les llama Granja (Farm).

Cada uno de ellos cumple una función especifica dentro del rol de la aplicación, por ejemplo; WFE es quien interactúa con el usuario, application server es quien ejecuta servicio específicos como Business Data Connectivity Service (entre otros) y por su parte el Database Server es quien nos aloja la base de datos.

En ambientes grandes y con necesidades de alta disponibilidad y rendimiento se recomienda una distribución de estos roles en diferente Hardware, sin embargo para fines de desarrollo o ambiente pequeños con una cantidad limitada de usuarios y sitios, se podría tener todos los roles en el mismo equipo a este escenario llamaremos SharePoint Single Server.

Para SharePoint Single Server tenemos algunas consideraciones:

Hardware

Parte

Mínimo

Recomendado

Observaciones

       
CPU 4 Cores 8 Cores Para ambientes de pruebas o desarrollo se recomiendan 4 cores y para ambientes de producción 8.
Memoria RAM 8 GB 16 GB Se recomiendan 2 GB por core.
HDD 80 GB 160 GB Se recomienda como espacio disponible entre 80 GB y 160 GB para la partición que aloja el sistema operativo.

Limitaciones

La principal limitación de este escenario siempre será el aprovechamiento de los recursos de hardware ya que todos los roles compiten por ellos. Sin embargo también existen otras consideraciones por ejemplo; no se puede instalar sobre un controlador de dominio, si se instala sobre la versión express de SQL la base de datos solo podrá crecer hasta 4 GB, además que la funcionalidad User Profile Synchronization solo es soportada por SQL en su versión completa.

Otra consideración que se puede evaluar a la hora de experimentar problemas de rendimiento en un ambiente Single Server podría ser opción de limitar el uso de memoria RAM por parte del motor de base de datos, aun no es una practica muy recomendada es importante tenerla en mente.

Solo me queda compartir con ustedes una información adicional:

SQL Server Memory Options: http://bit.ly/vZZd88

Server and Site Architecture: http://bit.ly/cZ6s

 

Hasta la próxima !!!

Etiquetado , , , ,

WSUS Sobre Windows 8 Beta

Windows-8-logo

Con el lanzamiento de ayer de Windows 8 Beta empiezan a salir a la luz información acerca sus características y funcionalidad, en este caso WSUS.

El Equipo de Producto para WSUS publico el día de hoy un excelente paso a paso sobre la “Experiencia” de WSUS para este nuevo sistema operativo, dentro de las cosas mas destacadas se encuentran la posibilidad de administrar la herramienta con PowerShell, Administración mediante el Server Manager y la separación de los clientes y el servidor.

 

El equipo de producto, promete un post por semana acerca de todo lo nuevo que nos traer WSUS para Windows 8.

En lo personal, WSUS es uno de los productos con los que mas interactúo y es unos de mis favoritos así que espero tener tiempo para echarle mano a las pruebas Sonrisa.

No esta demás agregar un par de RSS al Outlook con los Blogs del Equipo de Windows, WSUS y por supuesto el de Jimcesse Risa para esta completamente informados acerca de los cambios que nos traerá esta nueva maravilla llamada Windows 8.

Información Adicional:

Blog del Equipo de Windows: http://bit.ly/bI2PxV

Blog del Equipo WSUS: http://bit.ly/AqWF78

Acerca de WSUS sobre Windows 8: http://bit.ly/yk5kA9

 

Hasta la próxima !!!

Etiquetado , ,

Limpiando AD DS con DSQuery

find-person

Hablando de Active Directory una tarea muy recurrente es la administración de objetos “obsoletos” en el ambiente. En lo personal siempre he preferido “deshabilitar” objetos como usuarios o computadoras, esperar un tiempo prudencial y luego eliminar dichos objetos… una practica que me ha salvado en mas de una ocasión Sonrisa.

Si pensamos en ambientes medianos o grandes donde la administración se vuelve aun mas compleja por su arquitectura, la línea de comandos se vuelve nuestra mejor aliada para llevar acabo dicha tarea. Con herramientas como DSQuery podemos hacer consultas y obtener información acerca de cuales objetos no han tenido actividad en un determinado periodo.

Por ejemplo si quisiéramos saber cuales usuarios tienen mas de cuatro semanas de no reportar actividad alguna contra el directorio podemos ejecutar el siguiente comando:

DSQuery User -Inactive 4

 

La salida de ese comando nos mostrará un listado de usuarios que tienen mas de 4 semanas de inactividad.

Si por el contrario, quisiéramos hacer el mismo ejercicio con las computadores el comando seria así:

DSQuery Computer -Inactive 4

Como ven dos simples comandos que nos pueden facilitar la administración de nuestra organización AD DS y si vamos un poco mas allá podríamos meter todo dentro de una rutina programarla y que nos llegue por correo.

Información Adicional:

http://technet.microsoft.com/en-us/library/cc732952(v=ws.10).aspx

http://technet.microsoft.com/en-us/library/cc730720(v=ws.10).aspx

http://technet.microsoft.com/en-us/library/cc725702(v=ws.10).aspx

Hasta la próxima !!!

Etiquetado ,

Trustwave 2012 Global Security Report

Ya se encuentra publicado el Trustwave 2012 Global Security Report el documento es el resultado del análisis del comportamiento de amenazas, malware, SPAM entre otros temas que se tocaron en el 2012.

El reporte es de la autoría de SpiderLabs, el cual se especializa en seguridad de aplicaciones, repuesta a incidentes, test de penetración, seguridad física y en temas de investigación siempre enfocada en la seguridad.

El reporte es muy bueno así que queda súper recomendado, para descargarlo deben llenar un pequeño formulario con información básica y su descarga es completamente gratuita… Así que espero lo disfruten.

Descarga: https://www.trustwave.com/global-security-report

Hasta la próxima !!!

Etiquetado , ,

Port Forwarding en Forefront TMG

Security-Camera-icon

Una pregunta muy frecuente que la gente siempre hace cuando nos referimos a TMG o inclusive ISA Server es como reenviar puertos a una IP especifica (Port Forwarding).

Un ejemplo muy común es cuando en nuestra red interna tenemos un grabador de video digital (DVR) o alguna cámara IP y necesitamos tener acceso desde de Internet.

En este caso debemos hacer un reenvío de puertos según sean las necesidades del grabador a una IP especifica mediante una regla de publicación de un servidor no web en caso que nuestra relación de red entre el segmento donde se encuentre el DVR e Internet sea NAT o caso contrario una regla de acceso si es ROUTE.

Para ver el escenario, tomaremos como referencia un DVR cualquiera que necesita tres condiciones para su publicación:

1. Puerto 1720 en TCP

2. Puerto 60000 y 60001 en TCP

3. Puertos 60000 y 64999 en UDP

Planteemos el escenario:

Imaginemos que nuestra red interna es 192.168.1.0/24 y nuestra red externa es 170.168.1.0/30 y la relación de red que existe entre ambas redes es de NAT, ósea para este caso especifico traduzco desde y hacia Internet mi red interna en la IP 170.168.1.2, hasta este punto espero me haya explicado bien el escenario Risa.

Paso 1: Definir los puertos, para ello vamos a la opción Firewall Policy > Toolbox (a la derecha de la pantalla) > Protocols > New > Protocol lo cual nos levantara el asistente “New Protocol Definition”.

PF_TMG01

En la primera pantalla nos pide un nombre para el puerto que vamos a definir, en este caso le llamaré DVR-Listener y hacemos clic en siguiente.

En la segunda pantalla definiremos los rangos de los puertos que componen a DVR-Listener haciendo clic en el botón “New

PF_TMG02

Una vez que pulsemos el botón New nos desplegará la ventana para editar los rangos que requerimos en este caso vamos a usar 1720 en TCP, 60000, 60001 en TCP y 60000 y 64999 en UDP, tal como se muestra a continuación

PF_TMG03

Una aclaración adicional es que para los puertos TCP la dirección del puerto debe ser Inbound y para UDP Receive. Luego damos siguiente y cuando nos pregunte si deseamos una conexión segundaria marcamos que no y luego aceptamos todas las ventanas que tengamos…

PF_TMG04 

Paso 2: Regla de Publicación, acá usaremos un regla de publicación de un servidor no web Firewall Policy > Task (a la derecha de la pantalla) > Publish Non-Web Server Protocols y nos levantara el asistente para hacerlo.

PF_TMG05

Con el nombre establecido daremos clic en siguiente, para definir la IP del DVR o Cámara IP, en este caso al DVR le asignaremos 192.168.1.50 y hacemos clic en siguiente…

PF_TMG06

En la siguiente pantalla seleccionaremos el protocolo que creamos anteriormente (DVR-Listener) y hacemos clic en siguiente…

PF_TMG07

En la próxima pantalla seleccionaremos desde cual red vamos a aceptar solicitudes o desde otro punto de vista, cual será el origen de las solicitudes que vamos a aceptar…

PF_TMG08

La siguiente pantalla es un resumen de la configuración y finalmente pulsamos el botón Finish para de esta forma ya tenemos el reenvío de puertos configurado.

Como ven esta es la forma que tenemos en ISA Server o TMG para hacer Port Forwarding.

Hasta la próxima !!!

Etiquetado , ,

Setup Failed to Install ADAM.\r\n (0x80074e46)

Untitled - Copy

A continuación veremos un poco de Troubleshooting para solucionar el mensaje de error: Setup Failed to Install ADAM.\r\n (0x80074e46) que se puede producir durante la instalación de Forefront TMG. 

Como ven el mensaje de error es poco intuitivo y además no nos dice por donde deberíamos de empezar a buscar o que información debemos buscar para obtener mas información, así que les comentaré los pasos que seguí para resolver el problema.

Ambiente:

Acá estamos instalando sobre un HP ML150 G6, con Windows Server 2008 R2 Estándar y Forefront TMG 2010 también estándar.

Recopilando Información:

Bueno como ya dije antes, el mensaje no es muy intuitivo lo único que podemos reconocer en el error es la palabra ADAM lo cual sabemos que en Windows Server 2008 cambio a AD LDS el cual es un rol indispensable para TMG ya que sobre el montaremos el Storage con la configuración de nuestro ambiente, por lo que buscaremos en esta ruta %windir%\debug el registro de eventos de instalación para obtener mas información.

Analizando la Información:

Con el log en mano, veamos que dice:

Untitled2

Como verán hay un par de eventos que se repiten constantemente: The trust relationship between this workstation and the primary domain failed y The wizard could not access the registry.

Troubleshooting:

Bueno para el primer mensaje (The trust relationship between this workstation and the primary domain failed) hay un comando que podemos usar para verificar la relación de confianza entre el equipo y su dominio, seria algo así: nltest /sc_verify:midominio.com veamos la salida de este comando:

Untitled3

Como ven en la salida de nltest la relación de confianza esta bien establecida, así que en este punto podríamos descartar esa opción.

Acá solo nos queda analizar que aplicaciones o configuraciones de nuestro sistema operativo nos podrían estar denegando el acceso al registro, por lo que apuntamos a dos posibles opciones, anti-virus (si existiera) y el AUC.

Solución:

Al menos en mi caso deshabilitando el anti-virus y el AUC me dejo instalar sin problemas, luego buscando información para documentar este post encontré una entrada del equipo de ISA Server / TMG donde explican algunos otros escenarios donde se podría producir este error, el link sería este:

http://blogs.technet.com/b/isablog/archive/2010/07/07/troubleshooting-error-setup-failed-to-install-adam-r-n-0x80074e46-and-0x80070643-while-trying-to-install-tmg-2010.aspx

Información Adicional:

https://jimcesse.wordpress.com/2011/11/16/como-hacer-troubleshooting/

 

Hasta la próxima !!!

Etiquetado , ,

Server Name: UnKnown

Esta semana para mi ha sido muy peculiar ya que estoy en Nicaragua ayudando en el proceso de implementación de una infraestructura, entre las cuales tenemos AD DS, TS, TMG VPN entre otras cosas…

Me gustaría compartir un Tip rápido acerca de un inconveniente que tuvimos en días atrás… Al hacer NSLOOKUP recibimos “Server Name: UnKnown” como respuesta del DNS Server lo que solucionamos creando en la zona reversa, la sub red en la que estamos trabajando y luego corrimos un IPCONFIG /REGISTERDNS en el servidor para que se volvieran a crear los registro.

 

Hasta la próxima !!!

Etiquetado , ,