Script PowerShell que actualiza la información del usuario de Active Directory -- powershell campo con active-directory camp codereview Relacionados El problema

Powershell script that updates Active Directory user information


2
vote

problema

Español

Escribí este script PowerShell hace años para actualizar el anuncio de un archivo CSV. Me gustaría intentar optimizar para correr más rápido y ser más eficiente ... pero no estoy seguro de dónde comenzar / qué podría mejorarlo. Cualquier sugerencia es bienvenida.

Editar: He actualizado mi script original a esto:

  disabled0  
Original en ingles

I wrote this Powershell script years ago for updating AD from a CSV file. I'd like to try to optimize to run quicker and be more efficient... but I'm not sure where to start / what could improve it. Any suggestions are welcome.

EDIT: I've updated my original script to this:

$users = Import-Csv C:\Scripts\Employees.csv  foreach ($user in $users) {  $employeeNumber = $User.employeeNumber $Department     = $User.department $Title          = $User.title $Office         = $User.office $Address        = $User.address $City           = $User.city $State          = $User.state $PostalCode     = $User.postalCode $Company        = $User.company $Telephone      = $User.telephone $Mobile         = $User.mobile $Fax            = $User.fax $Custom1        = $User.custom1 $Custom2        = $User.custom2 $Custom3        = $User.custom3 $Custom4        = $User.custom4  Get-ADUser -Filter "EmployeeID -eq '$($user.EmployeeID)'" `     -SearchBase "OU=Logins,DC=domain,DC=com" |     Set-ADUser -Replace @{ `     employeeNumber=$EmployeeNumber;     department=$Department;     title=$Title;     Office=$office;     streetAddress=$Address;     l=$City;     st=$State;     postalCode=$PostalCode;     company=$Company;     telephoneNumber=$telephone;     mobile=$cell;     facsimileTelephoneNumber=$Fax;     ExtensionAttribute1=($user.custom1);     ExtensionAttribute2=($user.custom2);     ExtensionAttribute3=($user.custom3);     ExtensionAttribute4=($user.custom4)                     } } 
     
         
         

Lista de respuestas

2
 
vote

Estoy de acuerdo con lo que sugiere @veefu, y me gustaría construir eso. Para empezar, tiene diferentes columnas en su CSV en cuanto a qué 9988777665544339 está esperando. Para solucionar esto, sugeriría crear un mapa de propiedad Hashtable.

  std::string0  

Luego, debe averiguar cuáles son los parámetros válidos para std::string1 si se debe aplicar una columna dada como un parámetro, o ser alimentado al parámetro std::string2 .

  std::string3  

Luego, importa el CSV y el bucle a través de los usuarios. Para cada usuario, encuentre qué propiedades han completado en la hoja de cálculo, consulte Si es un parámetro para el cmdlet 99887766655443314

  std::string5  

Aquí agregué un poco std::string6 para hacerlo saber si no logró encontrarlo o actualizar cualquiera de los usuarios, y si no logró encontrarlos, o no se pudo actualizarlos, y le da el error . Utilicé el 99887766655443317 en lugar de std::string8 fuera del hábito.

  std::string9  

 

I agree with what @veefu suggests, and would like to build off that. To start with, you have different columns in your CSV as to what Set-ADUser is expecting. To work around this I would suggest creating a property map hashtable.

$PropMap = @{     EmployeeNumber='EmployeeNumber'     Department='Department'     Title='Title'     office='Office'     Address='StreetAddress'     City='City'     State='State'     PostalCode='PostalCode'     Company='Company'     telephone='OfficePhone'     cell='Mobile'     Fax='Fax'     custom1='ExtensionAttribute1'     custom2='ExtensionAttribute2'     custom3='ExtensionAttribute3'     custom4='ExtensionAttribute4' } 

Then you want to find out what the valid parameters for Set-ADUser are to determine if a given column should be applied as a parameter, or be fed to the -Replace parameter.

#Find the valid parameters for the Set-ADUser cmdlet (only strings, to avoid complex objects and switches, and no common parameters) $ValidParams = Get-Command Set-ADUser -ShowCommandInfo |% ParameterSets |% Parameters |?{$_.ParameterType.FullName -match 'String' -and $_.Name -notin [System.Management.Automation.PSCmdlet]::CommonParameters} |Select -Expand Name -Unique 

Then you import the CSV and loop through the users. For each user you find what properties they have filled in on the spreadsheet, see if it is a parameter for the Set-ADUser cmdlet, and build a hashtable to splat to the cmdlet.

#Import the list of users and updates $Users = Import-Csv C:\Scripts\Employees.csv  #Loop through users ForEach($User in $Users){     #Set an empty hashtable for what this user needs to have updated     $UserParams = @{}     #Find the properties for this user that have values     $UserProps = $User.PSObject.Properties.Name |?{![string]::IsNullOrWhiteSpace($User.$_)}     #If it has a parameter in Set-ADUser add it to $UserParams     $UserProps |?{($ParamName=If($_ -in $PropMap.Keys){$PropMap[$_]}Else{$_}) -in $ValidParams} |%{$UserParams.Add($ParamName,$User.$_)}     #If it doesn't have a valid parameter build a hashtable for the -Replace parameter, and add that to $UserParams     $UserProps |?{($ParamName=If($_ -in $PropMap.Keys){$PropMap[$_]}Else{$_}) -notin $ValidParams} |% -Begin {$ToReplace = $_} -Process {$ToReplace.Add($ParamName,$User.$_)} -End {$UserParams.Add('Replace',$ToReplace)} 

Here I added a little Try/Catch to let you know if it failed to find or update any of the users, and if it failed to find them, or failed to update them, and gives the error. I used the shortened -ea instead of -ErrorAction out of habit.

    #Try to find the user, and apply the updates     Try{         Get-AdUser -Filter "EmployeeID -eq '$($user.EmployeeID)'" -SearchBase "ou=Logins,dc=domain,dc=com" -ea Stop | Set-ADUser @UserParams -ea Stop     }Catch{         #If the Get-ADUser or Set-ADUser cmdlets failed throw a warning with the user's EmployeeID for investigation          #Determine if it was Get-ADUser or Set-ADUser that failed, to see if we couldn't find the user or couldn't update the user         $WarningMessage = If($_.InvocationInfo.MyCommand -eq 'Get-ADUser'){'find'}else{'update'}         Write-Warning "Unable to $WarningMessage user with EmployeeID (actual error follows): $($User.EmployeeID)"         Write-Warning "$_`n"     } } 
 
 
   
   
1
 
vote

Aquí hay algunos comentarios:

  pigLatSentence; 0  
 

Here are a few comments:

# -3. No parameters to the script and hard-coded path to the input CSV #     This makes the script harder for others to reuse # -2. No error handling #     if an employee in the CSV doesn't exist in AD, for instance, #     you might want to know about it. # -1. Rigid requirements for the CSV file #     What happens if one of the columns is missing?  #     Would it be worthwhile to add flexibility logic, so  #     so the script could handle CSVs containing fewer columns of #     modification?  $users = Import-Csv -Path C:\Scripts\Employees.csv # 0. Style - use more vertical space in your code for better readability  foreach ($user in $users) { # 1. Eliminate duplicate Get-ADUser calls Get-ADUser -ErrorAction SilentlyContinue -Filter "EmployeeID -eq '$($user.EmployeeID)'" `         -Properties * -SearchBase "ou=Logins,dc=domain,dc=com" | # 2. Eliminate '-properties *': your script doesn't read  #    current user property values, so why retrieve them?  # 3. Consider eliminating multiple calls to Set-ADUser #    All modifications can probably be done in a single #    Set-ADUser -Replace $Properties #    call. You'd need to reorganize the modifications into #    a single hashtable.      Set-ADUser -EmployeeNumber $($user."EmployeeNumber") `         -Department $($user."Department") `         -Title $($user."Title") `         -Office $($user."office") `         -StreetAddress $($user."Address") `         -City $($user."City") `         -State $($user."State") `         -PostalCode $($user."PostalCode") `         -Company $($user."Company") `         -OfficePhone $($user."telephone") `         -Mobile $($user."cell") `         -Fax $($user."Fax")  Get-ADUser -ErrorAction SilentlyContinue -Filter "EmployeeID -eq '$($user.EmployeeID)'" -Properties * -SearchBase "ou=Logins,dc=domain,dc=com" |     Set-ADUser -Replace @{             ExtensionAttribute1=($user.custom1)              ExtensionAttribute2=($user.custom2)             ExtensionAttribute3=($user.custom3)             ExtensionAttribute4=($user.custom4)         } } 
 
 
 
 

Relacionados problema

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  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...

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...

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...

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...

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  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...

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  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 ...




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