El procesamiento paralelo de PowerShell acelera la recuperación de datos de Microsoft 365
Acelere el procesamiento de grandes cantidades de objetos de Microsoft 365
Al no ser un profesional de PowerShell como Michel de Rooij, hackeo alegremente PowerShell para hacer cosas sin preocuparme demasiado por los detalles más finos del código. Una vez que aprendo a hacer algo, tiendo a seguir usando esa técnica, razón por la cual muchos de los guiones que escribo tienen similitudes. Sospecho que no soy el único cuyo recorrido por PowerShell ha sido una sucesión de experiencias de aprendizaje sin el beneficio de una capacitación formal. En cualquier caso, lo que hago funciona y disfruto mucho lidiar con PowerShell.
Lo que me lleva claramente a un excelente artículo sobre la optimización de scripts de Microsoft Graph PowerShell escrito por Nicola Suter. Este es un artículo que debería leer cualquiera que trabaje con PowerShell en una organización grande donde es común trabajar con decenas de miles de objetos como cuentas de usuario o buzones de correo. Lo que me llamó la atención es la discusión sobre solicitudes por lotes, o como Microsoft se refiere al tema: combinar múltiples solicitudes HTTP usando procesamiento por lotes JSON, un título posiblemente no diseñado para atraer la atención de personas que buscan una buena lectura.
Solicitudes HTTP por lotes
En cualquier caso, la idea es que puedas combinar hasta un máximo de veinte solicitudes Graph individuales en un solo objeto JSON. El objeto se pasa mediante una solicitud HTTP POST al punto final del lote, que se encarga de procesar los lotes.
Para acelerar aún más las cosas, después de preparar los lotes, puede aprovechar la capacidad de procesamiento paralelo de PowerShell 7 para enviar los lotes (Michel de Rooij analiza el procesamiento paralelo en este artículo). Cada lote utiliza un espacio de ejecución de PowerShell que contiene variables, módulos y funciones. De forma predeterminada, PowerShell 7 crea cinco espacios de ejecución para la ejecución paralela, por lo que el trabajo en los lotes se divide en cinco espacios de ejecución para acelerar la ejecución. Obviamente, esto no es algo que harías con scripts que ya se ejecutan con una rapidez aceptable, pero podría marcar una diferencia real en otras circunstancias.
Un lote se parece a esto:
Name Value
---- -----
ContentType application/json
Uri https://graph.microsoft.com/v1.0/$batch
Body {…
Method Post
Las solicitudes que el lote le pide a Graph que procese están contenidas en un único objeto JSON en el cuerpo (de ahí el nombre "procesamiento por lotes JSON". Cada solicitud tiene un identificador, un método (en este caso, GET porque queremos recuperar cierta información). ) y la URL pasada al Graph.
{
"requests": [
{
"Id": 0,
"Method": "GET",
"Url": "users/0a6b8952-baca-4019-bdaf-450536c6ece6?$select=id,displayname,assignedLicenses,country,city,jobtitle,officelocation,userprincipalname,businessphones,employeeid,employeehiredate"
},
{
"Id": 1,
"Method": "GET",
"Url": "users/28f205c1-95cd-4d64-b998-e5324b4c032f?$select=id,displayname,assignedLicenses,country,city,jobtitle,officelocation,userprincipalname,businessphones,employeeid,employeehiredate"
},
Si utiliza una herramienta como Graph Explorer para ejecutar una solicitud, debe crear una URL completa. Por ejemplo, https://graph.microsoft.com/V1.0/users/0a6b8952-baca-4019-bdaf-450536c6ece6?$select=id,displayname,assignedLicenses,country,city,jobtitle,officelocation,userprincipalname ,businessphones,employeeid,employeehiredate(Figura 1).
Aumento de la ejecución paralela
PowerShell admite la ejecución paralela en más de cinco espacios de ejecución. Sin embargo, esto no es algo en lo que deba sumergirse a menos que esté seguro de que la estación de trabajo que ejecuta PowerShell tiene recursos suficientes para hacer frente a la demanda creada por el procesamiento paralelo. Más información sobre las capacidades paralelas de PowerShell está disponible en este blog de Microsoft.
Debido a que los espacios de ejecución individuales deben activarse antes de ejecutar un lote, sus resultados deben recopilarse de manera segura para subprocesos. No puede usar una matriz o una lista normal para este propósito, pero una lista ConcurrentBag funciona y puede aceptar resultados de los subprocesos a medida que se ejecutan. Una vez recopilados todos los datos, es posible convertir ConcurrentBag en una matriz normal, una tabla hash o cualquier forma que necesite un script.
Prueba de procesamiento por lotes en paralelo
Nicola Suter hace un buen trabajo al explicar cómo crear un script para probar la efectividad del procesamiento por lotes paralelo. Para familiarizarme con cómo funcionan las cosas, decidí actualizar el script de prueba para realizar un trabajo real y demostrar el valor de la técnica. Por lo tanto, creé un script (disponible en GitHub) para hacer lo siguiente:
- Encuentra todos los buzones de correo de los usuarios.
- Cree lotes para obtener información de la cuenta de usuario de la API de usuarios de la lista Graph según la propiedad del buzón de identificación del objeto del directorio externo (el vínculo entre un buzón y la cuenta propietaria de Entra ID). La solicitud obtiene detalles como las licencias asignadas a la cuenta y detalles como la ciudad, el país y el identificador del empleado y la fecha de contratación.
- Presentar los lotes.
- Recupere las respuestas y combínelas en ConcurrentBag.
- Convierta ConcurrentBag en una tabla hash para acceder rápidamente con clave a los datos del usuario.
- Cree un informe que combine los datos del buzón y del usuario, incluida la traducción de los identificadores de SKU para las licencias asignadas a nombres de productos. Para hacer esto, utilizo la técnica explicada en el artículo sobre la creación de un informe de licencias de usuario para crear una tabla hash a partir de la información del producto descargada de Microsoft.
- Genere un archivo CSV y muestre el informe a través del cmdlet Out-GridView (Figura 2).
En general, todo funcionó bien y quedé satisfecho con la velocidad de recuperación de datos.
Sólo una prueba
No pretendo que este ejemplo sea otra cosa que una prueba para demostrar cómo usar un tipo de datos de Microsoft 365 para impulsar la recuperación de otra información mediante la ejecución por lotes en paralelo. Sin embargo, aprender haciendo es una excelente manera de familiarizarse con nuevas técnicas y disfruté experimentando con lotes. ¿Me acordaré de utilizar el procesamiento paralelo en el futuro? Bueno, todo depende de la situación y de si lo recuerdo.

