Libraries/OS.WinNT/OS.WinNT.psm1

<#
    .SYNOPSIS
    Get the flavor of the OS
 
.PARAMETER Online
True to specify to fetch information from the running OS
 
.PARAMETER Root
The path to the root of an OS.
 
.EXAMPLE
Get-OSKernelVersion -Online
 
.EXAMPLE
Get-OSKernelVersion -Root F:\
 
#>

function Get-OSKernelVersion {
    [CmdletBinding()][OutputType([String])]Param (
        [switch]$Online,
        [string]$Root
    )
    Begin {
        Write-EnterFunction
    }

    Process {
        if ($Online) {
            $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
        } else {
            $RegPath = Mount-OfflineWindowsRegistry -Path $Root -Hive SOFTWARE
            $RegPath = $RegPath + "\Microsoft\Windows NT\CurrentVersion"
        }

        if ($PSVersionTable.PSVersion.Major -lt 5) {
            return (Get-ItemProperty $RegPath 'CurrentBuildNumber' -ErrorAction:SilentlyContinue).CurrentBuildNumber
        } else {
            return Get-ItemPropertyValue $RegPath -Name CurrentBuildNumber
        }
    }

    End {
        Write-LeaveFunction
    }
}

<#
.SYNOPSIS
Get the release ID of an OS
 
.DESCRIPTION
The release ID of an OS is often a number identifying OS in time.
It can return 1607 or 1809 on windows 10 or 16.04 or 18.10 on ubuntu.
 
.EXAMPLE
Get-OSReleaseId -Online
 
.NOTES
General notes
#>

function Get-OSReleaseId {
    [CmdletBinding()][OutputType([String])]Param (
        [switch]$Online,
        [string]$Root
    )
    Begin {
        Write-EnterFunction
    }

    Process {
        if ($Online) {
            $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
        } else {
            $RegPath = Mount-OfflineWindowsRegistry -Path $Root -Hive SOFTWARE
            $RegPath = $RegPath + "\Microsoft\Windows NT\CurrentVersion"
        }

        if (Test-RegValueExist -RegPath $RegPath -Name ReleaseId) {
            return Get-ItemPropertyValue $RegPath -Name ReleaseId
        } else {
            return $null
        }
    }

    End {
        Write-LeaveFunction
    }
}

<#
.SYNOPSIS
Fetch the Installation Type from the registry
 
.DESCRIPTION
The installation type give information wether the OS is a client, server, or something else.
 
.PARAMETER Online
True to specify to fetch information from the running OS
 
.PARAMETER Root
The path to the root of an OS.
 
.EXAMPLE
Get-OSInstallType -Online
 
.EXAMPLE
Get-OSInstallType -Root F:\
 
.NOTES
General notes
#>


function Get-OSInstalltype {
    [CmdletBinding()][OutputType([String])]Param (
        [switch]$Online,
        [string]$Root
    )
    Begin {
        Write-EnterFunction
    }

    Process {
        if ($Online) {
            $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
        } else {
            $RegPath = Mount-OfflineWindowsRegistry -Path $Root -Hive SOFTWARE
            $RegPath = $RegPath + "\Microsoft\Windows NT\CurrentVersion"
        }

        $value = Get-ItemPropertyValue $RegPath -Name InstallationType

        return $value
   }

    End {
        Write-LeaveFunction
    }
}

<#
.SYNOPSIS
Retrieve the family of an OS
 
.DESCRIPTION
The family of an OS can give informations on how to handle it.
 
.PARAMETER Online
True to specify to fetch information from the running OS
 
.PARAMETER Root
The path to the root of an OS.
 
.EXAMPLE
Get-OSFamily -Online
 
.EXAMPLE
Get-OSFamily -Root F:\
 
.NOTES
General notes
#>


function Get-OSFamily {
    [CmdletBinding()][OutputType([String])]Param (
        [Parameter(ParameterSetName = 'ONLINE')][switch]$Online,
        [Parameter(ParameterSetName = 'ROOT')][string]$Root
    )
    Begin {
        Write-EnterFunction
    }

    Process {
        switch ($PSCmdlet.ParameterSetName) {
            'ONLINE' {
                $InstallationType = OS.WinNT\Get-OSInstalltype -Online
                break
            }
            'ROOT' {
                $InstallationType = OS.WinNT\Get-OSInstalltype -Root $Root
                break
            }
        }
        switch -Wildcard ($InstallationType) {
            "WindowsPE" {
                $family = $InstallationType
                break
            }
            "Server*" {
                $family = "Windows Server"
                break
            }
            "Desktop" {
                $family = "Windows Desktop"
                break
            }
        }

        return $family
    }

    End {
        Write-LeaveFunction
    }
}

<#
.SYNOPSIS
Retrieve the distrib of an OS
 
.DESCRIPTION
The distrib of an OS can give informations on how to handle it.
 
.PARAMETER Online
True to specify to fetch information from the running OS
 
.PARAMETER Root
The path to the root of an OS.
 
.EXAMPLE
Get-OSDistrib -Online
 
.EXAMPLE
Get-OSDistrib -Root F:\
 
.NOTES
General notes
#>


function Get-OSDistrib {
    [CmdletBinding()][OutputType([String])]Param (
        [Parameter(ParameterSetName = 'ONLINE')][switch]$Online,
        [Parameter(ParameterSetName = 'ROOT')][string]$Root
    )
    Begin {
        Write-EnterFunction
    }

    Process {
        switch ($PSCmdlet.ParameterSetName) {
            'ONLINE' {
                $InstallationType = OS.WinNT\Get-OSInstalltype -Online
                break
            }
            'ROOT' {
                $InstallationType = OS.WinNT\Get-OSInstalltype -Root $Root
                break
            }
        }
        switch -Wildcard ($InstallationType) {
            "WindowsPE" {
                $distrib = $InstallationType
                break
            }
            "Server*" {
                $distrib = "Windows $InstallationType"
                break
            }
            "Desktop" {
                $keyExist = Test-RegValueExist -RegPath $RegPath -Name "CurrentMajorVersionNumber"
                if ($keyExist) {
                    $distrib = "Windows 10"
                } else {
                    $distrib = "Windows"
                }
                break
            }
        }

        return $distrib
    }

    End {
        Write-LeaveFunction
    }
}

<#
    .SYNOPSIS
    Get the distribution of the OS
 
.PARAMETER Online
True to specify to fetch information from the running OS
 
.PARAMETER Root
The path to the root of an OS.
 
.EXAMPLE
Get-OSVersion -Online
 
.EXAMPLE
Get-OSVersion -Root F:\
 
#>

function Get-OSVersion {
    [CmdletBinding()][OutputType([String])]Param (
        [Parameter(ParameterSetName = 'ONLINE')][switch]$Online,
        [Parameter(ParameterSetName = 'ROOT')][string]$Root
    )
    Begin {
        Write-EnterFunction
    }

    Process {
        if ($Online) {
            $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
        } else {
            $RegPath = Mount-OfflineWindowsRegistry -Path $Root -Hive SOFTWARE
            $RegPath = $RegPath + "\Microsoft\Windows NT\CurrentVersion"
        }

        if ($PSVersionTable.PSVersion.Major -lt 5) {
            return (Get-ItemProperty $RegPath 'CurrentVersion' -ErrorAction:SilentlyContinue).CurrentVersion
        } else {
            return Get-ItemPropertyValue $RegPath -Name CurrentVersion
        }
   }

    End {
        Write-LeaveFunction
    }
}