Script para iniciar/detener varios servicios con PowerShell

windows_powershell

 

Quería compartirles un post que hace poco escribir sobre un uso practico de powershell en nuestras vidas cotidianas como desarrolladores.

Introducción

Para todo desarrollador, su computador es su estación de trabajo, en ella desempeñan diferentes labores, digamos que el 100% del tiempo no se utilizan para desarrollar. El resto de tiempo, necesitamos que nuestra PC dedique toda su capacidad de procesamiento a las tareas que nosotros necesitemos.

Para el Desarrollo, los servicios de los que mas requerimos son de los Motores de Bases de Datos, pero en otra actividad, no lo necesitamos.

Objetivo

Optimizar el uso de la CPU y de la Memoria RAM descartando servicios innecesarios y levantándolos solo cuando sea necesario.

Este objetivo es relativamente fácil de conseguir utilizando todo el potencial de Scripting de PowerShell[1]. Lo que haremos es un Script el cual pasemos un parámetro de “Inicio” o de “Parada”, y que realice estas acciones sobre los servicios listados en un archivo de texto.

Administrando Servicios

Para nosotros levantar o detener los servicios[3] cuando nosotros queramos, tenemos que indicar que estos van a ser administrados manualmente. Podemos hacer esto por 2 caminos, directamente por el Administrador de Servicios de Windows o directamente con PowerShell:

Administrador de Servicios de Windows PowerShell
image

  1. Panel de Control
  2. Buscar Services(Servicios)
  3. View Local Services(Ver Servicios Locales)
image

  1. Abrir PowerShell como Administrador
image
Identificamos los servicios a Manipular y Verificamos si el modo de inicio es Automático o Manual.
Si es Manual, continuar con los siguientes pasos.
image
Verificamos el nombre de los servicios con:
Get-Service -Name *sql*

Cambiamos la Propiedad Startup Type con el comando:
Set-Service -StartupType Manual –Name <Nombre del Servicio>

Y Listo, nuestros servicios solo inician cuando nosotros lo indiquemos.

image 
Entramos a las propiedades del Servicio:

  1. Click Derecho sobre el Servicio
  2. Propiedades

Verificamos que el Servicio se inicie Manualmente.

Después de dar Click en Ok, nuestros servicios solo inician cuando nosotros lo indiquemos.

 

 

Manos a la Obra!

Como se dijo anteriormente, vamos a iniciar y a detener los servicios que se listen en un archivo de texto. Creamos nuestro archivo de Texto, y ponemos los servicios en el archivo de texto en el orden en el que se van a iniciar:

image

Este orden será revertido para detener los servicios.

Para leer un archivo desde PowerShell utilizamos el comando:

Get-Content <Ruta hacia el archivo>

image 

Este comando lee liana por línea el archivo.

Para iniciar los servicios utilizamos el comando:

Start-Service <Nombre del Servicio>

Para detenerlo:

Stop-Service <Nombre del Servicio>

Para verificar su estado con:

Get-Service -Name <Nombre del Servicio>

Resultado:

image

Ya tenemos el archivo donde están alojados los nombres de los servicios, ya sabemos como administrar servicios desde PowerShell, nos queda es realizar el script.

para crear el Script, creamos un archivo con la extensión “.ps1” desde el bloc de notas, o directamente desde el Power Shell ISE.

El script es sencillo, solo le pasaremos un parámetro para indicarle si inicia o detiene los servicios, este parámetro será el texto “start” ó “stop”.

El diagrama de flujo de nuestro Script es:

powershell

Ya sabemos leer el archivo, ya sabemos manipular los servicios. Nos falta leer parámetros y manejar arreglos.

Para manejar parámetros simplemente los declaramos al inicio del script:

Param(
[string]$Action
)

Ya con esto tenemos un parámetro fuertemente tipado (solo admite cadenas) en el cual vamos a guardar, como ya se había dicho, el “start” y “stop”.

Para manejar los arreglos, que es donde debemos poner todo el contenido del archivo línea por línea para recorrerlo inversamente, simplemente descargamos todo el contenido del archivo a un arreglo mediante la línea:

$Services = Get-Content $SvcTxtPath 

Se puede hacer esto ya que Get-Content devuelve un arreglo línea por línea del archivo leído.

para determinar el numero de líneas, ya que lo vamos a necesitar para el algoritmo de recorrido hacia atrás del arreglo, lo hacemos mediante:

[int]$lineCount = (Get-Content $SvcTxtPath ).Count

Y Listo. teniendo en cuenta estos detalles y el diagrama de flujo de lo que queremos hacer, nos da como resultado el siguiente script.

#autor qjuanp
#http://qjuanp.blogspot.com

Param(
[string]$Action
)
$SvcTxtPath = "D:JuanDocumentsPsScriptsdevelopServices.txt"
#echo $Action
if($Action.Equals("start")){
	"Iniciando Servicios"
	Get-Content $SvcTxtPath | Start-Service
	"Servicios Iniciados"
	}
elseif($Action.Equals("stop")){
	"Deteniendo Servicios"
	[int]$lineCount = (Get-Content $SvcTxtPath ).Count
	#echo $lineCount
	$Services = Get-Content $SvcTxtPath 
	#echo $Services[1]
	for([int]$i=$lineCount-1; $i -ge 0;$i--){
		"Stop Service: $Services[$i]"
		Stop-Service -Force -Name $Services[$i]
		}
	"Servicios Detenidos"
	}
else {"Error"}

Ya tenemos listo nuestro script, ahora vamos a hacerlo fácil de acceder.

Antes de poder ejecutar el Script debemos habilitar la ejecución de los mismos, ya que por seguridad, solo se permite la ejecutar Scripts que hayan sido firmados digitalmente, para fines prácticos, deshabilitaremos esta propiedad y en futuras ocasiones veremos como se firman los scripts digitalmente.

Ejecutamos PowerShell con premisos de administrador:

image

y ejecutamos la siguiente instrucción y respondemos “Si” a la pregunta:

Set-ExecutionPolicy remotesigned

image

Creando los accesos directos a la ejecución del Script

Simplemente damos click derecho en el lugar donde queremos nuestros accesos directos (yo lo voy a hacer sobre el escritorio), vamos a la opción “Nuevo”-> “Acceso Directo”:

image

dentro de la la ubicación del item:

image

Dentro del cuadro de texto ponemos la línea:

%SystemRoot%system32WindowsPowerShellv1.0powershell.exe 
         -File "D:JuanMy PowerShell Scriptsdevelop.ps1" 
         -Action start

 

y variamos el parámetro “Action” a “stop” para crear el acceso directo para detener los servicios.

Un truco adicional, cuando ya tengamos listo los accesos, vamos a las propiedades:

image

Luego, en la pestaña de “Acceso Directo”, vamos a las opciones avanzadas y activamos la casilla de “Ejecutar como administrador”.

image

Asi nuestro script se ejecutará como administrador y así podrá detener o iniciar los servicios sin problema!

 

A disfrutar com más espacio disponible en nuestra RAM!, solo cuando sea necesario iniciaremos los servicios que son necesarios para nuestra actividad de desarrollo!


 

1. Se utilizara PowerShell en su Versión 1.0

2. Para este punto PowerShell debe estar instalado

3. Para este caso, utilizaremos 2 servicios usados comúnmente en el desarrollo por tratarse del Motor de Base de Datos, que pertenecen a SQL Server 2008 Express Edition. Todo lo desarrollado en este tutorial se puede realizar con cualquier servicio registrado en Windows.

Primer post en Geeks.ms

Un saludo a toda la comunidad Geeks.ms!

Como lo habrán notado este es mi primer post y estoy muy contento por hacer parte de esta GRAN COMUNIDAD!

Y que escribiré en este nuevo blog? bueno, es algo que desde hace rato venia pensando, y la verdad era una pregunta difícil de responder y más tratándose de Geeks.ms, que la conforman en su mayoría Expertos en diferentes temáticas, inclusive algunas personas directamente de Microsoft.

Luego llego a mi cabeza la respuesta…

Yo soy Estudiante de Ingeniería de Sistemas y Computación, actualmente soy el estudiante líder de Colossus.NET (Microsoft Student Tech Club y Semillero de Investigación) que conformamos hace ya 2 (casi 3) años a la cabeza de mi gran amigo y colega Jairo Alberto Contreras junto con otros amigos. Que queríamos en ese entonces con ese proyecto llamado Colossus.NET? poner a prueba muchos de los mitos (y realidades) que existen al rededor de Microsoft, por ejemplo:

  • “a mi como estudiante me queda imposible acceder a una licencia Microsoft!”
  • “Microsoft en la academia? IMPOSIBLE!”

y así muchos otros, además de abrirnos campo y generar conocimiento entorno a estas tecnologías que abarcan gran parte del mercado en el cual nos vamos a desempeñar como Ingenieros de Sistemas y Computación.

Por qué les cuento todo esto? porque de ahí salió mi respuesta a: y que escribiré en este nuevo blog?. Pues bien la respuesta es: escribir sobre las diferentes experiencias de estudiantes al rededor de las tecnologías, en especial, tecnologías Microsoft.

No siendo más, muchisimas gracias por permitirme escribir y hacer parte de Geeks.ms!

Espero les Guste!