This might take you 3 minutes to read.

Problem to solve

The customer has clients with locally stored application files. The files are from an earlier application and should not be used anymore. I needed to verify that the application files was removed from the clients. I did not want to walk to each 500+ clients so I created a small script to use “test-path” to see if the files were removed and then summarise it.

Script breakdown

The script is small so I do a quick breakdown.

Get all computer-objects in AD

Retrieve all computers from AD. There is so few servers and other computers that I did not filter it.

$computers = Get-ADComputer -Filter * | select name

Test if there is a DNS record for the computer

Now we iterate through the $computers and test each computer if we can find it in the DNS. The reason for the DNS lookup is that I got almost 1000 computer objects from AD and I know that there is only about 500 computers.

if ([bool](Resolve-DnsName $computer -ErrorAction Ignore))

Test if the computer is reachable

Now we know that the computer has been live the last 7 days (DNS scavenging), so let us see if the computer is live right now.

if ([bool](test-netconnection $computer -ErrorAction Ignore  -InformationLevel Quiet) )

Test if the path exists

At this point we know that the computer is reachable so let us try to verify the path.

$path = "fu"
if (test-path $path)

 

Run foreach parallel

Not to watch paint dry I ran the test in parallel with powershell jobs.

Result

How did I publish my result? I returned all results in a hash table and then used the group cmdlet. I could then see that no clients had the application path on the computers.

$data | group

The complete script

# Retrieve all computers
$computers = Get-ADComputer -Filter * | select name

# Empty job queue
Get-Job | Receive-Job

$data = @()
$i = 0
#Iterate through all computers
foreach ($computer in $computers)
{
	$i += 1
	$running = @(Get-Job | Where-Object { $_.State -eq 'Running' })
	Write-Progress -Activity "Looking up Clients" -Status "Running $($running.Count) simultaneous: " -PercentComplete ($i/$computers.Count)
	if ($running.Count -le 20)
	{
		Start-Job -Scriptblock {
			
			param ($computer)
			# write-host -ForegroundColor Green "=== Checking client: $computer ==="
			if ([bool](Resolve-DnsName $computer -ErrorAction Ignore))
			{
				if ([bool](test-netconnection $computer -ErrorAction Ignore -InformationLevel Quiet))
				{
					# write-host -foreground green "Client is up, checking for file..."
					$path = "\\$computer\c$\temp\login.txt"
					if (test-path $path)
					{
						# write-host -foreground green "$(get-content $path)"
						"Success"
					}
					else
					{
						# write-host -foreground red "Could not find: $path"
						"FileFail"
					}
				}
				else
				{
					# write-host -foreground red "Client: $computer is not reachable..."
					"PingFail"
				}
			}
			else
			{
				# write-host -foreground red "Client: $computer could not be looked up..."
				"DNSFail"
			}
			
		} -arg "$($computer.name)"
	}
	else
	{
		Start-Sleep -Milliseconds 100
	}
	$data += Get-Job | Receive-Job
}
$data | group

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.