functions/Get-DbaServerInstallDate.ps1

function Get-DbaServerInstallDate {
<#
.SYNOPSIS
Returns the install date of a SQL Instance and Windows Server, depending on what is passed.
     
.DESCRIPTION
By default, this command returns for each SQL Instance instance passed in:
SQL Instance install date, formatted as a string
Hosting Windows server install date, formatted as a string
     
.PARAMETER SqlInstance
The SQL Server that you're connecting to.
 
.PARAMETER SqlCredential
Credential object used to connect to the SQL Server as a different user
 
.PARAMETER Credential
Credential object used to connect to the SQL Server as a different user
 
.PARAMETER IncludeWindows
Includes the Windows Server Install date information
 
.PARAMETER Silent
Use this switch to disable any kind of verbose messages
 
.NOTES
Tags: CIM
Author: Mitchell Hamann (@SirCaptainMitch), mitchellhamann.com
     
Website: https://dbatools.io
Copyright: (C) Chrissy LeMaire, clemaire@gmail.com
License: GNU GPL v3 https://opensource.org/licenses/GPL-3.0
 
.LINK
https://dbatools.io/Get-DbaServerInstallDate
 
.EXAMPLE
Get-DbaServerInstallDate -SqlInstance SqlBox1\Instance2
 
Returns an object with SQL Instance Install date as a string and the Windows install date as string.
 
.EXAMPLE
Get-DbaServerInstallDate -SqlInstance winserver\sqlexpress, sql2016
 
Returns an object with SQL Instance Install date as a string and the Windows install date as a string for both SQLInstances that are passed to the cmdlet.
     
.EXAMPLE
Get-DbaServerInstallDate -SqlInstance sqlserver2014a, sql2016
 
Returns an object with only the SQL Server Install date as a string.
 
.EXAMPLE
Get-DbaServerInstallDate -SqlInstance sqlserver2014a, sql2016 -IncludeWindows
 
Returns an object with the Windows Install date and the SQL install date as a string.
 
.EXAMPLE
Get-DbaRegisteredServer -SqlInstance sql2014 | Get-DbaServerInstallDate
 
Returns an object with SQL Instance install date as a string for every server listed in the Central Management Server on sql2014
     
#>

    [CmdletBinding()]
    Param (
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [Alias("ServerInstance", "SqlServer", "ComputerName")]
        [DbaInstanceParameter[]]$SqlInstance,
        [PSCredential]
        $SqlCredential,
        [PSCredential]
        $Credential,
        [Switch]$IncludeWindows,
        [switch]$Silent
    )
    
    process {
        foreach ($instance in $SqlInstance) {
            try {
                Write-Message -Level VeryVerbose -Message "Connecting to $instance" -Target $instance
                $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential
            }
            catch {
                Stop-Function -Message "Failed to process Instance $Instance" -ErrorRecord $_ -Target $instance -Continue
            }
            
            if ($server.VersionMajor -ge 9) {
                Write-Message -Level Verbose -Message "Getting Install Date for: $instance"
                $sql = "SELECT create_date FROM sys.server_principals WHERE sid = 0x010100000000000512000000"
                [DbaDateTime]$sqlInstallDate = $server.Query($sql, 'master', $true).create_date
                
            }
            else {
                Write-Message -Level Verbose -Message "Getting Install Date for: $instance"
                $sql = "SELECT schemadate FROM sysservers"
                [DbaDateTime]$sqlInstallDate = $server.Query($sql, 'master', $true).create_date
            }
            
            $WindowsServerName = $server.ComputerNamePhysicalNetBIOS
            
            if ($IncludeWindows) {
                try {
                    [DbaDateTime]$windowsInstallDate = (Get-DbaCmObject -ClassName win32_OperatingSystem -ComputerName $WindowsServerName -Credential $Credential -Silent).InstallDate
                }
                catch {
                    Stop-Function -Message "Failed to connect to: $WindowsServerName" -Continue -Target $instance -ErrorRecord $_
                }
            }
            
            $object = [PSCustomObject]@{
                ComputerName = $server.NetName
                InstanceName = $server.ServiceName
                SqlInstance = $server.DomainInstanceName
                SqlInstallDate = $sqlInstallDate
                WindowsInstallDate = $windowsInstallDate
            }
            
            if ($IncludeWindows) {
                Select-DefaultView -InputObject $object -Property ComputerName, InstanceName, SqlInstance, SqlInstallDate, WindowsInstallDate
            }
            else {
                Select-DefaultView -InputObject $object -Property ComputerName, InstanceName, SqlInstance, SqlInstallDate
            }
            
        }
    }
}