PowerShell: Pass a string and check if the entry exists in Windows Host File

While working on a brand-new Windows 11 Azure Spot VM and as part of setting up Sitecore MVP Site, one of the issues I faced is ERROR CONNECTING TO HTTPS://ID.SC-MVP.LOCALHOST/.WELL-KNOWN/OPENID-CONFIGURATION. The reason is, the host file entries get wiped-off on every restart in case of Azure Spot VMs (since ip is regenerated every time). As a result, I would be presented with the concerned connectivity error every time I  execute Start-Environment.ps1. When I checked the Start-Environment.ps1, the Add-HostsEntry is within a if-block that assumes if certs are generated, there is no need to add hosts file entry in Start-Environment.ps1:



So, the solution is,  irrespective of certs generated, check the host file for the related domain entries and if not present, add those. Also, I thought a function to check if a given host name exists in the host file would be handy before adding a host name entry. The Check-HostNameExists function I put-together here below does the job of checking if a specific string exists in the host file.

I added this function to C:\mvp-site\docker\tools\Init-Env.psm1

The Initialize-HostNames function needs to have the check before doing any addition to host file:




Then, added the check to the Start-Environment.ps1 too as follows:


With these in place, my host name was added automatically, if not present, and helped me forego ERROR CONNECTING TO HTTPS://ID.SC-MVP.LOCALHOST/.WELL-KNOWN/OPENID-CONFIGURATION on an Azure spot VM.

Check-HostNameExists Function:



Following files need to be replaced in relevant locations under \docker\tools:


As separate files:
Check-HostNameCallingScript.ps1

#Reference: https://www.sapien.com/blog/wp-content/uploads/2009/02/parse-hosts.txt
# ==============================================================================================
# 
# Microsoft PowerShell Source File 
# 
# NAME: Check-HostNameEntry.ps1 
# 
# USAGE: .\Check-HostNameEntry.ps1  -HostNameString "entrytocheck"
# 
#Reference: https://www.sapien.com/blog/wp-content/uploads/2009/02/parse-hosts.txt
# 
# COMMENT: This script will check if the local computer windows hosts file has a specific entry
# 
#returns $true or $false
#can be used in calling script as follows: 

#$entryPresent=.\Check-HostNameExists.ps1 "cm.sitecore.local"
#if ($entryPresent -eq $false) 
#{write-host "not present"}
#else {write-host "present"}
# ==============================================================================================

param (
			[Parameter(Mandatory = $true)]
			[ValidateNotNullOrEmpty()]
			[string] 
			$HostNameString
	)
try
{
	
	#write-host "Trying to match : $HostNameString"
	$result=$false
	#define a regex to return first NON-whitespace character
	[regex]$r="\S"
	#strip out any lines beginning with # and blank lines
	$HostsData = Get-Content $env:windir\system32\drivers\etc\hosts | where {
		(($r.Match($_)).value -ne "#") -and ($_ -notmatch "^\s+$") -and ($_.Length -gt 0)
	}
	 
	#write-host $HostsData
	if ($HostsData){
			#only process if something was found in HOSTS
			$HostsData | foreach {
				#created named values                              
				$_ -match "(?<IP>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(?<HOSTNAME>\S+)" | Out-Null
							
				$ip=$matches.ip				
				$hostname=$matches.hostname				
				
				if ($result -eq $false)
				{
					write-host $hostname
					if ($hostname -eq $HostNameString) {
						$result=$true
						Write-Host "matched"
						return 	$result	
						#break													
					}
				}
				else
				{
					return 	$result	
					#break
				}
				
					  
			} #end ForEach
	} #end If $HostsData
	else {
			Write-Host ("{0} has no entries in its HOSTS file." -f $computername.toUpper()) -foreground Magenta
			$result=$false			
	}
	
	return 	$result		
}
catch
{
	write-host  "error"
	$result=$false
	return $result
}


Comments