#Requires -Modules 'ADDSDeployment' [CmdletBinding()] Param( # No parameters ) $NewEventLogSplat = @{ LogName = 'Application' Source = 'OVF-Properties' ErrorAction = 'SilentlyContinue' } New-EventLog @NewEventLogSplat $WriteEventLogSplat = @{ LogName = 'Application' Source = 'OVF-Properties' EntryType = 'Information' EventID = 1 Message = 'OVF-Properties sequence initiated' } Write-EventLog @WriteEventLogSplat $VMwareToolsExecutable = "C:\Program Files\VMware\VMware Tools\vmtoolsd.exe" [xml]$ovfEnv = & $VMwareToolsExecutable --cmd "info-get guestinfo.ovfEnv" | Out-String $ovfProperties = $ovfEnv.ChildNodes.NextSibling.PropertySection.Property $ovfPropertyValues = @{} foreach ($ovfProperty in $ovfProperties) { $ovfPropertyValues[$ovfProperty.key] = $ovfProperty.Value } # Check for mandatory values If (!($ovfPropertyValues['guestinfo.hostname'] -and $ovfPropertyValues['guestinfo.ipaddress'] -and $ovfPropertyValues['guestinfo.dnsserver'] -and $ovfPropertyValues['guestinfo.prefixlength'] -and $ovfPropertyValues['guestinfo.gateway'])) { # Mandatory values missing, cannot provision. $WriteEventLogSplat = @{ LogName = 'Application' Source = 'OVF-Properties' EntryType = 'Error' EventID = 66 Message = 'Mandatory values missing, cannot provision.' } Write-EventLog @WriteEventLogSplat & schtasks.exe /Change /TN 'OVF-Properties' /DISABLE Stop-Computer -Force Exit } # Set hostname and description If ($Env:ComputerName -ne $ovfPropertyValues['guestinfo.hostname']) { $RenameComputerSplat = @{ NewName = $ovfPropertyValues['guestinfo.hostname'] Force = $True Confirm = $False } Rename-Computer @RenameComputerSplat $SetCimInstanceSplat = @{ InputObject = (Get-CimInstance -ClassName 'Win32_OperatingSystem') Property = @{ Description = $ovfPropertyValues['guestinfo.hostname'] } } Set-CimInstance @SetCimInstanceSplat # Restart the computer to apply changes Restart-Computer -Force Exit } # Configure network interface If ((Get-WmiObject -Class 'Win32_NetworkAdapterConfiguration').IPAddress -NotContains $ovfPropertyValues['guestinfo.ipaddress']) { $NewNetIPAddressSplat = @{ InterfaceAlias = (Get-NetAdapter).Name AddressFamily = 'IPv4' IPAddress = $ovfPropertyValues['guestinfo.ipaddress'] PrefixLength = $ovfPropertyValues['guestinfo.prefixlength'] DefaultGateway = $ovfPropertyValues['guestinfo.gateway'] } New-NetIPAddress @NewNetIPAddressSplat # Wait for network connection to become available $Timestamp, $TimeoutMinutes = (Get-Date), 5 Do { If ($Timestamp.AddMinutes($TimeoutMinutes) -lt (Get-Date)) { $WriteEventLogSplat = @{ LogName = 'Application' Source = 'OVF-Properties' EntryType = 'Warning' EventID = 13 Message = "Timeout after $($TimeoutMinutes) minutes waiting for network connection to become available." } Write-EventLog @WriteEventLogSplat Break } Start-Sleep -Milliseconds 250 $GetNetIPAddressSplat = @{ InterfaceAlias = (Get-NetAdapter).Name AddressFamily = 'IPv4' ErrorAction = 'SilentlyContinue' } } Until ((Get-NetIPAddress @GetNetIPAddressSplat).AddressState -eq 'Preferred') $OldErrorActionPreference, $ErrorActionPreference = $ErrorActionPreference, 'SilentlyContinue' $TestNetConnectionSplat = @{ ComputerName = ([IPAddress]$ovfPropertyValues['guestinfo.dnsserver']).IPAddressToString InformationLevel = 'Quiet' } $SetDnsClientServerAddressSplat = @{ InterfaceAlias = (Get-NetAdapter).Name ServerAddresses = If ( [boolean]($ovfPropertyValues['guestinfo.dnsserver'] -as [IPaddress]) -and (Test-NetConnection @TestNetConnectionSplat)) { ($ovfPropertyValues['guestinfo.dnsserver']) } else { ('127.0.0.1') } Validate = $False } Set-DnsClientServerAddress @SetDnsClientServerAddressSplat $ErrorActionPreference, $OldErrorActionPreference = $OldErrorActionPreference, $NULL } # Foo # Iterate through and invoke all payload scripts #! TODO: add registry values to determine which scripts have already been invoked (in case of intermediate reboots) $GetItemSplat = @{ Path = "$($PSScriptRoot)\Scripts\*.ps1" } Get-Item @GetItemSplat | ForEach-Object { Try { $WriteEventLogSplat = @{ LogName = 'Application' Source = 'OVF-Properties' EntryType = 'Information' EventID = 4 Message = "Running script: '$($_.FullName)'" } Write-EventLog @WriteEventLogSplat & $_.FullName -Parameter $ovfPropertyValues } Catch { $WriteEventLogSplat = @{ LogName = 'Application' Source = 'OVF-Properties' EntryType = 'Error' EventID = 66 Message = $_.Exception.Message } Write-EventLog @WriteEventLogSplat } } $WriteEventLogSplat = @{ LogName = 'Application' Source = 'OVF-Properties' EntryType = 'Information' EventID = 42 Message = 'OVF-Properties sequence applied and finished' } Write-EventLog @WriteEventLogSplat & schtasks.exe /Change /TN 'OVF-Properties' /DISABLE