jueves, 27 de noviembre de 2014

PowerShell en Windows Server 2008 R2 core

Tengo que tratar con un entorno que tiene el dominio con Windows Server 2008 R2. Al instalar uno para mi laboratorio en el portátil descubro una desagradable cuestión. Resulta que la versión Core de 2008 no trae por defecto PowerShell!!! como!!!

Así que manos a la obra....

Lo primero, podemos utilizar dism para instalar Windows Power Shell y todos los cmdlets en un servidor con core instalado. Estos son los comando:
 
 
Dism /online /enable-feature /featurename:NetFx2-ServerCore
Dism /online /enable-feature /featurename:NetFx2-ServerCore-WOW64
Dism /online /enable-feature /featurename:MicrosoftWindowsPowerShell
Dism /online /enable-feature /featurename:MicrosoftWindowsPowerShell-WOW64
Dism /online /enable-feature /featurename:ServerManager-PSH-Cmdlets

 
Después ya puedes arrancar Windows PowerShell, importar el Server Manager module, y si lo necesitas, utilizar el comando "Add-WindowsFeature" para instalar las características que puedas necesitar.

miércoles, 5 de noviembre de 2014

PowerShell para novatos VI, Diez Comandos Básicos

10 Comandos PowerShell cualquier administrador debería saber.


Yo entiendo que powershell tiene dos variantes, una la dedicada a gestión en la cual solicitamos información o interactuamos con el sistema  y otra mas compleja en la que creamos scripts muy elaborados para realizar también operaciones complecas.

A continuación muestro una serie de comandos de uso habitual por cualquier administrador que intente entrar en este mundillo del powershell y que forman parte de esa variante sencilla de powershell.

1: Get-Help

El primer comando PowerShell cmdlet  que cualquier administrador debería conocer es el encargado de pedir ayuda Get-Help. Es como el "man" en linux y se utiliza del mismo modo para solicitar ayuda sobre un comando. Por ejemplo si quieres conocer como se utiliza o para que sirve el cmdlet "Get-Process" pondríamos lo siguiente:

Get-Help -Name Get-Process
 
y windows nos mostrará la sintaxis completa.
TIP: En lugar de usar "Get-help" tabien puedes usar  únicamente "help", rápido y sencillo.
También puedes utilizar "Get-Help" con nombres o verbos individuales. Por ejemplo para encontrar ayuda sobre todos los comandos que empiezan por "Get" utilizaríamos este comando:

Get-Help -Name Get-*
 
 

2: Set-ExecutionPolicy

Crear scripts básico en PowerShell para realizar ciertas operaciones, pero por defecto Microsoft tiene deshabilitada la ejecución de los mismos para evitar un mal uso o la ejecución de software malicioso. . Existe un comando que regula el uso y ejecución de scripts y es "Set-ExecutionPolicy", el cual nos permite establecer el nivel de seguridad en la ejecución de scripts. Existen cuatro niveles de ejecución disponibles:
  • Restricted -- Es la opción por defecto si consultamos el estado con "Get-ExecutionPolicy" y que solamente nos permite ejecución de comandos de forma interactiva y no permite la ejecución de Scripts.
  • All Signed -- Con esta opción, se podrán ejecutar scripts pero únicamente si están firmados por una entidad de confianza. (un poco rollo por que cada ps1 que quieres utilizar ha de ser firmado previamente para que se pueda ejecutar).
  • Remote Signed -- Con esta política (muy cómoda) cualquier script PowerShell creado localmente podrá ser ejecutado. Los scripts creados remotamente o en otro equipo, solo podran ser ejecutados si son firmados por una entidad de confianza.
  • Unrestricted -- barra libre, o lo que es lo mismo cualquiera... no te cuento lo peligroso que esto puede ser.....It is up to you!!.
Este comando es muy sencillo y sabiendo las opciones que hemos comentado es tan sencillo como:

Set-ExecutionPolicy Unrestricted

3: Get-ExecutionPolicy

Creo que esto ya lo he explicado no? LOL pues eso, en realidad esto tendria que ser el punto 2.

4: Get-Service

Una de los comandos que mas he lanzado en el GUI de windows es "services.msc". Con "Get-Service" obtenemos el mismo resultado, mostrándonos todos los servicios y su estado. Si quieres saber el estado de un servicio concreto puedes añadir "-name"

5: ConvertTo-HTML

En ocasiones puede que necesites enviar una salida de comando a algún jefe o compañero. PowerShell permite realizar esta acción mediante el comando "ConvertTo-HTML".
Para usar este comando, simpremete hay que usar el pipe "|" en la salida de un comando de PowerShell. Es necesario utilizar el modificador "-Property"para controlar que propiedades de la salida queremos "imprimir" a html.

Vamos a utilizar el comando "Get-Service" para ver el funcionamiento de este cmdlet:

Get-Service | ConvertTo-HTML -Property Name, Status > C:\services.htm

6: Export-CSV

Además de poder exportar a HTML utilizando PowerShell, también se puede exportar a CSV para luego ser tratado en Microsoft Excel. El modo de funcionamiento es similar a la que hemos visto previamente en HTML. Como mínimo has de proporcionar el fichero de salida y su ruta. Aquí tenemos el mismo ejemplo de antes con CSV:

Get-Service | Export-CSV c:\service.csv

7: Select-Object

Si utilizas el comando anterior, sabes que hay varias propiedades incluidas en el fichero CSV.  Es habitual que solo se incluyan las propiedades que realmente se necesitan o en las que el administrador está interesado. Para esto utilizamos el comando "Select-Object". El comando "Select-Object" permite especificar que opciones de la salida del comando queremos utilizar . Por ejemplo, para crear un fichero CSV con el nombre de los servicio y status, eructaríamos lo siguiente:

Get-Service | Select-Object Name, Status | Export-CSV c:\service.csv

8: Get-EventLog

Antes he dicho que lo que mas uso es "services.msc" pero otra cosa que también utilizo muy amenudo es el Event log de Windows. Se puede obtener el mismo resultado usando  PowerShell.

Lo primero que tenemos que hacer es ver que logs podremos visualizar:

  Get-Evenlog -list

 Max(K) Retain OverflowAction        Entries Log
 ------ ------ --------------        ------- ---
 20.480      0 OverwriteAsNeeded      12.003 Application
 20.480      0 OverwriteAsNeeded           0 HardwareEvents
    512      7 OverwriteOlder              0 Internet Explorer
 20.480      0 OverwriteAsNeeded           0 Key Management Service
  8.192      0 OverwriteAsNeeded           0 Media Center
    128      0 OverwriteAsNeeded         224 OAlerts
 20.480      0 OverwriteAsNeeded      37.655 Security
 20.480      0 OverwriteAsNeeded      43.372 System
 15.360      0 OverwriteAsNeeded         186 Windows PowerShell


Este comando no permitirá seleccionar el log que queremos visualizar

Get-EventLog -Log "Application"
  
Pero si has lanzado el comando has visto la locura que sale ;-)
Para facilitar un poco la vida hay comandos que podremos lanzar  como por ejemplo mostrar los últimos tres eventos y mostrarlos en formato listado o filtra los eventos con ID 403



Get-EventLog system -newest 3 | Format-List
 
Get-EventLog "Windows PowerShell" | Where-Object {$_.EventID -eq 403}


Microsoft tiene un documento muuu bueno para esto:

http://technet.microsoft.com/en-us/library/ee176846.aspx

9 -10 : Get-Process & Stop-process

Igual que puedes ver los servicio operativos y su estado, también se puede obtener informacion de los processo (como lo hacemos en entorno grafico con ctrl+alt+supr). Tan solo hay que usar "Get-Service". La verdades que solo con esto hacemos mas bien poco... lo siguiente que te apetece hacer matar algo no?

Stop-Process 3512
 
Stop-Process -processname notepad
 

lunes, 3 de noviembre de 2014

PowerShell para novatos V, Primer ejemplo

Vamos a crear una tarea planificada con PowerShell. Si, si  ya se que esto se puede hacer con un precioso GUI, pero ciertas operaciones como por ejemplo el trabajo con “MSA” no se pueden realizar entorno grafico y sólo han sido implementadas de momento mediante el uso de “PoweShell” (dios mio! Que será lo siguiente? Que en Linux solo se pueda hacer algo en entorno grafico?? LOL).  Los siguientes comandos nos permitirán ejecutar un comando determinado ( en nuestro caso un .bat) diariamente a las 3 AM

$taskAction = New-ScheduledTaskAction -Execute "C:\Scripts\micomando.bat"
$taskSchedule = New-ScheduledTaskTrigger -Daily -At 3AM
$taskIdentity = New-ScheduledTaskPrincipal -UserId DOMINIO\usuario -LogonType Password
Register-ScheduledTask -TaskName "Scheduled Batch" -Action $taskAction -Trigger $taskSchedule -Principal $taskIdentity

martes, 28 de octubre de 2014

PowerShell para novatos III, configuracion de caracteristicas



El siguiente paso sería ver que características tenemos instaladas para si procede instalar otras. Lo mas habitual en un servidor es agregarle características como Hyper-V, un servidor WSUS o un IIS.
Lo primero que tenemos que hacer es un listado de características instaladas en el equipo. Para ello lanzamos el siguiente comando:

-          Get-WindowsFeature

Nos mostrará un listado extenso de los que hay o no instalado en el equipo. Es fácil de ver, la característica no instalada se mostrará “[ ]” y la instalada “[X]”. Puede que busquemos algo en concreto, por ejemplo Hyper-V.  Para ello si ejecutamos este comando:

-          Get-WindowsFeature Hyper-V

-          Get-WindowsFeature Hyper-V* (mejor esta opción porque muestra todo lo relacionado)

Si la característica que buscamos está disponible (como es mi caso) tan solo tendremos que activala

-          Install-WindowsFeature –name Hyper-V
-      Install-WindowsFeature Hyper-V

Y para quitarlas?

Remove-WindowsFeature name -restart


lunes, 27 de octubre de 2014

PowerShell para novatos II, configuracion de red



Bueno, ya tenemos la pantallita azul de “PS”, ¿y ahora qué?
Lo bueno es que muchos comandos que metíamos en “CMD” funcionan… y uno que usamos hasta desgastarlo, “IPCONFIG” funciona!!! Si, si queréis saber cuál es vuestra configuración de red podéis lanzar un “IPCONFIG” de toda la vida y listo… aunque esto no es muy interesante si queremos familiarizarnos con PS no?

En PowerShell los comandos son compuestos. Empiezan con un verbo de lo que queremos hacer…  en ingles claro!, un guion y un sustantivo. El comando fácil/seguro es el que empieza por “GET” ya que nos muestra información sobre algo… 

Por ejemplo y para este caso que nos lleva podemos obtener información de los adaptadores…. Con

-          Get-Netadapter

Y… que es eso! Donde está la información!!! Tranquilos, esto ha cambiado un poco… Lo que nos muestra es la información de adaptadores de red instalados en nuestra máquina.
Si queremos información más concreta, tendremos que tomar nota por ejemplo del campo “name” y lanzamos el comando de nuevo para obtener la información de una sola tarjeta:

-          Get-Netadapter –name Ethernet 1

Vale, mismo resultado pero en una línea, no nos preocupemos… ahora lanzaremos otro comando y lo uniremos con lo que se conoce como “pipe”. Un “pipe” es, explicado en breve (y puede que poco preciso) un enlace entre comandos. La traducción literal es “tubería” básicamente es pasarle la salida de un comando a otro… El símbolo que se utiliza es este “|”.
Vamos a poner un ejemplo:

-          Get-Netadapter –name Ethernet 1 | Format-List

Bueno, esto nos da más info, pero sigue siendo insuficiente, donde está la ip?? Vale, vale, pues pon “*”

-          Get-Netadapter –name Ethernet 1 | Format-list *


Uff nos hemos pasado! LOL. Ahí tenemos toda la info del adaptador de red, demasiada no? Es más, no aparece la IP… No, estoy tomando el pelo a nadie, solo quiero familiarizarnos con PowerShell recuerdas?. Imagina que ahora solo quieres uno de los muchos valores que se muestran…. Por ejemplo “linkspeed”, pues nada, lo ponemos

-          Get-Netadapter –name Ehternet 1 | Format-list linkspeed
-          Get-Netadapter –name Ethernet 1 | Format-list linkspeed,virtual

Que pesado, pero si yo lo que quiero es la IP de la tarjeta!!! Mira que das vueltas!!! LOL
Vale, el comando es

                Get-NetIPAddress

Hombre si solo tienes una tarjeta de red, con esto todo quedaría resuelto pero… si tienes varias como yo lo que te muestra en pantalla puede ser una locura! ¿¿Cómo sé que tarjeta es la que quiero?? Ahhh para eso lo que hemos hecho antes!!! Primero vemos los adaptadores que tenemos:

-          Get-NetAdapter

Buscamos el que queremos y tomamos nota de su “ifIndex”, que es su número de identificación, por ejemplo el “14” o el “15”
TIP: Hay uno que no aparece aquí, y es el “1”, dedicado al bucle loopback o lo que todos conocemos como “127.0.0.1” que utilizamos para hacer pruebas.
Después será tan sencillo como hacer un:

                - Get-NetIPAddress -interfaceindex 15

Y ahí lo tenemos! La información completa de nuestro interfaz de red con su dirección de red y… espera un momento, y la máscara de red?? Tranquilos! Está en el aparatado “PrefixLength” y si no sabes lo que es /24 o /16 o /8… mejor lanza un “IPCONFIG” o estudia un poco de redes LOL.
Bueno, ahora que nos hemos reído y aprendido un poco, lanza este comando y vida resuelta:

                - Get-NetIPConfiguration

Ahí tendrás todo, IP,GW y DNS desde PowerShell, pudiendo con lo aprendido discriminar por adaptador.


Que bonito, ¿y como pongo ahora la IP? Bueno, ahora , con toda la información que tenemos se reduce a un simple comando:

-          New-NetIPAddress –InterfaceIndex “15” –IPAddress  “192.0.2.2” –PrefixLength “24” –DefaultGateway “192.0.2.1”
 
Muy bien, pero veo que me falta algo… DNS! Si claro! Pero esto va en un commando aparte, no se puede poner en el mismo.
 
-          Set-DNSClientServerAddress –InterfaceIndex “15” -ServerAddresses “192.0.2.4”
-          Set-DNSClientServerAddress –InterfaceIndex “15” -ServerAddresses “192.0.2.4,192.0.2.5”
 
Vale! La he liado y ahora quiero volver otra vez a tener todo como al principio y empezar de nuevo… No pasa nada, dos comandos:
 
-          Set-DnsClientServerAddress –InterfaceIndex “15”–ResetServerAddresses
-          Remove-NetIPAddress -InterfaceIndex 15

Que bonito, ¿y como pongo ahora la IP? Bueno, ahora , con toda la información que tenemos se reduce a un simple comando:

-          New-NetIPAddress –InterfaceIndex “15” –IPAddress  “192.0.2.2” –PrefixLength “24” –DefaultGateway “192.0.2.1”
 
Muy bien, pero veo que me falta algo… DNS! Si claro! Pero esto va en un commando aparte, no se puede poner en el mismo.
 
-          Set-DNSClientServerAddress –InterfaceIndex “15” -ServerAddresses “192.0.2.4”
-          Set-DNSClientServerAddress –InterfaceIndex “15” -ServerAddresses “192.0.2.4,192.0.2.5”
 
Vale! La he liado y ahora quiero volver otra vez a tener todo como al principio y empezar de nuevo… No pasa nada, dos comandos:
 
-          Set-DnsClientServerAddress –InterfaceIndex “15”–ResetServerAddresses
-          Remove-NetIPAddress -InterfaceIndex 15