Solved

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

Posted on 2010-08-22
7
2,028 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
Free NetCrunch network monitor licenses!

Only on Experts-Exchange: Sign-up for a free-trial and we'll send you your permanent license!

Here is what you get: 30 Nodes | Unlimited Sensors | No Time Restrictions | Absolutely FREE!

Act now. This offer ends July 14, 2017.

 
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

Featured Post

Free NetCrunch network monitor licenses!

Only on Experts-Exchange: Sign-up for a free-trial and we'll send you your permanent license!

Here is what you get: 30 Nodes | Unlimited Sensors | No Time Restrictions | Absolutely FREE!

Act now. This offer ends July 14, 2017.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Group policies can be applied selectively to specific devices with the help of groups. Utilising this, it is possible to phase-in group policies, over a period of time, by randomly adding non-members user or computers at a set interval, to a group f…
After seeing many questions for JRNL_WRAP_ERROR for replication failure, I thought it would be useful to write this article.
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 to another domain controller. Log onto the new domain controller with a user account t…
Are you ready to implement Active Directory best practices without reading 300+ pages? You're in luck. In this webinar hosted by Skyport Systems, you gain insight into Microsoft's latest comprehensive guide, with tips on the best and easiest way…

690 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