Not a comment on the code...but maybe something to consider around memory usage using the Quest AD cmdlets versus Microsoft cmdlets (and I haven't run the same test using the MS AD cmdlets...and it may not be accurate anylonger as I haven't used the quest cmdlets in recent years...maybe they have been updated).
I think setting your variables to $null and then clear them when done with them within the loop by setting to $null helps the memory garbarge collection routines. This is from 2010...so ymmv http://www.activedir.org/ListArchives/tabid/55/view/topic/postid/39604/Default.aspx I thought it was a powershell memory issue...turns out (then) it was the Quest Cmdlets. I don't know if they have since been updated...hopefully! The link above is long...this is the Cmdlets portion of memory usage from the above link: It wasn't powershell's issue - and I narrowed it down to one of the cmdlets (from Quest) I was using. (BTW: one of the tricks to help memory usage in-flight is to set a variable to $null - which isn't the same as "" - this apparently helps the garbage collector) I created a CSV file (3 columns, totaling about 100K) just to use memory...then when the script below is running...memory usage climbs by about 40-50 MB...then when the script finishes...and a little while after that, RAM usage goes back to about what it was before the script ran. But...when I comment out the 'import-csv' line and remove the comment on the get-qadcomputer line...memory usage climbs (by about 120MB) and is NEVER released - even after trying the $null trick and forcing garbage collection to run. The only way I've found to release the memory is to close the powershell window. -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Michael Leone Sent: Tuesday, August 25, 2015 11:16 AM To: [email protected] Subject: Re: [powershell] Add-Member question This email has an alternate reply address set. ---------------------------------------------------------------------- Sent by an external sender ---------------------------------------------------------------------- On Tue, Aug 25, 2015 at 10:55 AM, Kelley, Matthew <[email protected]> wrote: > > If you are using Posh v3 or higher you can just use the MS commandlets. Try > this: I am, but I like the Quest commandlets. Effectively the same, for what I do with them. > $AllCustomizedObjects = @() > ForEach ($User in Get-ADUser -LDAPFilter "(!(lastname=\00))") > { > $CustomizedObject = $User > $CustomizedObject | Add-Member -MemberType NoteProperty -Name Matched > -Value $false > $AllCustomizedUsers += $CustomizedObject > } > > It will give you all users where lastname is blank. It looks like that is > what you were asking for. Exact opposite, actually. I want AD accounts where the LastName field isn't blank (well, not $null) ... We try and make it a point that only humans get lastname entries. So service accounts, console logins, generic departmental logins, etc are supposed to have a blank firstname and last name, and we just use the DisplayName for those type of accounts. Not perfect, but it's surprising how effective it can be ... if you follow the protocol, of course ... LOL) So looking for active AD accounts with a blank lastname is a pretty good first approximation of accounts belong > If you want all those other attributes (you aren’t using them in the > snippet you provided) I need to output those fields later, if they match a search criteria further down (matching a name in a CSV provided by another department). That's why I want the customized property - to indicate that this AD account matched one provided in the CSV. Then later, I will output into a CSV only the objects that didn't match. (and I can also output in a separate CSV all the accounts that did match, since I know my guys will eventually want that, too). >you can use a select statement on $user within the loop to dump that data into >an array. > > > > Matt > > > > From: [email protected] > [mailto:[email protected]] On Behalf Of Michael Leone > Sent: Tuesday, August 25, 2015 10:07 AM > To: [email protected] > Subject: [powershell] Add-Member question > > > > So I have a list of AD users, that I created using Quest cmdlets (Get-ADUser > ..). I need to add a new NoteProperty to each object (I want to add a boolean > member, to indicate that this object meets certain criteria, determined later > in the script). And I seem to be confused. (I know, what else is new). > > > > Do I need to: > > Do a ForEach-Object loop through all the returned users > > Create a new CustomObject > > Set it to the value of the user > > Add-Member boolean field to the custom object > > save custom object into new list? > > > > $AllActiveUsers = Get-QADUser <OneUser> -Enabled -SizeLimit 0 > -IncludedProperties employeeID, departmentNumber| Select > givenName,LastName,DisplayName,Email,sAMAccountName,employeeID,departm > entNumber| Where-Object {$_.LastName -ne $null} | sort > LastName,givenName > > > > $AllCustomizedObjects = @() > > > > ForEach ($User in $AllActiveUsers) > > { > > $CustomizedObject = $User > > $CustomizedObject | Add-Member -MemberType NoteProperty > -Name Matched -Value $false > > $AllCustomizedUsers += $CustomizedObject > > } > > > > That works, but is there a better way? > > > > I could come at it from the other direction; get my list of all users; when I > find one that matches the criteria later, at that point create a new object > with my boolean field; save all those objects; use those customized objects > later in output. That would double up memory use, but possibly shorten > execution time, since I wouldn't have to loop through all users first, adding > an object. Instead only adding objects when I find a match (which should only > be about 20% of the users, I am expecting). > > > > > > > > > ================================================ > Did you know you can also post and find answers on PowerShell in the forums? > http://www.myitforum.com/forums/default.asp?catApp=1 > > ********************************************************** > Electronic Mail is not secure, may not be read every day, and should > not be used for urgent or sensitive issues > > > ================================================ > Did you know you can also post and find answers on PowerShell in the forums? > http://www.myitforum.com/forums/default.asp?catApp=1 ================================================ Did you know you can also post and find answers on PowerShell in the forums? http://www.myitforum.com/forums/default.asp?catApp=1 ================================================ Did you know you can also post and find answers on PowerShell in the forums? http://www.myitforum.com/forums/default.asp?catApp=1
