Solved

Slow powershell script....any way to speed it up?

Posted on 2010-08-22
7
1,923 Views
Last Modified: 2012-08-13
I use the Quest AD cmdlets to update certain AD attributes, but I've noticed the script is "slow" (takes approx. 1-2 seconds per AD object). I'm updating 600+ AD objects and @ 1-2 seconds per object, the time adds up. I'm wondering if someone can tell me if this is normal or there's a more efficient way to rewrite my script. I noticed that when the script updates an object, the shell window shows/scrolls a list of attributes for the object (I'd assume the default properties). That's why I used the "-IncludedProperties" switch to see if that made a difference since I'm only targeting a handful of attributes...I know this switch works for the Get-QADUser but not sure if it's working for the Set-QADUser.
# Read source TXT file

$users = Get-Content -Path 'C:\users.txt'



# Look through each of the users and set AD attributes

foreach($user in $users){

	Set-QADUser -Identity $user -IncludedProperties mail,department -ObjectAttributes @{mail='something';department='something'}

	}

Open in new window

0
Comment
Question by:bndit
  • 3
  • 2
  • 2
7 Comments
 
LVL 42

Accepted Solution

by:
sedgwick earned 150 total points
ID: 33498905
Set-QADUser does return output after successfully completing.  If you'd like to have it not display the output on screen just assign the Set-QADUser command output to $null.

$null = Set-QADUser -Identity $user -IncludedProperties mail,department -ObjectAttributes @{mail='something';department='something'}

(taken from http://www.powergui.org/thread.jspa?messageID=32130)
0
 
LVL 42

Expert Comment

by:sedgwick
ID: 33498910
that alone should decrease time span of Set-QADUser
0
 
LVL 13

Assisted Solution

by:soostibi
soostibi earned 150 total points
ID: 33498942
Maybe, the other factor that can speed up the script is to create a permanent conenction to AD:

$c = Connect-QADService -Service yourdc.youdomain.com:389

And with this where you use Set-QADUser use the connection parameter, and maybe you do not have to use the -includedproperties parameter at all, but you should compare the two versions. The output can also be suppressed by converting the result to [void]:

[void] (Set-QADUser -Connection $c -Identity $user -ObjectAttributes @{mail='something';department='something'} )
       
0
 
LVL 42

Expert Comment

by:sedgwick
ID: 33498957
@soostibi

>>The output can also be suppressed by converting the result to [void]:

which is the same as assign the result to $null...
0
 
LVL 2

Author Comment

by:bndit
ID: 33507250
Thank you both of you; your suggestions really helped and sped up my script although I found that the [void] approach reduced the execution time to 5secs per $user while the $null approach reduced it to 12secs per $user.

@soostibi

The only thing that I didn't use from your suggestion was the "permanent connection" to AD. However, I do my connection outside the ForEach block (see the attached code), and I'm wondering if doing the connection to AD as you suggest would help even more to reduce the execution time.


# Connect to Active Directory provider.

$pwd = Read-Host "Enter Password: " -AsSecureString

$DC = 'DC.domain.com:386'

$connAccount = 'ADAccount'



Connect-QADService -service $DC -ConnectionAccount $connAccount -ConnectionPassword $pwd



ForEach <...>



[void] (Set-QADUser -Identity $user -ObjectAttributes @{mail='something';department='something'} ) 



# Disconnect from Active Directory provider.

Disconnect-QADService

Open in new window

0
 
LVL 13

Expert Comment

by:soostibi
ID: 33508392
But use it as I did. So put the result of the connect-qadservice to a variable, and use it at Set-QADUser with -connection parameter. If you do not do this, the Set-QADUser may create a connection every time.
0
 
LVL 2

Author Comment

by:bndit
ID: 33508407
Ok, I'll try that. Thanks again.
0

Join & Write a Comment

Disabling the Directory Sync Service Account in Office 365 will stop directory synchronization from working.
Create and license users in Office 365 in bulk based on a CSV file. A step-by-step guide with PowerShell script examples.
This tutorial will walk an individual through the process of transferring the five major, necessary Active Directory Roles, commonly referred to as the FSMO roles from a Windows Server 2008 domain controller to a Windows Server 2012 domain controlle…
This tutorial will walk an individual through the process of configuring their Windows Server 2012 domain controller to synchronize its time with a trusted, external resource. Use Google, Bing, or other preferred search engine to locate trusted NTP …

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now