{"id":2369,"date":"2014-02-12T17:10:15","date_gmt":"2014-02-12T20:10:15","guid":{"rendered":"http:\/\/www.radians.com.ar\/blog\/?p=2369"},"modified":"2018-01-16T17:12:39","modified_gmt":"2018-01-16T20:12:39","slug":"los-primeros-pasos-del-admin-con-powershell-testing-service-health-howto","status":"publish","type":"post","link":"https:\/\/www.radians.com.ar\/blog\/?p=2369","title":{"rendered":"Los primeros pasos del Admin con PowerShell: Testing Service Health {HowTo}"},"content":{"rendered":"<p align=\"justify\"><a href=\"http:\/\/www.radians.com.ar\/Articulos\/Images\/The-Admins-First-Steps-Testing-Service-H_AB10\/PowerShell1024x7681.jpg\"><img loading=\"lazy\" decoding=\"async\" title=\"www.radians.com.ar \u00a9 2014\" style=\"border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: left; padding-top: 0px; padding-left: 0px; margin: 5px; border-left: 0px; display: inline; padding-right: 0px\" border=\"0\" alt=\"www.radians.com.ar \u00a9 2014\" src=\"http:\/\/www.radians.com.ar\/Articulos\/Images\/The-Admins-First-Steps-Testing-Service-H_AB10\/PowerShell1024x7681_thumb.jpg\" width=\"300\" align=\"left\" height=\"154\" \/><\/a>Quer\u00eda compartir con ustedes esta nota publicada en el blog de Microsoft \u201c<a href=\"http:\/\/blogs.technet.com\/b\/heyscriptingguy\/archive\/2013\/10\/10\/the-admin-s-first-steps-testing-service-health.aspx\">Hey, Scripting Guy! Blog<\/a>\u201d por Ed Wilson. La nota original esta en ingles, pero aqu\u00ed les hago llegar una traducci\u00f3n. Realmente es muy buen material y puede ayudarnos con nuestras tareas de administraci\u00f3n diarias. <\/p>\n<p>Espero que les sea de inter\u00e9s. Saludos, Roberto Di Lello.   <br \/>&#8212;&#8212;-<\/p>\n<h4>The Admin\u2019s First Steps: Testing Service Health<\/h4>\n<p align=\"justify\"><strong>Resumen:<\/strong> Richard Siddaway habla sobre el uso de Windows PowerShell para automatizar las pruebas de salud a trav\u00e9s de su patrimonio servidor.<\/p>\n<p align=\"justify\"><img decoding=\"async\" style=\"border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: left; padding-top: 0px; padding-left: 0px; margin: 5px; border-left: 0px; display: inline; padding-right: 0px\" border=\"0\" alt=\"Hey, chicos del scripting! Pregunta\" src=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/qanda\/q-sm.jpg\" align=\"left\" \/> Hey, Scripting Guy! Acabo de empezar a usar Windows PowerShell para administrar mis sistemas, y me han pedido que pruebe el servicio de salud en mis servidores. \u00bfC\u00f3mo puedo hacer eso? \u2014GK -GK<\/p>\n<p align=\"justify\"><img decoding=\"async\" style=\"border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: left; padding-top: 0px; padding-left: 0px; margin: 5px; border-left: 0px; display: inline; padding-right: 0px\" border=\"0\" alt=\"Hey, chicos del scripting! Respuesta\" src=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/qanda\/a-sm.jpg\" align=\"left\" \/>Hola GK, Honorario del scripting, Richard Siddaway, aqu\u00ed hoy-en reemplazo de mi buen amigo, el chico del scripting. Est\u00e1s de suerte. Hoy, tengo una soluci\u00f3n a esta cuesti\u00f3n como parte de mi serie sobre c\u00f3mo un administrador puede empezar a hacer un uso productivo de Windows PowerShell.<\/p>\n<p align=\"justify\">Una cosa que usted ver\u00e1 en esta serie es que estoy usando una amplia gama de t\u00e9cnicas: guiones, flujos de trabajo, archivos CSV para datos, tablas hash para los datos. La idea es triple:<\/p>\n<ol>\n<li>\n<div align=\"justify\">Para mostrar la mayor cantidad de t\u00e9cnicas diferentes, consejos y trucos que puedo.<\/div>\n<\/li>\n<li>\n<div align=\"justify\">Hay que destacar que casi siempre hay varias formas de lograr el resultado final con Windows PowerShell. \u00bfEstoy afirmando que la forma en que muestro es el mejor? Muy definitivamente no. Lo que ocurre es que el que yo pens\u00e9 que era mejor cuando me sent\u00e9 a resolver el problema.<\/div>\n<\/li>\n<li>\n<div align=\"justify\">Para pasar a trav\u00e9s del proceso de desarrollo, desde el concepto a una herramienta de administraci\u00f3n utilizable.<\/div>\n<\/li>\n<\/ol>\n<p align=\"justify\">Exchange Server 2007 fue el primer producto importante de la gesti\u00f3n que se basa en Windows PowerShell. Entre la serie de cmdlets que Exchange Server 2007 entrega era <strong>Test-ServiceHealth.<\/strong> Esta peque\u00f1a joya ha sido pasado por alto en la masa de la literatura de Exchange, pero la idea detr\u00e1s de esto es grande: Pone a prueba un servidor de Exchange para determinar si los servicios requeridos se est\u00e1n ejecutando. Esto no proporciona un control de salud completo, pero si sabemos que los servicios se est\u00e1n ejecutando, se elimina una gran cantidad de temas. Si se ejecuta la prueba de forma remota, se obtiene un bono porque has impl\u00edcitamente probado la conectividad de red a la m\u00e1quina.<\/p>\n<p align=\"justify\">Te voy a mostrar c\u00f3mo seguir en la tradici\u00f3n de los grandes administradores y robar ese concepto que se utilizar\u00e1 como base de una herramienta que se puede implementar en su entorno para probar otros tipos de servidores y sus servicios, de la misma forma. Podemos agregar Exchange Server en el si as\u00ed lo desea mezclar a ti mismo, pero voy a usar un controlador de dominio, un sistema SQL Server y un servidor web como mis ejemplos.<\/p>\n<p align=\"justify\">Sospecho que ha utilizado <strong><font color=\"#ff0000\" face=\"OCR A Extended\">Get-Service<\/font><\/strong> y est\u00e1 familiarizado con su salida (truncado aqu\u00ed por razones de brevedad):<\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">Get-Service     <br \/>Status&#160;&#160; Name&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DisplayName&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br \/>Running&#160; AdobeARMservice&#160;&#160;&#160; Adobe Acrobat Update Service<\/font>&#160;<\/p>\n<p align=\"justify\">Lo que no puede haber hecho es \u00e9ste:<\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">Get-Service -Name BITS,W32Time, WinRM<\/font><\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">Status&#160;&#160; Name&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DisplayName     <br \/>Running&#160; BITS&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Background Intelligent Transfer Ser&#8230;      <br \/>Stopped&#160; W32Time&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Windows Time      <br \/>Running&#160; WinRM&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Windows Remote Management (WS-Manag&#8230;<\/font><\/p>\n<p align=\"justify\">Los nombres de los servicios que desea ver se utiliza como filtro, por lo que restringir los datos devueltos. Observe que se utiliza el nombre real, no el nombre para mostrar. El mismo resultado se podr\u00eda lograr mediante el uso de <strong><font color=\"#ff0000\" face=\"OCR A Extended\">Where-Object<\/font>:<\/strong><\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">$services = &#8216;BITS&#8217;, &#8216;W32Time&#8217;, &#8216;WinRM&#8217;     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">Get-Service | where Name -in $services<\/font><\/p>\n<p align=\"justify\">Filtrado despu\u00e9s de que el hecho de no es tan eficiente, especialmente cuando se trata de m\u00e1quinas remotas. Podemos llevar esto un paso m\u00e1s all\u00e1 y poner los servicios en una lista antes de llamar a <strong><font color=\"#ff0000\" face=\"OCR A Extended\">Get-Service<\/font>:<\/strong><\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">$services = &#8216;BITS&#8217;, &#8216;W32Time&#8217;, &#8216;WinRM&#8217;     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">Get-Service -Name&#160; $services<\/font><\/p>\n<p align=\"justify\">La \u00fanica diferencia es que hay que poner entre comillas los nombres. En esta etapa, usted tiene la base de la prueba de la salud del servicio. Vamos a definir los servicios que desea utilizar para cada tipo de servidor:<\/p>\n<p align=\"justify\"><strong>Controlador de dominio<\/strong><\/p>\n<ul>\n<li>\n<div align=\"justify\">Active Directory Web Services (ADWS)<\/div>\n<\/li>\n<li>\n<div align=\"justify\">Active Directory Domain Services (NTDS)<\/div>\n<\/li>\n<li>\n<div align=\"justify\">Key Distribution Center Service (KDC)<\/div>\n<\/li>\n<li>\n<div align=\"justify\">Windows Time Service (W32Time)<\/div>\n<\/li>\n<\/ul>\n<p align=\"justify\"><strong>SQL Server<\/strong> <strong>SQL Server<\/strong><\/p>\n<ul>\n<li>\n<div align=\"justify\">Distributed Transaction Coordinator (MSDTC)<\/div>\n<\/li>\n<li>\n<div align=\"justify\">SQL Server (MSSQLSERVER)<\/div>\n<\/li>\n<li>\n<div align=\"justify\">SQL Server Agent (SQLSERVERAGENT)<\/div>\n<\/li>\n<li>\n<div align=\"justify\">SQL Server Integration Services (MsDtsServer100)<\/div>\n<\/li>\n<\/ul>\n<p align=\"justify\"><strong>Web server<\/strong> <strong>Servidor Web<\/strong><\/p>\n<ul>\n<li>\n<div align=\"justify\">IIS Admin Service (IISADMIN)<\/div>\n<\/li>\n<li>\n<div align=\"justify\">Windows Process Activation Service (WAS)<\/div>\n<\/li>\n<li>\n<div align=\"justify\">WinHTTP Web Proxy Auto-Discovery Service (WinHttpAutoProxySvc)<\/div>\n<\/li>\n<li>\n<div align=\"justify\">World Wide Web Publishing Service (W3SVC)<\/div>\n<\/li>\n<\/ul>\n<p align=\"justify\"><strong>Nota<\/strong> Los nombres y tipos de servicios puede variar, dependiendo de su versi\u00f3n de Windows.<\/p>\n<p align=\"justify\">Una de las primeras preguntas que debemos responder es: &quot;\u00bfC\u00f3mo voy a almacenar los nombres de servidor y la lista de servicios asociados?&quot;<\/p>\n<p align=\"justify\">Se puede usar un archivo csv., pero luego se va a comprometer por recorrer a trav\u00e9s de los campos de servicios o al mantener los servicios en un solo campo y dividirlos en una matriz. XML es otra alternativa, pero puede ser dif\u00edcil de trabajar. Vi la siguiente t\u00e9cnica en el foro PowerShell.org, y pens\u00e9 que podr\u00eda ser \u00fatil para este escenario:<\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">$servers = @{}     <br \/>$servers += @{&#8216;Server02&#8217; = &#8216;ADWS&#8217;, &#8216;NTDS&#8217;, &#8216;Kdc&#8217;, &#8216;W32Time&#8217;}      <br \/>$servers += @{&#8216;W08R2SQL08&#8217; = &#8216;msdtc&#8217;, &#8216;mssqlserver&#8217;, &#8216;sqlserveragent&#8217;, &#8216;msdtsserver100&#8217;}      <br \/>$servers += @{&#8216;WebR201&#8217; = &#8216;iisadmin&#8217;, &#8216;was&#8217;, &#8216;WinHttpAutoProxySvc&#8217;, &#8216;w3svc&#8217;}      <br \/>foreach ($key in $servers.keys){      <br \/>&#160; Get-Service -ComputerName $key -Name $servers[$key]      <br \/>}<\/font><\/p>\n<p align=\"justify\">Crear una tabla hash vac\u00eda, y luego a\u00f1adir una serie de tablas hash a ella donde la clave es el nombre del servidor, y el valor es una lista separada por comas de los servicios. A continuaci\u00f3n, puede repetir las claves de tabla hash y utilizar la clave y el valor en <strong><font color=\"#ff0000\" face=\"OCR A Extended\">Get-Service<\/font><\/strong> para recuperar los datos.<\/p>\n<p>Si no te gusta la idea de poner sus datos con la secuencia de comandos, puede crear un archivo de texto que contiene los comandos para crear la tabla hash (lo llamar\u00e9 servers.txt):<\/p>\n<p><font color=\"#ff0000\" face=\"OCR A Extended\">$servers = @{}     <br \/>$servers += @{&#8216;Server02&#8217; = &#8216;ADWS&#8217;, &#8216;NTDS&#8217;, &#8216;Kdc&#8217;, &#8216;W32Time&#8217;}      <br \/>$servers += @{&#8216;W08R2SQL08&#8217; = &#8216;msdtc&#8217;, &#8216;mssqlserver&#8217;, &#8216;sqlserveragent&#8217;, &#8216;msdtsserver100&#8217;}$servers += @{&#8216;WebR201&#8217; = &#8216;iisadmin&#8217;, &#8216;was&#8217;, &#8216;WinHttpAutoProxySvc&#8217;, &#8216;w3svc&#8217;}<\/font><\/p>\n<p>A continuaci\u00f3n, podemos modificar la secuencia de comandos para que se vea as\u00ed:<\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">Invoke-Expression (Get-Content servers.txt -raw)     <br \/>foreach ($key in $servers.keys){      <br \/>&#160; Get-Service -ComputerName $key -Name $servers[$key]      <br \/>}<\/font><\/p>\n<p align=\"justify\">El truco est\u00e1 en esta l\u00ednea:<\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">Invoke-Expression (Get-Content servers.txt -raw)<\/font><\/p>\n<p align=\"justify\">Utilizamos <font face=\"OCR A Extended\"><font color=\"#ff0000\"><strong>Get-Content<\/strong> <\/font><\/font>para leer servers.txt. El par\u00e1metro -RAW es nueva en Windows PowerShell 3.0, y es un par\u00e1metro din\u00e1mico para el proveedor de sistema de archivos. S\u00f3lo est\u00e1 disponible para las unidades del sistema de archivos. The Help file states \u201c El archivo de Ayuda &quot;. El par\u00e1metro -RAW ignora nuevos caracteres de l\u00ednea y devuelve todo el contenido de un archivo en una cadena. De forma predeterminada, el contenido de un archivo se devuelve como una matriz de cadenas que se delimitan por el car\u00e1cter de nueva l\u00ednea &quot;.<\/p>\n<p>Esto significa que obtenemos una \u00fanica cadena que <strong><font color=\"#ff0000\" face=\"OCR A Extended\">Invoke-Expression<\/font><\/strong> puede ejecutar. Si se deja fuera del par\u00e1metro <strong>-RAW<\/strong>, obtendr\u00e1 un mensaje de error.<\/p>\n<p align=\"justify\">Esto maneja los datos que vienen, pero la salida deja un poco que desear, ya que no incluye el nombre del equipo. La reacci\u00f3n instintiva es utilizar <strong><font color=\"#ff0000\" face=\"OCR A Extended\">Add-Member <\/font><\/strong>para anexar el nombre del equipo en la salida. Pero antes de hacer eso, vamos a probar lo que en realidad proviene de <strong><font color=\"#ff0000\" face=\"OCR A Extended\">Get-Service<\/font>:<\/strong><\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">PS&gt; Get-Service | select -f 1 | fl *     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">Name&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; : ADWS     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">RequiredServices&#160;&#160;&#160; : {}     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">CanPauseAndContinue : False     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">CanShutdown&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; : True     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">CanStop&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; : True     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">DisplayName&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; : Active Directory Web Services     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">DependentServices&#160;&#160; : {}     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">MachineName&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; : .     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">ServiceName&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; : ADWS     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">ServicesDependedOn&#160; : {}     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">ServiceHandle&#160;&#160;&#160;&#160;&#160;&#160; : SafeServiceHandle     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">Status&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; : Running     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">ServiceType&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; : Win32OwnProcess     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">Site&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; :     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">Container&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; :<\/font><\/p>\n<p align=\"justify\">Tenemos una propiedad llamada <strong><font color=\"#ff0000\" face=\"OCR A Extended\">MachineName<\/font>.<\/strong> En este caso, como un valor <strong>&quot;.&quot;,<\/strong> Lo que indica que la m\u00e1quina local. Todo lo que tenemos que hacer uso de <strong><font color=\"#ff0000\" face=\"OCR A Extended\">Select-Object<\/font><\/strong> para anular la salida por defecto:<\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">Invoke-Expression (Get-Content servers.txt -raw)     <br \/>foreach ($key in $servers.keys){      <br \/>&#160; Get-Service -ComputerName $key -Name $servers[$key] |      <br \/>&#160; select @{N=&#8217;ComputerName&#8217;; E={$_.MachineName}},      <br \/>&#160; Name, DisplayName, Status      <br \/>}<\/font><\/p>\n<p align=\"justify\">He utilizado un campo calculado para cambiar el nombre de la propiedad <strong><font color=\"#ff0000\" face=\"OCR A Extended\">MachineName<\/font><\/strong> en <strong><font color=\"#ff0000\" face=\"OCR A Extended\">ComputerName<\/font>.<\/strong> Es posible que desee a la salida de estos datos para su uso posterior, o incluso la tuber\u00eda en otro cmdlet. En ambos casos, <strong><font color=\"#ff0000\" face=\"OCR A Extended\">ComputerName<\/font><\/strong>es el nombre del par\u00e1metro com\u00fan, por lo que la propiedad va a funcionar mejor si se cambia el nombre.<\/p>\n<p align=\"justify\">Ahora tenemos una herramienta \u00fatil para comprobar la salud de servicio en los servidores remotos. El inconveniente es que el nombre del archivo est\u00e1 codificado. Como \u00faltimo paso, vamos a hacer que un par\u00e1metro:<\/p>\n<p><font color=\"#ff0000\" face=\"OCR A Extended\">function test-servicehealth {     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">[CmdletBinding()]     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">param(     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">[parameter(Mandatory=$true,     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">&#160;&#160;&#160;&#160;&#160; ValueFromPipeline=$true,     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">&#160;&#160;&#160;&#160;&#160; ValueFromPipelineByPropertyName=$true)]     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">[ValidateScript({Test-Path -Path $_ })]     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">[string]$path     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">)     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">PROCESS{     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">Invoke-Expression (Get-Content -Path $path -Raw)     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">foreach ($key in $servers.keys){     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">&#160; Get-Service -ComputerName $key -Name $servers[$key] |     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">&#160; select @{N=&#8217;ComputerName&#8217;; E={$_.MachineName}},     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">&#160; Name, DisplayName, Status     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">}     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">} # End process     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">}<\/font><\/p>\n<p align=\"justify\">El script se ha convertido en una funci\u00f3n avanzada. Guardemos el c\u00f3digo como <font color=\"#ff0000\" face=\"OCR A Extended\">testservicehealth.ps1 <\/font>y fuente de punto a que se cargue la funci\u00f3n, o incorporarlo en su m\u00f3dulo de caja de herramientas de administraci\u00f3n. Esto significa que usted puede utilizar la funci\u00f3n como un cmdlet. Se acepta la entrada a trav\u00e9s del <strong>par\u00e1metros <font color=\"#ff0000\" face=\"OCR A Extended\">-path<\/font><\/strong>:<\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">test-servicehealth -path .\\servers.txt     <br \/><\/font><font color=\"#ff0000\" face=\"OCR A Extended\">&#8216;servers.txt&#8217; | test-servicehealth<\/font><\/p>\n<p align=\"justify\">La funci\u00f3n toma un solo par\u00e1metro <strong>(<font color=\"#ff0000\" face=\"OCR A Extended\">-path<\/font>),<\/strong> que es obligatorio. Cuando la ruta de acceso al archivo se prueba, se genera un mensaje de error si el archivo no se puede encontrar. <font face=\"OCR A Extended\"><font color=\"#ff0000\"><strong>Get-Content<\/strong> <\/font><\/font>utiliza el valor del <strong>par\u00e1metro <strong><font color=\"#ff0000\" face=\"OCR A Extended\">-path <\/font><\/strong><\/strong>para abrir el archivo.<\/p>\n<p align=\"justify\">El c\u00f3digo de trabajo tiene que estar en un <strong>proceso de<\/strong> bloque <strong>{}<\/strong> porque estamos aceptando la entrada del pipeline (marcamos el inicio, el proceso y el final en bloques para hacer el c\u00f3digo m\u00e1s f\u00e1cil de leer.) Ahora podemos tener un conjunto de archivos que contiene los diferentes conjuntos de servidores o servicios, y eligi\u00f3 el que usted necesita.<\/p>\n<p>Se puede extender este concepto en un n\u00famero de maneras:<\/p>\n<ul>\n<li>A\u00f1adir tipos de servidores adicionales, tales como servidor de archivos, DFS, DNS o DHCP.<\/li>\n<li>Crear una tarea programada para ejecutar el trabajo.<\/li>\n<li>Poner el resultado en un archivo HTML, Word o Excel.<\/li>\n<li>Enviar los resultados de uno o m\u00e1s administradores, especialmente si no fue un fracaso.<\/li>\n<li>Si los servicios no se est\u00e1n ejecutando, reinicie el servicio o incluso la m\u00e1quina.<\/li>\n<\/ul>\n<p align=\"justify\">GK, eso es todo lo que hay que usar Windows PowerShell para comprobar el estado del servicio en sus servidores. La pr\u00f3xima vez, voy a tener otra idea para que usted intente y cuando traiga una mayor automatizaci\u00f3n en su entorno. Mientras tanto, para un mensaje muy especial pruebe esto:<\/p>\n<p align=\"justify\"><font color=\"#ff0000\" face=\"OCR A Extended\">(72,97,112,112,121,32,66,105,114,116,104,100,97,121,32,116,111,32,82,     <br \/>105,99,104,97,114,100 | foreach {[char][byte]$psitem}) -join &quot;&quot;<\/font><\/p>\n<p>Adi\u00f3s por ahora. Richard<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quer\u00eda compartir con ustedes esta nota publicada en el blog de Microsoft \u201cHey, Scripting Guy!&#8230;<\/p>\n","protected":false},"author":1,"featured_media":4291,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[11,158,4,6],"tags":[192,301,195,243],"class_list":["post-2369","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-2008-r2","category-windows-server-2012","category-scripting","category-tools","tag-script","tag-tools","tag-windows-server-2008-r2","tag-windows-server-2012-r2"],"_links":{"self":[{"href":"https:\/\/www.radians.com.ar\/blog\/index.php?rest_route=\/wp\/v2\/posts\/2369","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.radians.com.ar\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.radians.com.ar\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.radians.com.ar\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.radians.com.ar\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2369"}],"version-history":[{"count":1,"href":"https:\/\/www.radians.com.ar\/blog\/index.php?rest_route=\/wp\/v2\/posts\/2369\/revisions"}],"predecessor-version":[{"id":2370,"href":"https:\/\/www.radians.com.ar\/blog\/index.php?rest_route=\/wp\/v2\/posts\/2369\/revisions\/2370"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.radians.com.ar\/blog\/index.php?rest_route=\/wp\/v2\/media\/4291"}],"wp:attachment":[{"href":"https:\/\/www.radians.com.ar\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.radians.com.ar\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.radians.com.ar\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}