Obtenga propiedades específicas para todos los grupos de Active Directory y todos sus usuarios, luego combínelos en CSV -- performance campo con powershell campo con active-directory camp codereview Relacionados El problema

Get specific properties for all Active Directory groups and all their users, then combine them into CSV


2
vote

problema

Español

He escrito un script que obtiene una lista de todos los grupos en AD junto con algunas propiedades específicas para cada grupo (nombre distinguido, CN, tipo y descripción). Luego pasa a través de cada grupo y, para cada miembro del tipo "Usuario" (para excluir computadoras, servidores, etc.), obtiene el nombre completo, el título y el nombre completo del usuario. Finalmente, combina los dos usando un módulo PS llamado unir-objeto para unir las dos listas y emitirla como un archivo CSV.

Obtener los grupos de anuncios al principio es lo suficientemente rápido; Se tarda menos de un minuto para correr. La combinación de toda la salida al final también es bastante rápida; un minuto o menos y está hecho.

La parte lenta es la etapa media del bucle a través de cada grupo. Durante ~ 1500 grupos y un total de aproximadamente ~ 75K a ~ 85k usuarios en todos los grupos (muchos usuarios están en varios grupos de anuncios, naturalmente), se necesitan 7 horas para ejecutar. ¿Hay alguna manera de que pueda mejorar en ese tiempo de ejecución de 7 horas (preferiblemente drásticamente)? Extrapolando desde el tiempo de ejecución de las otras secciones, esperaría que la sección central tome una hora o menos.

Estoy ejecutando PowerShell 5.1 en Win10 y de consulta Active Directory en Windows Server 2016. Este equipo de seguridad lo solicitó, por lo que, en general, podrían auditar la información de la membresía del grupo de anuncios en un formato familiar (un archivo CSV dentro de Excel) .

  Import-Module -Name ActiveDirectory -Force Import-Module -Name Join-Object -Force  #Get list of AD Groups. Currently ~1500 rows $ADGroupsList = Get-ADGroup -Filter * -Properties * | Select-Object DistinguishedName,CN,GroupCategory,Description | Sort-Object CN  #Declare ADUsersList object $ADUsersList = @()  #Declare Record variable and set parameter schema. The [ordered] keyword ensures the data is entered in this order $Record = [ordered] @{     "Group Name" = ""     "Employee Name" = ""     "Title"= ""     "Manager" = "" }  #Loop through each group in the groups list. This is the really, really slow part. If the AD Web Service limit is ever set back to the default (5000), this will fail for any groups that have more than 5,000 users. foreach ($Group in $ADGroupsList) {     #Get list of members of the current group in the loop who are of type "user" (excludes servers or other computers, for example)     $ArrayofMembers = Get-ADGroupMember -Identity $Group.DistinguishedName | Where { $_.objectClass -eq "user" }      #Loop through each member in the list of members from above     foreach ($Member in $ArrayofMembers) {         #Get detailed user info about the current user like title and manager that aren't available from Get-ADGroupMember         $User = Get-ADUser -Identity $Member -Properties name,title,manager | Select-Object Name, Title, @{Label="Manager";Expression={(Get-ADUser (Get-ADUser $Member -Properties Manager).Manager).Name}}                  #Specifies what values to apply to each property of the $Record object         $Record."Group Name" = $Group.CN         $Record."Employee Name" = $Member.Name         $Record."Title" = $User.Title         $Record."Manager" = $User.Manager          #Put all the stored information above in a 'copy' record         $objRecord = New-Object PSObject -property $Record          #Append that copy to the existing data in the ADUsersList object         $ADUsersList += $objRecord     } }  #Combines data from the two objects into one. This uses the Join-Object module from https://www.powershellgallery.com/packages/Join-Object/2.0.1 Join-Object -Left $ADGroupsList -Right $ADUsersList -LeftJoinProperty "CN" -RightJoinProperty "Group Name" -Type AllInBoth -LeftMultiMode DuplicateLines -RightMultiMode DuplicateLines -ExcludeLeftProperties DistinguishedName | Export-Csv C:CombinedADResults.csv -NoTypeInformation   
Original en ingles

I've written a script that gets a list of all groups in AD along with a few specific properties for each group (DistinguishedName, CN, Type, and Description). Then it goes through each group and, for each member of type "user" (to exclude computers, servers, etc.), it gets the user's full name, title, and their manager's full name. Finally, it combines the two using a PS Module called Join-Object to join the two lists together and output it as a CSV file.

Getting the AD Groups at the beginning is quick enough; it takes less than a minute to run. Combining all the output at the end likewise is pretty quick; a minute or less and it's done.

The slow part is the middle step of looping through each group. For ~1500 groups and a total of about ~75k to ~85k users across all groups (many users are in multiple AD groups, naturally), it takes 7 hours to run. Is there some way I can improve on that 7 hour runtime (preferably drastically)? Extrapolating from the run-time of the other sections, I would expect the middle section to take an hour or less.

I'm running PowerShell 5.1 on Win10 and querying Active Directory on Windows Server 2016. This script was requested by our security team so they could generally audit AD group membership information in a format familiar to them (a CSV file inside Excel).

Import-Module -Name ActiveDirectory -Force Import-Module -Name Join-Object -Force  #Get list of AD Groups. Currently ~1500 rows $ADGroupsList = Get-ADGroup -Filter * -Properties * | Select-Object DistinguishedName,CN,GroupCategory,Description | Sort-Object CN  #Declare ADUsersList object $ADUsersList = @()  #Declare Record variable and set parameter schema. The [ordered] keyword ensures the data is entered in this order $Record = [ordered] @{     "Group Name" = ""     "Employee Name" = ""     "Title"= ""     "Manager" = "" }  #Loop through each group in the groups list. This is the really, really slow part. If the AD Web Service limit is ever set back to the default (5000), this will fail for any groups that have more than 5,000 users. foreach ($Group in $ADGroupsList) {     #Get list of members of the current group in the loop who are of type "user" (excludes servers or other computers, for example)     $ArrayofMembers = Get-ADGroupMember -Identity $Group.DistinguishedName | Where { $_.objectClass -eq "user" }      #Loop through each member in the list of members from above     foreach ($Member in $ArrayofMembers) {         #Get detailed user info about the current user like title and manager that aren't available from Get-ADGroupMember         $User = Get-ADUser -Identity $Member -Properties name,title,manager | Select-Object Name, Title, @{Label="Manager";Expression={(Get-ADUser (Get-ADUser $Member -Properties Manager).Manager).Name}}                  #Specifies what values to apply to each property of the $Record object         $Record."Group Name" = $Group.CN         $Record."Employee Name" = $Member.Name         $Record."Title" = $User.Title         $Record."Manager" = $User.Manager          #Put all the stored information above in a 'copy' record         $objRecord = New-Object PSObject -property $Record          #Append that copy to the existing data in the ADUsersList object         $ADUsersList += $objRecord     } }  #Combines data from the two objects into one. This uses the Join-Object module from https://www.powershellgallery.com/packages/Join-Object/2.0.1 Join-Object -Left $ADGroupsList -Right $ADUsersList -LeftJoinProperty "CN" -RightJoinProperty "Group Name" -Type AllInBoth -LeftMultiMode DuplicateLines -RightMultiMode DuplicateLines -ExcludeLeftProperties DistinguishedName | Export-Csv C:\CombinedADResults.csv -NoTypeInformation 
        
   
   

Lista de respuestas


Relacionados problema

2  Los grupos de seguridad de Active Directory buscan la optimización de la aplicación  ( Active directory security groups search application optimization ) 
Tengo un método de API web que devuelve los grupos de seguridad de Active Directory para el usuario de inicio de sesión específico. El siguiente código estaba...

0  Banco de los detalles del usuario desde el anuncio usando LDAP  ( Bindling user details from ad using ldap ) 
Tengo una solicitud de un cliente para obtener todos los datos del usuario del cliente de AD y, finalmente, volcar a un DB para que puedan usarlo para informa...

4  Obteniendo información del usuario de Windows del Active Directory  ( Getting windows user info from the active directory ) 
Tomé un poco de código de calderillas que he estado usando para determinar la información de un usuario de Windows activo para enviar correos electrónicos con...

2  Actualización de grupos de anuncios para estudiantes en cada nivel de grado  ( Updating ad groups for students in each grade level ) 
Tengo un grupo de grupos que contienen un grupo anidado. Ejemplo: Grupo "Dela 12th Grade" & LT; Actualmente contiene grupo "Helena clase de 2018 "GRUPO...

1  Clase de búsqueda de Active Directory / API  ( Active directory searcher class api ) 
Esto está destinado a ser un 99887766655443314 para una aplicación que consulta un Active Directory. Puede devolver import unittest from lists import Linke...

2  Agregando algunas propiedades a un usuario de Active Directory  ( Adding some properties to an active directory user ) 
Estaba escribiendo la siguiente sección del código que agrega algunas propiedades de usuario a un usuario de Active Directory, y se preguntó, seguramente pode...

2  VBS para consultar anuncios  ( Vbs to query ad ) 
Estoy tratando de obtener la autenticación con AD y para hacer esto ya he hecho este código. ¿Alguien puede proporcionarme si es correcto o no hacer esto o si...

2  Automatización de la nueva creación de usuarios con el servicio web C #  ( Automating new user creation with c web service ) 
He creado un servicio web que se puede llamar desde un formulario para agregar nuevos usuarios al sistema. El servicio final agregará a los usuarios a Active ...

7  Herramienta de Active Directory - Aplicación WPF para consultar Active Directory y resultados de visualización  ( Active directory tool wpf application to query active directory and display re ) 
Esta es una aplicación de la Fundación de presentación de Windows que consulta Active Directory y puede mostrar listas de usuarios, usuarios por grupo, grupos...

2  Gestión de miembros de los grupos de Active Directory a través de un sitio web de ASP.NET MVC  ( Member management of active directory groups via an asp net mvc website ) 
Fondo Uno de los proyectos en los que estoy trabajando es un sitio web de intranet, que es un front-end para varios tipos de datos, cada uno dirigido a un c...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos