<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://lucasontivero.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2flucasontivero.spaces.live.com%2fcategory%2fScripting%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Lucas Ontivero: Scripting</title><description /><link>http://lucasontivero.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catScripting</link><language>en-US</language><pubDate>Fri, 15 Aug 2008 15:15:42 GMT</pubDate><lastBuildDate>Fri, 15 Aug 2008 15:15:42 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://lucasontivero.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>3988747590285877710</live:id><live:alias>lucasontivero</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Starting/Stoping Windows Services with WMI from External Tools (VS2005)</title><link>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!220.entry</link><description>&lt;p&gt;A menudo sucede que para compilar una solución es necesario parar algunos servicio (este es el caso en que estamos desarrollando un servicio o compilando alguna .dll referenciada por este) o bien que nuestra aplicación dependa de que se encuentren corriendo algunos de ellos en particular como por ejemplo el SQL Server (MSSQLSERVER), Message Queuing, BizTalk Server Application Service, etc.
&lt;p&gt;También es cierto que comenzar o detener estos desde la consola de servicios es algo un poco tedioso sobre todo si es una tarea que se realiza muy a menudo.  
&lt;p&gt;Mi solución a esto es un Script que mediante WMI arranque o detenga los servicios que necesitamos. Este script recibe por parámetro desde la linea de comandos /start para indicar que debe comenzar los servicios o /stop para detener los servicios. Es importante notar que vamos a trabajar sobre los servicios de un servidor remoto y no sobre nuestra PC por lo que vamos a ver que en el código tenemos hardcodeado los nombres del server, user y password.
&lt;p&gt;Un detalle a tener en cuenta es que a la hora de detener un servicio mediante el método StopService() de la clase WMI_Service, este puede retornar un &amp;quot;Dependent Services Running&amp;quot; indicando que existen servicios corriendo lo cuales dependen del servicio que se intenta detener por lo que la solución es parar todos los servicios dependientes en forma recursiva y la ..... Listo.
&lt;p&gt;Ahora, ya que venimos con la preocupación de ahorrarnos trabajo tedioso, sería estúpido tener que ir a la linea de comandos para escribir: C:\&amp;gt;cscript Services.vbs [/start | /stop]&lt;br&gt;
&lt;p&gt;La solución nos la da &lt;a href="http://mmelchior.blogspot.com/2006/11/utilizando-external-tools.html"&gt;Martín Melchior; las External Tools&lt;/a&gt;. Les paso como queda el registro de Windows con los cambios:&lt;pre&gt;Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\External Tools]
&amp;quot;ToolTitle8&amp;quot;=&amp;quot;Start Services&amp;quot;
&amp;quot;ToolCmd8&amp;quot;=&amp;quot;cscript.exe &amp;quot;
&amp;quot;ToolArg8&amp;quot;=&amp;quot;services.vbs /start&amp;quot;
&amp;quot;ToolDir8&amp;quot;=&amp;quot;C:\\Documents and Settings\\lontivero\\Desktop\\&amp;quot;
&amp;quot;ToolSourceKey8&amp;quot;=&amp;quot;&amp;quot;
&amp;quot;ToolOpt8&amp;quot;=dword:0000001a
&amp;quot;ToolTitle9&amp;quot;=&amp;quot;Stop Services&amp;quot;
&amp;quot;ToolCmd9&amp;quot;=&amp;quot;cscript.exe&amp;quot;
&amp;quot;ToolArg9&amp;quot;=&amp;quot;services.vbs /stop&amp;quot;
&amp;quot;ToolDir9&amp;quot;=&amp;quot;C:\\Documents and Settings\\lontivero\\Desktop\\&amp;quot;
&amp;quot;ToolSourceKey9&amp;quot;=&amp;quot;&amp;quot;
&amp;quot;ToolOpt9&amp;quot;=dword:0000001a
&lt;/pre&gt;
&lt;p&gt; Ok, ya la tenemos como external tools de Visual Studio 2005, así que ¿estamos felices?. Claro que no!! Recuerden que para ser buen desarrollador hay que ser VAGO por eso vamos a ponerles una teclas de acceso rápido. Propongo Ctrl+S, Ctrl+U (Services Up) y Ctrl+S, Ctrl+Down (Services Down). Ahora si.. 
&lt;p&gt;&lt;a href="http://tk4.storage.msn.com/x1pAdjo0uCo2H2T6M0BZ-Ft1eIknYtk8CLToS6eJUBdTpB9pNoWBlo7PvIQguhJ-TAWxKYnTk4CvPvBDqDHOi5SrpUpmG4SAN_gvL14iJNuBJLE_O1sQSVjukmvGkbavZpy4CXZk6473t4jUZ52VeRkocaDu8saqDE5"&gt;&lt;img height=194 src="http://tk4.storage.msn.com/x1pAdjo0uCo2H2T6M0BZ-Ft1eIknYtk8CLToS6eJUBdTpD-38xj3b672WQHaPq8S86HKNEzyX9bPbWdguaOAT3B6WaUweMpoVSsL6r0pweX99rsi4rdyeYv7ghhF4dRF0d7bEyyuWvA11UOU_KgLIE1TQ" width=240&gt;&lt;/a&gt; 
&lt;p&gt; 
&lt;p&gt;El Script:&lt;pre&gt;Dim objWMIService, arrServiceNames, i, arrErrorCodes


Set objSWbemLocator = CreateObject(&amp;quot;WbemScripting.SWbemLocator&amp;quot;) 
Set objWMIService = objSWbemLocator.ConnectServer(&amp;quot;computerName&amp;quot;, &amp;quot;root\CIMV2&amp;quot;, &amp;quot;username&amp;quot;, &amp;quot;password&amp;quot;) 


arrServiceNames = Array(_
 &amp;quot;BTSSvc$BiztalkServerApplication&amp;quot;, _
 &amp;quot;ENTSSO&amp;quot;, _
 &amp;quot;MSSQLSERVER&amp;quot; _
)

arrErrorCodes   = Array( _
 &amp;quot;(succeeded)&amp;quot;,_
 &amp;quot;Request not supported&amp;quot;,_
 &amp;quot;Access Denied&amp;quot;,_
 &amp;quot;Dependent Services Running&amp;quot;,_
 &amp;quot;Invalid Service Control&amp;quot;,_
 &amp;quot;Service cannot accept control&amp;quot;,_
 &amp;quot;Service not active&amp;quot;,_
 &amp;quot;Request timeout&amp;quot;,_
 &amp;quot;Unknown failure&amp;quot;,_
 &amp;quot;Service executable file not found&amp;quot;,_
 &amp;quot;Service Already Running&amp;quot;,_
 &amp;quot;Service database locked&amp;quot;,_
 &amp;quot;Missing dependent service&amp;quot;,_
 &amp;quot;Dependent service failed&amp;quot;,_
 &amp;quot;Service disabled&amp;quot;,_
 &amp;quot;Incorrect authentication&amp;quot;,_
 &amp;quot;Service is being removed&amp;quot;,_
 &amp;quot;No execution thread available&amp;quot;,_
 &amp;quot;Circular dependencies&amp;quot;,_
 &amp;quot;Duplicate service name already running&amp;quot;,_
 &amp;quot;Invalid character in the service name&amp;quot;,_
 &amp;quot;Invalid parameters passed to the service&amp;quot;,_
 &amp;quot;Invalid or underprivileged service account&amp;quot;,_
 &amp;quot;Service already exists&amp;quot;,_
 &amp;quot;Service paused&amp;quot;_
)

For i = 0 To UBound(arrServiceNames)
   SwitchServiceStatus arrServiceNames(i)
Next
WScript.StdOut.WriteLine &amp;quot;Ready.&amp;quot;


Sub SwitchServiceStatus(strServiceName)
   Dim objShare, objOutParams, strMethodName, objArgs, intError

   Set objShare = objWMIService.Get(&amp;quot;Win32_Service.Name='&amp;quot; &amp;amp; strServiceName &amp;amp; &amp;quot;'&amp;quot;) 
   If objShare Is Nothing Then
      WScript.Stdout.WriteLine &amp;quot;There isn't a '&amp;quot; &amp;amp; strServiceName &amp;amp; &amp;quot;' service.&amp;quot;
   Else
      WScript.Stdout.Write &amp;quot;'&amp;quot; &amp;amp; objShare.Caption &amp;amp; &amp;quot;'   &amp;quot;
      strMethodName = IIf(WScript.Arguments(0)=&amp;quot;/start&amp;quot;,&amp;quot;StartService&amp;quot;,&amp;quot;StopService&amp;quot;)

      If strMethodName = &amp;quot;StopService&amp;quot; Then
         SwitchOffDependencies strServiceName
      End If

      Set objOutParams = objWMIService.ExecMethod(_
                            &amp;quot;Win32_Service.Name='&amp;quot; &amp;amp; _
                            strServiceName &amp;amp; &amp;quot;'&amp;quot;, _
                            CStr(strMethodName)_
                         )
      
      If objOutParams.ReturnValue &amp;lt;&amp;gt; 0 Then
         WScript.Stdout.WriteLine arrErrorCodes(objOutParams.ReturnValue)
      End If
   End If
End Sub


Sub SwitchOffDependencies(strServiceName)
   Dim colServiceList, objService

   Set colServiceList = objWMIService.ExecQuery(_
        &amp;quot;Associators of &amp;quot; &amp;amp;_
        &amp;quot;{Win32_Service.Name='&amp;quot; &amp;amp; strServiceName &amp;amp; &amp;quot;'}&amp;quot; &amp;amp;_
        &amp;quot; Where &amp;quot; &amp;amp;_
        &amp;quot;AssocClass=Win32_DependentService &amp;quot; &amp;amp; _
        &amp;quot;Role=Antecedent&amp;quot; )

   For Each objService in colServiceList
      WScript.Stdout.WriteLine &amp;quot;Dependent service: &amp;quot; &amp;amp; objService.Name &amp;amp; &amp;quot;   State: &amp;quot; &amp;amp; objService.State
      If objService.State &amp;lt;&amp;gt; &amp;quot;Stoped&amp;quot; Then
         WScript.Stdout.WriteLine &amp;quot;Stopping dependent service &amp;quot; &amp;amp; objService.Name
         SwitchServiceStatus objService.Name    
      End If
   Next
End Sub

Function IIf(bExpr, exprTrue, exprFalse)
   If bExpr Then
      IIf = exprTrue
   Else
      IIf = exprFalse
   End If
End Function&lt;/pre&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=3988747590285877710&amp;page=RSS%3a+Starting%2fStoping+Windows+Services+with+WMI+from+External+Tools+(VS2005)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lucasontivero.spaces.live.com&amp;amp;GT1=lucasontivero"&gt;</description><comments>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!220.entry#comment</comments><guid isPermaLink="true">http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!220.entry</guid><pubDate>Mon, 27 Nov 2006 19:33:55 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!220/comments/feed.rss</wfw:commentRss><wfw:comment>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!220.entry#comment</wfw:comment><dcterms:modified>2006-11-27T19:33:55Z</dcterms:modified></item></channel></rss>