¿Qué es Windows PowerShell y qué come? Parte 5: acceso a objetos externos



Los sistemas operativos Windows admiten una variedad de infraestructuras de objetos. Puede utilizar interfaces de programación de aplicaciones (API) para acceder a ellas, pero el desarrollo de aplicaciones completas no siempre está justificado. PowerShell tiene cmdlets especiales que le permiten acceder a objetos .NET, COM, WMI (CIM) y ADSI de forma interactiva. En la cuarta parte de la serie, aprendimos los conceptos básicos con un enfoque en las clases de .NET Core, y ahora queremos profundizar en el tema y comprender las características de la interacción de PowerShell con objetos externos.

Tabla de contenido:


Trabajar con JSON, XML y CSV
Trabajar con WMI y CIM
Trabajar con objetos COM
Trabajar con servicio de directorio ADSI
Formateo de salida

Trabaja con JSON, XML y CSV


En los scripts de PowerShell, a menudo tiene que analizar datos JSON, XML y CSV. Por lo general, esta necesidad surge cuando se trabaja con servicios de Internet o con archivos de configuración. Algunos administradores intentan analizar datos usando expresiones regulares, pero no es necesario hacer tales sacrificios: PowerShell tiene cmdlets especiales para la conversión, además, en ambas direcciones.



El formato JSON le permite describir una variedad de objetos y, en esencia, es una tabla hash que se puede anidar. Convertir un objeto JSON en un objeto .NET en consecuencia usando PowerShell es fácil. Dado que los servicios de Internet generalmente dan una línea muy larga en lugar de un archivo con un formato hermoso, esta conversión también puede ser útil para trabajar en modo interactivo. En el siguiente ejemplo, utilizamos una variable de texto de varias líneas para describir el objeto JSON:

$user = @"
{
   "firstName": "Ivan",
   "lastName": "Danko",
   "address": {
       "streetAddress": "Kremlin",
       "city": "Moscow"
   },
   "phoneNumbers": [
       "+7 495 1234567",
       "+7 499 1234567"
   ]
}
"@ | ConvertFrom-Json



El problema inverso se resuelve de manera similar:

$file = Get-ChildItem C:\Windows\System32\notepad.exe
$file.VersionInfo | ConvertTo-Json



La cadena de formato JSON resultante es fácil de enviar a otra aplicación a través de la red. Puede ser, por ejemplo, algún servicio RESTful. Trabajar con los cmdlets ConvertFrom-Csv, ConvertTo-Csv y ConvertTo-Xml está construido de la misma manera, sugerimos a los lectores que lo estudien ellos mismos.

Para trabajar con XML y CSV, necesitaremos otros cmdlets: con



estas herramientas, debe comprender que la conversión de un objeto binario a un formato de texto solo guarda el valor de sus propiedades, pero no los métodos. La conversión de datos JSON, XML o CSV a un objeto .NET usando PowerShell solo es posible si es válida.

Trabaja con WMI y CIM


Windows Management Instrumentation (WMI) es una implementación desarrollada por Microsoft y adaptada a Windows del estándar WBEM (Web-Based Enterprise Management). Se basa en la idea de crear una solución universal para monitorear el entorno de información distribuida de una empresa y administrar sus componentes. La estructura de datos WBEM, a su vez, se basa en el Modelo de Información Común (CIM), que implementa un enfoque orientado a objetos para la representación de sistemas informáticos. Se ha descontinuado el desarrollo y soporte de WMI en Windows; Microsoft recomienda usar un mecanismo similar para administrar la infraestructura: los objetos CIM. Para trabajar con ellos, aparecieron cmdlets especiales en PowerShell 3.0, que consideraremos en paralelo con sus homólogos de WMI. Si el código contiene llamadas de cmdlet para trabajar con WMI, debe reescribirse si es posible.



Dentro del marco del modelo CIM (también se usa en WMI), los datos del sistema operativo se presentan en forma de clases con propiedades y métodos. Las clases se agrupan en orden jerárquico y lógicamente relacionado por tecnología de espacio de nombres o área de gestión. Hay un espacio de nombres raíz raíz que tiene subespacios: CIMv2, Predeterminado, Secutiry y WMI. Para la identificación inequívoca de una instancia de una clase (objeto) y la descripción del estado del recurso correspondiente, se utilizan las propiedades de clase, que generalmente son de solo lectura. Los métodos se utilizan para administrar el recurso.

Se puede acceder a la instancia de clase mediante la ruta completa, que tiene la siguiente forma:

[\\ComputerName\NameSpace][:ClassName][.KeyProperty1=Value1][,KeyProperty2=Value2]…]

donde
ComputerName es el nombre de la computadora;
NameSpace - espacio de nombres;
ClassName: el nombre de la clase;
KeyProperty1 = Value1, KeyProperty2 = Value2: las propiedades del objeto y los valores con los que se identifica.

Antes de PowerShell, no existía una herramienta WMI simple. Para acceder a los objetos, tenía que escribir programas bastante complejos en lenguajes de alto nivel (C ++, Visual Basic, Java Script) o estudiar el shell WMIC (línea de comandos WMI, que también se descontinuó) con su propio lenguaje. A través de PowerShell, el usuario promedio puede acceder a los objetos WMI desde la línea de comandos o en scripts. Primero, conéctese al subsistema WMI y obtenga una lista de clases disponibles mediante el cmdlet Get-WmiObject (alias gwmi). Para obtener una lista de clases CIM, use el cmdlet Get-CimClass.

Get-CimClass
Get-WmiObject -List



Hemos enumerado las clases en la computadora local, pero puede conectarse al control remoto:

Get-CimClass -ComputerName IP- 
Get-CimClass -ComputerName _

o

Get-WmiObject -ComputerName IP- -List
Get-WmiObject -ComputerName _ -List

De forma predeterminada, los cmdlets Get-CimClass y Get-WmiObject se conectan al espacio de nombres Root \ CIMV2, que almacena una gran cantidad de clases para administrar el sistema. Para cambiar el espacio de nombres, use el parámetro -Namespace:

Get-CimClass -Namespace Root
Get-WmiObject -Namespace Root -List

Conociendo el nombre de la clase, no es difícil obtener instancias de ella. El siguiente comando devuelve todas las instancias de Win32_Service, es decir Servicios registrados en la máquina local:

Get-WmiObject Win32_Service

Al igual que con otros tipos de objetos, se muestra una lista de propiedades y métodos con Get-Member. Se puede acceder a los métodos de objetos WMI directamente o mediante el cmdlet Invoke-WmiMethod. También puede usar cmdlets para objetos WMI para ordenar, filtrar, agrupar, etc.

Get-WmiObject Win32_Service | Get-Member



Para obtener objetos CIM (instancias de clases), use el cmdlet Get-CimInstance. A diferencia de WMI, los objetos CIM resultantes (objeto resultante o instancias de clase) no contienen métodos de clase. Como no puede extraer directamente un método, debe invocar el cmdlet Invoke-CimMethod. Considere la clase Win32_Service (servicios que se ejecutan en el sistema) y su instancia para el servicio de cola en la máquina local:

Get-CimInstance Win32_service -filter "Name='spooler'" 



Veamos la estructura del objeto resultante:

Get-CimInstance Win32_service -filter "Name='spooler'" | Get-Member



En este punto, los beneficios de los cmdlets para trabajar con objetos CIM no son obvios. Se relacionan principalmente con el trabajo remoto en un entorno distribuido y se discutirán en detalle en el último artículo de la serie dedicado a resolver problemas prácticos de administración.

También hay un kit de herramientas específico de WMI: WMI Query Language (WQL), un lenguaje de consulta similar a SQL. Una consulta WQL para buscar todas las nuevas empresas al iniciar un sistema de servicio se ve así:

select * from win32_service where startmode="Auto"

Desde PowerShell, se ejecutan de la siguiente manera:

Get-WmiObject -Query 'select * from win32_service where startmode="Auto"'



Trabajar con objetos COM


Para garantizar la interacción entre aplicaciones en Windows, se desarrolló una tecnología para vincular e incrustar objetos (Object Linking and Embedded u OLE). Más tarde, apareció la tecnología de automatización OLE, con la ayuda de la cual las aplicaciones cliente de automatización podían llamar funciones de otras aplicaciones: servidores de automatización. OLE y OLE Automation se basaron en la tecnología central del Modelo de objetos componentes (COM), que ofrece un único estándar binario para componentes de software. Los objetos creados con él y registrados en el sistema operativo se pueden usar en otras aplicaciones usando archivos ejecutables o bibliotecas dinámicas.

A mediados de los noventa, en lugar de OLE, comenzó a usarse otro término: ActiveX. Antes de la llegada de la plataforma .NET, la tecnología ActiveX se consideraba clave, y los objetos COM todavía se utilizan activamente para integrar aplicaciones en Windows: muchos productos de Microsoft y de terceros son servidores de automatización y proporcionan acceso a sus servicios a través de ellos. Para acceder a los objetos, se utiliza ProgID, un identificador simbólico que se les asigna al registrarse en el registro de Windows. Tiene la siguiente forma:

_..

La versión generalmente no está indicada:

_.

Algunos ejemplos de ProgID disponibles son: InternetExplorer.Application (aplicación de Internet Explorer), Word.Application (aplicación de Microsoft Word), WScript.Shell (clase Shell del modelo de objeto de servidor de script de Windows o WSH).

Puede crear una instancia del objeto con el cmdlet New-Object descrito en el artículo anterior y ver su estructura con Get-Member:

$myshell = New-Object -ComObject WScript.Shell
$myshell | Get-Member



Para trabajar con objetos, se utilizan propiedades y métodos. Digamos, para crear un acceso directo en el escritorio del usuario, debe llamar al método CreateShortcut ():

$link = $myshell.CreateShortcut("$Home\Desktop\Home.lnk")

Tenga en cuenta que el acceso directo también es un objeto COM:

$link | Get-Member



Nos queda completar sus propiedades y guardar:

$link.TargetPath = $Home
$link.Save()

De esta manera, creamos un acceso directo en el escritorio del usuario activo, y ahora analizaremos el trabajo con servicios de automatización externos utilizando el ejemplo del objeto COM Shell.Application. Con él, puede automatizar algunas acciones en el Explorador de Windows:

$myshell=New-Object -ComObject Shell.Application

o para abreviar:

$myshell=New-Object -com Shell.Application
$myshell | Get-Member



El objeto Shell.Application tiene bastantes métodos diferentes de administración de ventanas. Por ejemplo, para mostrar el contenido de un directorio dado, se utiliza Explore ():

$myshell.Explore("c:\")

Se llama al sistema de ayuda utilizando el método Ayuda ():

$myshell.Help()


También hay tres métodos para invocar cuadros de diálogo de búsqueda: FindFiles (), FindComputer () y FindPrinter ().

$myshell.FindFiles()
$myshell.FindComputer()
$myshell.FindPrinter()

Puede abrir el cuadro de diálogo de inicio del programa utilizando el método FileRun (), y para llamar a la ventana de configuración de fecha / hora, necesita el método SetTime (). Existen, por ejemplo, métodos para abrir la ventana de configuración de la barra de tareas, elementos del panel de control que indican uno de los archivos cpl disponibles, para administrar ventanas abiertas:

$myshell.MinimizeAll()
$myshell.UndoMinimizeAll()
$myshell.TileHorizontally()
$myshell.TileVertically()

El método Windows () le permite acceder a la colección de ventanas abiertas en Explorer o en Internet Explorer. Veamos las propiedades y métodos disponibles para esta colección:

$myshell.Windows() | Get-Member



Hay otros objetos COM útiles, cuyo número depende del software instalado en el sistema. Érase una vez, la principal herramienta de automatización en Windows se consideraba el servidor de script WSH, cuyo modelo de objetos incluye objetos COM: diseñado para trabajar con las funciones de red de WScript.Network y WScript.Shell que ya mencionamos. Este último no solo crea accesos directos en el escritorio, con su ayuda puede, por ejemplo, mostrar ventanas de información con mensajes y botones, cambiar entre aplicaciones, iniciar programas o simular pulsaciones de teclas.

Trabajando con el servicio de directorio ADSI


En general, un catálogo se refiere a una fuente de información en la que se almacenan datos sobre algunos objetos. Por servicio de directorio, nos referimos a parte de un sistema informático distribuido que le permite acceder y manipular objetos almacenados. Un servicio de directorio puede combinar datos sobre objetos de red y los servicios que los manipulan: representa un único punto de entrada para interactuar con los recursos de la red. Puede haber muchos de estos servicios en una red informática heterogénea: un SAM (Security Account Manager) local para computadoras que no son de dominio, Active Directory, etc.

La interacción con diferentes servicios de directorio requiere diferentes herramientas, lo que crea ciertos inconvenientes. A partir de Windows 2000, Microsoft introdujo la tecnología unificada de Interfaz de servicio de Active Directory (ADSI) para sistemas operativos que no depende de un protocolo de acceso a la red específico. Para buscar objetos, se define un espacio de nombres para el directorio. Debido a que diferentes servicios de directorio usan diferentes métodos de nomenclatura, ADSI define una convención que identifica de manera única cualquier objeto. Se introduce el concepto de cadenas de enlace de dos partes o ADsPath. La primera parte del nombre define el servicio de directorio (proveedor ADSI) y la segunda, la ubicación del objeto en el directorio. Aquí hay ejemplos de designación de diferentes proveedores ADSI:

LDAP: //utilizado para servicios de directorio basados ​​en LDAP, incluidos para Active Directory;

WinNT: // usado para computadoras locales.

No hay cmdlets especiales para trabajar con ADSI en PowerShell. En su lugar, se utiliza el operador de conversión [ADSI] seguido de una cadena de enlace. Por ejemplo, para conectarse al usuario Ivanov desde el dominio test.ru, se necesita la siguiente construcción:

$user = [ADSI]"LDAP://CN=Ivanov,DC=TEST,DC=RU"

Para trabajar con cuentas locales, deberá conectarse a la computadora con el nombre correspondiente (para conectarse a la computadora local, solo use el punto en lugar del nombre):

$computer = [ADSI]"WinNT://."

Por ejemplo, cree un nuevo usuario, Ivanov, en la máquina local:

$user = $computer.Create("user","Ivanov")
$user.Put("Description","  PowerShell")
$user.SetInfo()

Ahora conéctese a él:

$user1 = [ADSI]"WinNT://./Ivanov,user"
$user1.Description



Formato de salida


El trabajo interactivo a menudo requiere mostrar datos. En otros shells, los comandos y las utilidades se dedican a formatear la salida, pero los objetos binarios devueltos por las funciones y los cmdlets generalmente no saben cómo hacerlo. En PowerShell, la salida está formateada por cuatro cmdlets especiales que alimentan objetos a través de la tubería. Se puede obtener información más detallada utilizando Get-Help:

Format-Table formatea la salida en forma de una tabla cuyas columnas contienen los valores de las propiedades del objeto o los valores calculados. Se admite la capacidad de agrupar datos;

Format-List muestra el objeto como una lista de propiedades, cada una de las cuales se muestra en una nueva línea. Se admite la capacidad de agrupar datos;

Formato personalizadoformatea la salida usando una vista personalizada;

Format-Wide formatea objetos en forma de una tabla ancha en la que solo se muestra una propiedad de cada objeto.

Si no se llama a ninguno de los cmdlets enumerados, se utiliza el módulo de formato apropiado para el tipo de datos que se muestra. Las reglas de visualización se almacenan en archivos de configuración en formato XML con la extensión .ps1xml, que se encuentran en el directorio $ PSHome. Se puede obtener una lista de ellos con el siguiente comando:

dir $pshome\*format*.ps1xm

No se recomienda editar manualmente los archivos de configuración; es mejor crear los suyos e incluirlos en la lista de archivos descargados mediante el cmdlet Update-FormatData. Si el formateador predeterminado para el tipo que desea no está definido, PowerShell muestra las propiedades del objeto en la pantalla en una lista.

Esto concluye la descripción del trabajo con objetos en PowerShell, y el artículo final de la serie estará dedicado a resolver problemas prácticos de gestión de un entorno de información distribuida de una empresa. En él, todas las herramientas descritas son útiles para nosotros. El enfoque principal estará en los objetos CIM y su comparación con WMI. Las partes pasadas se pueden encontrar en los enlaces a continuación.



1: Windows PowerShell
2: Windows PowerShell
3: ,
4: ,


All Articles