# ***************************************************
# Paths and resources set up
#
# ***************************************************
$InvocationPath = Split-Path -Path $MyInvocation.MyCommand.Path -Parent

Import-Module "$InvocationPath\DelayedTasks.psm1" -WarningAction SilentlyContinue -Global
Import-Module "$InvocationPath\WindowsUpdates.psm1" -WarningAction SilentlyContinue -Global

Set-Variable StatusFile -option Constant -value "$env:tmp\prep.status"

Add-Type @"

    using System;

    public class PrepStatus
    {
        public string system = "";
        public DateTime time = DateTime.Now;
    }
"@

function Preparation-GetStatus 
{
    # load preparation status temp file
    # prep is needed if unable to load file
    #
    try
    {
        $status = [PrepStatus] (Import-Clixml $StatusFile)
    }
    catch
    {
        return $true
    }

    # check if system name is different, or if more than 12hours has elapsed
    #
    if ( ($status.system -ne $env:COMPUTERNAME) -or ($status.time -le ((Get-Date).AddHours(-12))) )
    {
        return $true
    }
    else
    {
        return $false
    }
}

function Preparation-GetExecutionExperience 
{
    # load preparation status temp file
    # Check the content and return booleanprep
    #     True : Prep was run once on this machine
    #     False: Prep was not executed.
    #
    try
    {
        $status = [PrepStatus] (Import-Clixml $StatusFile)
    }
    catch
    {
        return $false
    }

    # check if system name is different
    #
    if ( $status.system -ne $env:COMPUTERNAME )
    {
        return $false
    }
    else
    {
        return $true
    }
}

function Preparation-UpdateStatus
{
    $status = New-Object PrepStatus
    $status.system = $env:COMPUTERNAME
    $status | Export-Clixml $StatusFile -Force
}

<# 
    DataDump
    dumps various data sources like msinfo32 into the results folder
#>
function Preparation-DataDump {
    param (
        [parameter(Mandatory=$true)][string]$LogsPath
    )

    #suffix
    $PrepFileSuffix = "$($env:computername)_$('{0:yyyyMMdd}' -f (Get-Date))"

    $MSinfo32File = "msinfo32_$PrepFileSuffix"

    $((Get-Culture).Name) > "$LogsPath\lang_$PrepFileSuffix.txt"

    Write-Host "Generating msinfo32 output to file $MSinfo32File ..."
    $_param = "/nfo " + '"' + "$LogsPath\$MSinfo32File.nfo" + '"'
    start msinfo32 -ArgumentList $_param -Wait
    $_param = "/report " + '"' + "$LogsPath\$MSinfo32File.txt" + '"'
    start msinfo32 -ArgumentList $_param -Wait

    $runKeys = @(
        "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
        "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run",
        "HKLM\SOFTWARE\WOWAA32Node\Microsoft\Windows\CurrentVersion\Run",

        "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce",
        "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce",
        "HKLM\SOFTWARE\WOWAA32Node\Microsoft\Windows\CurrentVersion\RunOnce",

        "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
        "HKCU\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run",
        "HKCU\SOFTWARE\WOWAA32Node\Microsoft\Windows\CurrentVersion\Run",


        "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
        "HKCU\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce",
        "HKCU\SOFTWARE\WOWAA32Node\Microsoft\Windows\CurrentVersion\RunOnce"
    )

    if (Test-Path "$LogsPath\boot_runkeys_$PrepFileSuffix.txt")
    {
        Remove-Item "$LogsPath\boot_runkeys_$PrepFileSuffix.txt"
    }

    $runKeys | Foreach-Object {
        $_RegLoc = $_
        $_RegLocL= $_RegLoc.Substring( 4 )
        $_iex_cmd = ". reg query " + '"' + $_ + '"'
        try{
            $contents = Invoke-Expression -Command "$_iex_cmd" -ErrorAction SilentlyContinue 2>&1
        } catch {}

        if( $contents.count -ne 0 ){
            foreach( $line in $contents ){
                if( ($line.count -ge 0)              -and
                    ($line -notlike "*$($_RegLocL)") -and 
                    ($line -ne "" )                  -and 
                    ($line -match "REG_" )             ){

                    "[$($_RegLoc)]"+$line | Out-File -FilePath "$LogsPath\boot_runkeys_$PrepFileSuffix.txt" -Append -Encoding utf8
                }
            }
        }
    }
 
    $Services = get-service | where {($_.status -eq "running") -and ($_.StartType -ne "manual") -and ($_.ServiceType -match "Win32OwnProcess") }  | select name, displayname, servicename, servicetype
    $Services | Export-Csv "$LogsPath\boot_services_$PrepFileSuffix.csv" -NoTypeInformation -Encoding UTF8
 
    $Tasks = Get-ScheduledTask | where {($_.TaskPath -notmatch "\\Microsoft\\Windows") -and ($_.TaskPath -notmatch "\\Microsoft\\Office")}  | where {($_.Triggers -match "logon") -or ($_.Triggers -match "boot")} | select taskname,state,author,taskpath,description,uri
    $Tasks | Export-Csv "$LogsPath\boot_logontasks_$PrepFileSuffix.csv" -NoTypeInformation -Encoding UTF8

	# Dump Powercfg Report information
    Invoke-Expression "powercfg /SYSTEMSLEEPDIAGNOSTICS /output '$LogsPath\sleepdiag_report_$PrepFileSuffix.html'" -ErrorAction SilentlyContinue

    if( ( (powercfg /?) | select-string "/SYSTEMPOWERREPORT").LineNumber )
    {
        Invoke-Expression "powercfg /SYSTEMPOWERREPORT /output '$LogsPath\power_report_$PrepFileSuffix.html'" -ErrorAction SilentlyContinue
    }
	
}


function Preparation-Execute {
param (
[parameter(Mandatory=$true)][string]$LogsPath,
[parameter(Mandatory=$false)][string]$JSONConfig
)

    Preparation-UpdateStatus
    
    if ($JSONConfig -and (Test-Path $JSONConfig))
    {
        Write-Host "Executing system preparation ($JSONConfig)... (will reboot system)"
        $_iex_cmd = ". " + '"' + "$InvocationPath\SystemPrep.ps1" + '"' + " -logspath " + '"' + $LogsPath + '"' + " -JSON " + '"' + $JSONConfig + '"'
        iex $_iex_cmd
    }
    else
    {
        Write-Host "Executing default system preparation... (will reboot system)"
        $_iex_cmd = ". " + '"' + "$InvocationPath\SystemPrep.ps1" + '"' + " -logspath " + '"' + $LogsPath + '"'
        iex $_iex_cmd
    }

}


function Preparation-RestartComputer {

    Write-Host "Force system reboot..."
    shutdown -r -f -t 0
}


export-modulemember -Function Preparation-GetStatus
export-modulemember -Function Preparation-GetExecutionExperience 
export-modulemember -Function Preparation-DataDump
export-modulemember -Function Preparation-Execute
export-modulemember -Function Preparation-RestartComputer


# SIG # Begin signature block
# MIIPFgYJKoZIhvcNAQcCoIIPBzCCDwMCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB+D9BTr6R+YxZo
# xsasaVe9xZjRkUrHs7pYxhoi/5WdRqCCDBEwggV2MIIEXqADAgECAhMzAAAFdY/t
# ZZABUyRhAAEAAAV1MA0GCSqGSIb3DQEBCwUAMHkxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5nIFBD
# QSAyMDEwMB4XDTIzMDIxNjE4MzM0MloXDTI0MDUxNjE4MzM0MlowdDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEeMBwGA1UEAxMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAorUr
# gCj5FlJ+7vhjx+0mGUFTOka+WKbcrK7B95uaztftwdrnWN27Jslwy9AWtQJY3826
# OWRV4ajdLBVUB94DUgcw2heDY71cYIC7jcMwpwV6N8FHJN+OwTBzkAUWWwVarEPb
# 957z09miEYlJtASbQ8Sf61Beo2h0h82SRLPU4Q1F4CRN9WlXyn+6u5kulYIUUC0c
# bQP6qe+yukueASohANo9BRI/M6bAebYfvFookHLdybZdNFMo7sr1Bt6mCYdHPlyO
# sFYBXyZd+iQ3P6LQnjeZl9aFXXp6aFW88QawMKk/8ce2YTKAFG8y31/0IQWsAZw/
# iyhPJ9e9f9z8xdAWAQIDAQABo4IB+jCCAfYwPAYJKwYBBAGCNxUHBC8wLQYlKwYB
# BAGCNxUIg8+JTa3yAoWhnwyC+sp9geH7dIFPi/M4gp/5IgIBZAIBFTApBgkrBgEE
# AYI3FQoEHDAaMAwGCisGAQQBgjcKAxUwCgYIKwYBBQUHAwMwDgYDVR0PAQH/BAQD
# AgeAMB8GA1UdJQQYMBYGCCsGAQUFBwMDBgorBgEEAYI3CgMVMB0GA1UdDgQWBBTR
# /PEuPn+0r5mHo7syx14SmaNUSDAfBgNVHSMEGDAWgBS/ZaKrb3WjTkWWVwXPOYf0
# wBUcHDBcBgNVHR8EVTBTMFGgT6BNhktodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUZXN0aW5nJTIwUENBJTIwMjAxMCgxKS5j
# cmwwaQYIKwYBBQUHAQEEXTBbMFkGCCsGAQUFBzAChk1odHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRlc3RpbmclMjBQQ0El
# MjAyMDEwKDEpLmNydDBDBgkrBgEEAYI3FAIENh40AE0AUwBJAFQAVABlAHMAdABD
# AG8AZABlAFMAaQBnAG4AaQBuAGcAUwBoAGEAMgAtAEMAUzAMBgNVHRMBAf8EAjAA
# MA0GCSqGSIb3DQEBCwUAA4IBAQAg7Ej3KuUo0ndCL+pCb2eqn8rz77O2j90YQr2Y
# MhMsinWGq1OTp3LZfPNeI3G2BXFtvjIE++ZXjLRa/bnReVrq2p/PikV7zq0WpWzS
# gb1TBvmg80mt7Pgq/RcuNfBlO5t1wRKnmmoR3zZLHmJrXCKKSL55CyL2ZYvi+ilO
# UgcBn4E7fTGAGr41x2aKt7BhnUbiYaVwGdyYKnJv9q+6AC+fI7xnoX2mbO63zWl8
# Se9LfD7P4S/03jwAafqPiHXgkAmw4cgsK4kX9pTS/sYb336dvlilbmcAhtGf1cQ0
# /5h279IUhQb53WulhCAZ3H42KxtetiyNi8MNLoEWK9wh/hb2MIIGkzCCBHugAwIB
# AgITMwAAAC01ekaIyQdx2AAAAAAALTANBgkqhkiG9w0BAQsFADCBkDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE6MDgGA1UEAxMxTWljcm9zb2Z0
# IFRlc3RpbmcgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMDEy
# MTAyMDQzMjBaFw0zNTA2MTcyMTA0MTFaMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv
# ZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5nIFBDQSAy
# MDEwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvzxggau+7P/XF2Py
# pkLRE2KcsBfOukYaeyIuVXOaVLnG1NHKmP53Rw2OnfBezPhU7/LPKtRi8ak0CgTX
# xQWG8hD1TdOWCGaF2wJ9GNzieiOnmildrnkYzwxj8Br/gampQz+pC7lR8bNIOvxE
# Ll8RxVY6/8oOzYgIwf3H1fU+7+pOG3KLI71FN54fcMGnybggc+3zbD2LIQXPdxL+
# odwH6Q1beAlsMlUQR9A3yMf3+nP+RjTkVhaoN2RT1jX7w4C2jraGkaEQ1sFK9uN6
# 1BEKst4unhCX4IGuEl2IAV3MpMQoUpxg8ArmiK9L6VeK7KMPNx4p9l0h09faXQ7J
# TtuNbQIDAQABo4IB+jCCAfYwDgYDVR0PAQH/BAQDAgGGMBIGCSsGAQQBgjcVAQQF
# AgMBAAEwIwYJKwYBBAGCNxUCBBYEFOqfXzO20F+erestpsECu0A4y+e1MB0GA1Ud
# DgQWBBS/ZaKrb3WjTkWWVwXPOYf0wBUcHDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/
# BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2Nz
# L1JlcG9zaXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1Ud
# EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUowEEfjCIM+u5MZzK64V2Z/xltNEwWQYD
# VR0fBFIwUDBOoEygSoZIaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwv
# cHJvZHVjdHMvTWljVGVzUm9vQ2VyQXV0XzIwMTAtMDYtMTcuY3JsMIGNBggrBgEF
# BQcBAQSBgDB+ME0GCCsGAQUFBzAChkFodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpL2NlcnRzL01pY1Rlc1Jvb0NlckF1dF8yMDEwLTA2LTE3LmNydDAtBggrBgEF
# BQcwAYYhaHR0cDovL29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMA0GCSqGSIb3
# DQEBCwUAA4ICAQAntNCFsp7MD6QqU3PVbdrXMQDI9v9jyPYBEbUYktrctPmvJuj8
# Snm9wWewiAN5Zc81NQVYjuKDBpb1un4SWVCb4PDVPZ0J87tGzYe9dOJ30EYGeiIa
# aStkLLmLOYAM6oInIqIwVyIk2SE/q2lGt8OvwcZevNmPkVYjk6nyJi5EdvS6ciPR
# mW9bRWRT4pWU8bZIQL938LE4lHOQAixrAQiWes5Szp2U85E0nLdaDr5w/I28J/Z1
# +4zW1Nao1prVCOqrosnoNUfVf1kvswfW3FY2l1PiAYp8sGyO57GaztXdBoEOBcDL
# edfcPra9+NLdEF36NkE0g+9dbokFY7KxhUJ8WpMiCmN4yj9LKFLvQbctGMJJY9Ew
# HFifm2pgaiaafKF1Gyz+NruJzEEgpysMo/f9AVBQ/qCdPQQGEWp3QDIaef4ts9QT
# x+RmDKCBDMTFLgFmmhbtUY0JWjLkKn7soz/LIcDUle/p5TiFD4VhfZnAcvYQHXfu
# slnyp+yuhWzASnAQNnOIO6fc1JFIwkDkcM+k/TspfAajzHooSAwXkrOWrjRDV6wI
# 0YzMVHrEyQ0hZ5NnIXbL3lrTkOPjf3NBu1naSNEaySduStDbFVjV3TXoENEnZiug
# JKYSwmhzoYHM1ngipN5rNdqJiK5ukp6E8LDzi3l5/7XctJQY3+ZgHDJosjGCAlsw
# ggJXAgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# IzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5nIFBDQSAyMDEwAhMzAAAFdY/tZZAB
# UyRhAAEAAAV1MA0GCWCGSAFlAwQCAQUAoIGcMBkGCSqGSIb3DQEJAzEMBgorBgEE
# AYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJ
# BDEiBCAhhCYvRBboN4BEPgmRBiAOITgP8eHSgV2f9w8ZbmcdjjAwBgorBgEEAYI3
# AgEMMSIwIKAegBwAUwBTAEMAXABXAGkAbgBSAFQATQBwAGIAbABkMA0GCSqGSIb3
# DQEBAQUABIIBAGqC/ZVJORNRmUoJgChT0ttqOlrZeHWOVkBS/h4VEjU7vS3xSXzW
# UDWWTB7tiLHqmJ/f2eCZNLkL05gef2HkIlPwIYTR65LiQXf7kpqK+/5zEdmzsv53
# gtuGBWht5pT/OQuLVchPz8GOgoUYIkR5QQ161Y0iknAOHwym4RlFw2pC7GTTAWe3
# nz6W2P4xZY2O9M/iC4Mg09VLLdDKt5TP6p7oEeZORkXk9xkdOA75+BVfFRTEzcFA
# Mtiz76fIexvMYCBRiDDXHkjYdZE/92OZGmTGTI6/y+h9qeDDzO4YdFsL+2lObKNp
# 74D/TLAilBfWGoaeZsHzWkmBErKLDZWspxY=
# SIG # End signature block
