Configurations/SingleServer/VMValidate.test.ps1
#requires -version 5.1 #revised for Pester 5.x #test if VM setup is complete BeforeDiscovery { #Write-Host "Pester Test development v2.0.0" -ForegroundColor Yellow $Node = 'S1' $LabData = Import-PowerShellDataFile -Path $PSScriptRoot\*.psd1 $Computername = $LabData.AllNodes[1].NodeName $Domain = $Computername $prefix = $LabData.NonNodeData.Lability.EnvironmentPrefix $VMName = "$($prefix)$Computername" $FireWallRules = $LabData.AllNodes.FirewallRuleNames $NodeIP = $LabData.AllNodes[1].IPAddress $DNSAddress = $LabData.AllNodes[0].DnsServerAddress $CNTest = @{ CN = $Computername } $IPTest = @{ IP = $NodeIP } $DNSTest = @{Address = $DNSAddress } } Describe $Node { BeforeAll { $LabData = Import-PowerShellDataFile -Path $PSScriptRoot\*.psd1 $Secure = ConvertTo-SecureString -String "$($LabData.AllNodes.LabPassword)" -AsPlainText -Force $Computername = $LabData.AllNodes[1].NodeName $cred = New-Object PSCredential "$Domain\Administrator", $Secure #The prefix only changes the name of the VM not the guest computername $prefix = $LabData.NonNodeData.Lability.EnvironmentPrefix $VMName = "$($prefix)$Computername" #set error action preference to suppress all error messages which would be normal while configurations are converging #turn off progress bars $prep = { $ProgressPreference = 'SilentlyContinue' $errorActionPreference = 'SilentlyContinue' } $VMSess = New-PSSession -VMName $VMName -Credential $Cred -ErrorAction Stop Invoke-Command $prep -Session $VMSess $test = Invoke-Command { Get-CimInstance -ClassName win32_OperatingSystem -Property caption, csname } -Session $VMSess $dns = Invoke-Command { Get-DnsClientServerAddress -InterfaceAlias ethernet -AddressFamily IPv4 } -Session $VMSess $sys = Invoke-Command { Get-CimInstance Win32_ComputerSystem } -Session $VMSess $if = Invoke-Command -Scriptblock { Get-NetIPAddress -InterfaceAlias 'Ethernet' -AddressFamily IPv4 } -Session $VMSess $installType = Invoke-Command { Get-ItemPropertyValue -Path 'HKLM:\SOFTWARE\Microsoft\windows nt\currentversion' -Name InstallationType } -Session $VMSess $resolve = Invoke-Command { Resolve-DnsName www.pluralsight.com -Type A | Select-Object -First 1 } -Session $VMSess $PS2Test = Invoke-Command { (Get-WindowsFeature -Name 'PowerShell-V2').Installed } -Session $VMSess $rdpTest = Invoke-Command { Get-ItemPropertyValue -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\' -Name fDenyTSConnections } -Session $VMSess $FireWallRules = $LabData.AllNodes.FirewallRuleNames $fw = Invoke-Command { Get-NetFirewallRule -Name $using:FireWallRules } -Session $VMSess | ForEach-Object -Begin { $tmp = @{} } -Process { $tmp.Add($_.Name, $_.Enabled) } -End { $tmp } } AfterAll { if ($VMSess) { $VMSess | Remove-PSSession } } It "[$Node] Should accept administrator credential" { $VMSess.State | Should -Be 'Opened' } It "[$Node] Should respond to WSMan requests" { $VMSess.Computername | Should -Be $VMName } It "[$Node] Should Belong to a Workgroup" { $sys.Domain | Should -Be 'Workgroup' } It "[$Node] Should have firewall rule <_> enabled" -ForEach $FireWallRules { $fw[$_] | Should -Be $True } It "[$Node] Should Be running Windows Server 2019" { $test.caption | Should -BeLike '*2019*' } It "[$Node] Should have a computername of <CN>" -ForEach $CNTest { $test.CSName | Should -Be $CN } It "[$Node] Should Be running Server Core" { $installType | Should -Be 'Server Core' } It "[$Node] Should have an IP address of <IP>" -ForEach $IPTest { $if.ipv4Address | Should -Be $IP } It "[$Node] Should have a DNS server configuration of <Address>" -ForEach $DNSTest { $dns.ServerAddresses -contains $Address | Should -Be 'True' } It "[$Node] Should Be able to resolve an Internet address" { $resolve.name | Should -Be 'www.pluralsight.com' } It "[$Node] Should have RDP for admin access enabled" { $rdpTest | Should -Be 0 } It "[$Node] Should not have PowerShell 2 installed" { $PS2Test | Should -Be $False } } |