function Konfig-ESXi {
<#
    .NOTES
    ===========================================================================
    Created by: Markus Kraus
    Twitter: @VMarkus_K
    Private Blog: mycloudrevolution.com
    ===========================================================================
    Changelog:
    2016.12 ver 1.0 Base Release
    2016.12 ver 1.1 ESXi 6.5 Tests, Minor enhancements
    ===========================================================================
    External Code Sources:
    Function My-Logger : http://www.virtuallyghetto.com/
    ===========================================================================
    Tested Against Environment:
    vSphere Version: ESXi 5.5 U2, ESXi 6.5
    PowerCLI Version: PowerCLI 6.3 R1, PowerCLI 6.5 R1
    PowerShell Version: 4.0, 5.0
    OS Version: Windows 8.1, Server 2012 R2
    Keyword: ESXi, NTP, SSH, Syslog, SATP,
    ===========================================================================

    .DESCRIPTION
    This Function sets the Basic settings for a new ESXi.

    * NTP
    * SSH
    * Syslog
    * Power Management
    * HP 3PAR SATP/PSP Rule
    * ...

    .Example
    Konfig-ESXi -VMHost myesxi.lan.local -NTP 192.168.2.1, 192.168.2.2 -syslog "udp://loginsight.lan.local:514"

    .PARAMETER VMHost
    Host to configure.

    .PARAMETER NTP
    NTP Server(s) to set.

    .PARAMETER Syslog
    Syslog Server to set, e.g. "udp://loginsight.lan.local:514"

    DNS Name must be resolvable!


#Requires PS -Version 4.0
#Requires -Modules VMware.VimAutomation.Core, @{ModuleName="VMware.VimAutomation.Core";ModuleVersion="6.3.0.0"}
#>

[CmdletBinding()]
param(
    [Parameter(Mandatory=$True, ValueFromPipeline=$False, Position=0)]
        [String] $VMHost,
    [Parameter(Mandatory=$true, ValueFromPipeline=$False, Position=1)]
        [array]$NTP,
    [Parameter(Mandatory=$true, ValueFromPipeline=$False, Position=2)]
        [String] $syslog

)

Begin {
    Function My-Logger {
        param(
        [Parameter(Mandatory=$true)]
        [String]$message
        )

        $timeStamp = Get-Date -Format "MM-dd-yyyy_hh-mm-ss"

        Write-Host -NoNewline -ForegroundColor White "[$timestamp]"
        Write-Host -ForegroundColor Green " $message"
    }
    function Set-MyESXiOption {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$True, ValueFromPipeline=$False, Position=0)]
            [String] $Name,
        [Parameter(Mandatory=$False, ValueFromPipeline=$False, Position=1)]
            [String] $Value
    )
    process {
        $myESXiOption = Get-AdvancedSetting -Entity $ESXiHost -Name $Name
        if ($myESXiOption.Value -ne $Value) {
            My-Logger "    Setting ESXi Option $Name to Value $Value"
            $myESXiOption | Set-AdvancedSetting -Value $Value -Confirm:$false | Out-Null
        }
        else {
            My-Logger "    ESXi Option $Name already has Value $Value"
        }
    }
    }
}

Process {
    $Validate = $True

    #region: Start vCenter Connection
    My-Logger "Starting to Process ESXi Server Connection to $VMHost ..."
    if (($global:DefaultVIServers).count -gt 0) {
       Disconnect-VIServer  -Force -Confirm:$False -ErrorAction SilentlyContinue
    }
    $VIConnection = Connect-VIServer -Server $VMHost
    if (-not $VIConnection.IsConnected) {
        Write-Error "ESXi Connection Failed."
        $Validate = $False
    }
    elseif ($VIConnection.ProductLine -ne "EmbeddedEsx") {
        Write-Error "Connencted System is not an ESXi."
        $Validate = $False
    }
    else {
        $ESXiHost = Get-VMHost
        My-Logger "Connected ESXi Version: $($ESXiHost.Version) $($ESXiHost.Build) "
    }
    #endregion

    if ($Validate -eq $True) {

        #region: Enable SSH and disable SSH Warning
        $SSHService = $ESXiHost | Get-VMHostService | where {$_.Key -eq 'TSM-SSH'}
        My-Logger "Starting SSH Service..."
        if($SSHService.Running -ne $True){
            Start-VMHostService -HostService $SSHService -Confirm:$false | Out-Null
        }
        else {
            My-Logger "    SSH Service is already running"
        }
        My-Logger "Setting SSH Service to Automatic Start..."
        if($SSHService.Policy -ne "automatic"){
            Set-VMHostService -HostService $SSHService -Policy "Automatic" | Out-Null
        }
        else {
            My-Logger "    SSH Service is already set to Automatic Start"
        }
        My-Logger "Disabling SSH Warning..."
        Set-MyESXiOption -Name "UserVars.SuppressShellWarning" -Value "1"
        #endregion

        #region: Config NTP
        My-Logger "Removing existing NTP Server..."
        try {
            $ESXiHost | Remove-VMHostNtpServer -NtpServer (Get-VMHostNtpServer) -Confirm:$false
        }
        catch [System.Exception] {
            Write-Warning "Error during removing existing NTP Servers."
        }
        My-Logger "Setting new NTP Servers..."
        foreach ($myNTP in $NTP) {
            $ESXiHost | Add-VMHostNtpServer -ntpserver $myNTP -confirm:$False | Out-Null
        }

        My-Logger "Configure NTP Service..."
        $NTPService = $ESXiHost | Get-VMHostService| Where-Object {$_.key -eq "ntpd"}
        if($NTPService.Running -eq $True){
            Stop-VMHostService -HostService $NTPService -Confirm:$false | Out-Null
        }
        if($NTPService.Policy -ne "on"){
            Set-VMHostService -HostService $NTPService -Policy "on" -confirm:$False | Out-Null
        }

        My-Logger "Configure Local Time..."
        $HostTimeSystem = Get-View $ESXiHost.ExtensionData.ConfigManager.DateTimeSystem
        $HostTimeSystem.UpdateDateTime([DateTime]::UtcNow)

        My-Logger "Start NTP Service..."
        Start-VMHostService -HostService $NTPService -confirm:$False | Out-Null
        #endregion

        #region: Remove default PG
        My-Logger "Checking for Default Port Group ..."
        if ($defaultPG = $ESXiHost | Get-VirtualSwitch -Name vSwitch0 | Get-VirtualPortGroup -Name "VM Network" -ErrorAction SilentlyContinue ){
            Remove-VirtualPortGroup -VirtualPortGroup $defaultPG -confirm:$False | Out-Null
            My-Logger "    Default PG Removed"
        }
        else {
            My-Logger "    No Default PG found"
        }
        #endregion

        #region: Configure Static HighPower
        My-Logger "Setting PowerProfile to Static HighPower..."
        try {
            $HostView = ($ESXiHost | Get-View)
            (Get-View $HostView.ConfigManager.PowerSystem).ConfigurePowerPolicy(1)
        }
        catch [System.Exception] {
            Write-Warning "Error during Configure Static HighPower. See latest errors..."
        }
        #endregion

        #region: Conf Syslog
        My-Logger "Setting Syslog Firewall Rule ..."
        $SyslogFW = ($ESXiHost | Get-VMHostFirewallException | where {$_.Name -eq 'syslog'})
        if ($SyslogFW.Enabled -eq $False ){
            $SyslogFW | Set-VMHostFirewallException -Enabled:$true -Confirm:$false | Out-Null
            My-Logger "  Syslog Firewall Rule enabled"
        }
        else {
            My-Logger "  Syslog Firewall Rule already enabled"
        }
        My-Logger "Setting Syslog Server..."
        Set-MyESXiOption -Name "Syslog.global.logHost" -Value $syslog
        #endregion

        #region: Change Disk Scheduler
        My-Logger "Changing Disk Scheduler..."
        Set-MyESXiOption -Name "Disk.SchedulerWithReservation" -Value "0"
        #endregion

        #region: Configure HP 3PAR SATP/PSP Rule
        My-Logger "Configure HP 3PAR SATP/PSP Rule"
        $esxcli2 = Get-ESXCLI -VMHost $ESXiHost -V2
        $arguments = $esxcli2.storage.nmp.satp.rule.add.CreateArgs()
        $arguments.satp = "VMW_SATP_ALUA"
        $arguments.psp = "VMW_PSP_RR"
        $arguments.pspoption = "iops=100"
        $arguments.claimoption = "tpgs_on"
        $arguments.vendor = "3PARdata"
        $arguments.model = "VV"
        $arguments.description = "HP 3PAR custom SATP Claimrule"
        try {
            $esxcli2.storage.nmp.satp.rule.add.Invoke($arguments)
        }
        catch {
             Write-Warning "Error during Configure HP 3PAR SATP/PSP Rule. See latest errors..."
        }
		#endregion

    }
    }
}
