Skip to content

Latest commit

 

History

History
99 lines (82 loc) · 5.15 KB

README.md

File metadata and controls

99 lines (82 loc) · 5.15 KB

Build Status codecov version downloads PSScriptAnalyzer Codacy Security Scan DevSkim

PSRedstone is a module used to streamline the installation of Windows applications. It includes a Redstone class, which is the core building block for the included functions. It is designed to be lightweight and easy to deploy. While I use MECM for my CM tool, you should be able to use PSRedstone with whatever tool you choose.

Why did I name this module Redstone? It should go without saying that I'm a fan of Minecraft. The simplicity of the game and how far you can push things into automation, even without any mods, is quite enthralling. Obviously, mining redstone is the first step to building more elaborate creations in Minecraft. I believe that using PSRedstone will be a good first step to building more elaborate, yet simple, deployment packages.

Quick Start

Start with a settings.json file and a very basic configuration:

{
    "Publisher": "Mozilla",
    "Product": "Firefox RR",
    "Version": "1.2.3",
    "Installer": {
        "UserName": "VertigoRay",
        "CompanyName": "PSRedstone & Co.",
        "SerialNumber": "bfa7409e-485c-45cf-bd42-1652c2c84e17"
    }
}

ℹ: The version should be injected/updated via automated processes, but we statically defined it for this example.

You just need a Redstone Block ( ͡° ͜ʖ ͡°) at the top of your script to use the module:

#region Redstone Block
#Requires -Modules PSRedstone
$redstone, $settings = New-Redstone
#endregion Redstone Block

Using that, we can create a simple install.ps1 for the installer:

<#
MECM Install Command:
    powershell.exe -Exe Bypass -Win Hidden -NoP -NonI -File install.ps1
#>
#Requires -Modules PSRedstone
$redstone, $settings = New-Redstone

Write-Information ('{3}ing {0} {1} {2} ...' -f $redstone.Publisher, $redstone.Product, $redstone.Version, (Get-Culture).TextInfo.ToTitleCase($redstone.Action))

$invokeMSI = @{
    'Action' = 'Install'
    # Obviously, Firefox doesn't require these advanced install options.
    # This is just for show ...
    'Parameters' = @(
        "USERNAME=`"$($settings.Installer.UserName)`"",
        "COMPANYNAME=`"$($settings.Installer.CompanyName)`"",
        "SERIALNUMBER=`"$($settings.Installer.SerialNumber)`""
    )
}

if ([System.Environment]::Is64BitOperatingSystem) {
    Invoke-RedstoneMsi @invokeMSI -Path 'FirefoxSetup32and64Bit.msi'
} else {
    Invoke-RedstoneMsi @invokeMSI -Path 'FirefoxSetup32Bit.msi'
}

ℹ: Redstone will automatically parse the settings.json file, because it exists. The settings.json data is in the class, but we create you a $settings variable as well.

  • $Redstone.Publisher: taken directly from the root key in the settings.json.
  • $Redstone.Product: taken directly from the root key in the settings.json.
  • $Redstone.Version: taken directly from the root key in the settings.json; this would normally be injected into the file during the set up of the MECM Package Source files.
  • $Redstone.Action: taken directly from the filename of the script; in this case the Action is "install" taken from install.ps1.
    • We use Get-Culture to capitalize the first letter and make it "Install".

Given the above details, the output of Write-Information will be:

Installing Mozilla Firefox RR 1.2.3 ...

The Invoke-RedstoneMsi will call the msiexec silently by default and provide a standardized location for the MSI log file under C:\Windows\Logs.

The goal has been achieved: a simplified install script with predictable results.

ℹ: Check out the Advanced Start wiki for more assistance getting started.