Last week, I opted to share a couple of old HTAs I had written. HTAs are HTML Applications and allow administrations the ability to create a graphical interface for their scripts. It’s an older technology and not something I still write, or use. Even so, I wanted to share them with the community. As they’re not Windows PowerShell-related, I thought I should circle back on that post and incorporate some PowerShell.
The second of the two HTAs I shared was called Remote Desktop Assistant (download link: RDAssistantv2.1 (9770 downloads ) ). Its purpose is to allow a user to select a computer description from a list and open Remote Desktop to connect to that computer. I know, I know, this goes against all things PowerShell, but it was written a long time ago. The HTA has a requirement for an external text file called computers.txt that stores computer descriptions and computer names / IP addresses, such as we have in the list below. It’s a computer description, a semi-colon, and the computer name or IP address.
computer1;10.10.10.5 computer2;dns1.mydomain.com computer3;10.10.10.9
We can make use of Active Directory and PowerShell to create this list and subsequent text file, so we don’t have to do it manually. In fact, once you had your code written you could schedule it to ensure the computers.txt file was as accurate as the last time the scheduled task ran. While the preferred way to do this would be to store host names (at least in my opinion), I’ll show examples of collecting the IP addresses, too.
In the first example, we’ll pull all of our servers from a single Organizational Unit to return the names and DNSHostNames.
PS> Get-ADComputer -Filter * -SearchBase 'OU=Servers,DC=mydomain,DC=com' -Properties DNSHostName | Select-Object Name,DNSHostName Name DNSHostName ---- ----------- SQL01 SQL01.mydomain.com SQL02 SQL02.mydomain.com SQL03 SQL03.mydomain.com SQL04 SQL04.mydomain.com
In this example, we return the names and IP addresses.
PS> Get-ADComputer -Filter * -SearchBase 'OU=Servers,DC=mydomain,DC=com' -Properties IPv4Address | Select-Object Name,IPv4Address Name IPv4Address ---- ----------- SQL01 10.10.10.30 SQL02 10.10.10.31 SQL03 10.10.10.32 SQL04 10.10.10.33
While these are the results we want, we need to get them into the proper format. We’ll do this by looping through each result and concatenating the two properties with semi-colon in between. To do this, we do not need to use the Select-Object cmdlet to return the Name and IPv4Address, or DNSHostName.
PS> Get-ADComputer -Filter * -SearchBase 'OU=Servers,DC=mydomain,DC=com' -Properties IPv4Address | ForEach-Object {"$($_.Name):$($_.IPv4Address)"} SQL01;10.10.10.30 SQL02;10.10.10.31 SQL03;10.10.10.32 SQL04;10.10.10.33
With the host name set, we’ll take this one step further and create our computers.txt file.
PS> Get-ADComputer -Filter * -SearchBase 'OU=Servers,DC=mydomain,DC=com' -Properties DNSHostName | ForEach-Object {"$($_.Name):$($_.DNSHostName)"} | Out-File -FilePath C:\computers.txt PS> Get-Content -Path C:\computers.txt SQL01;SQL01.mydomain.com SQL02;SQL02.mydomain.com SQL03;SQL03.mydomain.com SQL04;SQL04.mydomain.com
Chances are good that if you use the DNSHostName, you’re never going to have an Active Directory computer object returned without one. The same can’t be said if you use the IPv4Address, as this property is created at the time the results are returned (it queries DNS). Think about it, have you ever seen an IPv4Address property inside Active Directory Users and Computer when viewing a computer object? The DNSHostName option might be the better option, but I’ll leave that up to you.