I run the following script:<\/p>\n
$reportFile = “c:\\temp\\report-serviceaccounts.html”<\/p>\n
$ErrorActionPreference = “Stop”<\/p>\n
$maxThreads = 10<\/p>\n
$currentDomain = $env:USERDOMAIN.ToUpper()<\/p>\n
$serviceAccounts = @{}<\/p>\n
[string<\/span>]$warnings = @()<\/p>\n $readServiceAccounts = {<\/p>\n param( $hostname )<\/p>\n if ( Test-Connection -ComputerName $hostname -Count 3 -Quiet ){<\/p>\n try {<\/p>\n $serviceList = @( gwmi -Class Win32_Service -ComputerName $hostname -Property Name,StartName,SystemName -ErrorAction Stop )<\/p>\n $serviceList<\/p>\n }<\/p>\n catch{<\/p>\n “Failed to retrieve data from $hostname : $($_.toString())”<\/p>\n }<\/p>\n }<\/p>\n else{<\/p>\n “$hostname is unreachable”<\/p>\n }<\/p>\n } function processCompletedJobs(){<\/p>\n $jobs = Get-Job -State Completed<\/p>\n foreach( $job in $jobs ) {<\/p>\n $data = Receive-Job $job<\/p>\n Remove-Job $job<\/p>\n if ( $data.GetType() -eq [Object<\/span>] ){<\/p>\n $serviceList = $data | ? { $_.StartName.toUpper().StartsWith( $currentDomain )}<\/p>\n foreach( $service in $serviceList ){<\/p>\n $account = $service.StartName<\/p>\n $occurance = “ if ( $script:serviceAccounts.Contains( $account ) ){ $script:serviceAccounts.Item($account) += $occurance<\/p>\n }<\/p>\n else {<\/p>\n $script:serviceAccounts.Add( $account, @( $occurance ) )<\/p>\n }<\/p>\n }<\/p>\n }<\/p>\n elseif ( $data.GetType() -eq [String] ) {<\/p>\n $script:warnings += $data<\/p>\n Write-warning $data<\/p>\n }<\/p>\n }<\/p>\n } ################# MAIN #########################<\/p>\n Import-Module ActiveDirectory<\/p>\n Write-Progress -Activity “Retrieving server list from ActiveDirectory” -Status “Processing…” -PercentComplete 0<\/p>\n $serverList = Get-ADComputer -Filter {OperatingSystem -like “Windows Server*”} -Properties DNSHostName, cn | ? { $_.enabled }<\/p>\n $count_servers = 0<\/p>\n foreach( $server in $serverList ){<\/p>\n Start-Job -ScriptBlock $readServiceAccounts -Name “read_$($server.cn<\/a>)” -ArgumentList $server.dnshostname | Out-Null<\/p>\n ++$count_servers<\/p>\n Write-Progress -Activity “Retrieving data from servers” -Status “Processing…” -PercentComplete ( $count_servers * 100 / $serverList.Count )<\/p>\n while ( ( Get-Job -State Running).count -ge $maxThreads ) { Start-Sleep -Seconds 3 } processCompletedJobs }<\/p>\n Write-Progress -Activity “Retrieving data from servers” -Status “Waiting for background jobs to complete…” -PercentComplete 100<\/p>\n Wait-Job -State Running -Timeout 30 | Out-Null<\/p>\n Get-Job -State Running | Stop-Job<\/p>\n processCompletedJobs<\/p>\n Write-Progress -Activity “Generating report” -Status “Please wait…” -PercentComplete<\/p>\n 0 $accountTable = @()<\/p>\n foreach( $serviceAccount in $serviceAccounts.Keys ) {<\/p>\n foreach( $occurance in $serviceAccounts.item($serviceAccount) ){<\/p>\n $row = new-object psobject<\/p>\n Add-Member -InputObject $row -MemberType NoteProperty -Name “Account” -Value $serviceAccount<\/p>\n Add-Member -InputObject $row -MemberType NoteProperty -Name “Usage” -Value $occurance<\/p>\n $accountTable += $row<\/p>\n }<\/p>\n }<\/p>\n $report = \" <\/p>\n\n\n\n\n\n\n\n\n\n $($serverList.count) servers processed. Discovered $($serviceAccounts.count) service accounts.<\/p>\n $( $accountTable | Sort Account | ConvertTo-Html Account, Usage -Fragment )<\/p>\n $( $warnings | % { “<\/p> $_<\/p>” } ) <\/p>\n\n\"\n Write-Progress -Activity “Generating report” -Status “Please wait…” -Completed<\/p>\n $report | Set-Content $reportFile -Force<\/p>\n Invoke-Expression $reportFile<\/p>\n And I am getting the following error:<\/p>\n Receive-Job : Cannot bind argument to parameter ‘Job’ because it is null.<\/a>scriptblock to retrieve service list from a remote machine<\/h1>\n
<\/a>reads service list from completed jobs,<\/h1>\n
<\/a>updates $serviceAccount table and removes completed job<\/h1>\n
\"$($service.Name)<\/code>” service on $($service.SystemName)\"<\/p>\n
<\/a>read computer accounts from current domain<\/h1>\n
<\/a>start data retrieval job for each server in the list<\/h1>\n
<\/a>use up to $maxThreads threads<\/h1>\n
<\/a>process remaining jobs<\/h1>\n
<\/a>prepare data table for report<\/h1>\n
<\/a>create report<\/h1>\n
Service account report for $currentDomain domain<\/h1>\n
Discovered service accounts<\/h2>\n
Warning messages<\/h2>\n
\nAt line:6 char:28<\/p>\n\n
[Receive-Job], ParentContainsErrorRecordException<\/li>\n