Configurations/PowerShellLab/PostSetup/Install-Sysinternals.ps1

#requires -version 5.1

<#
Download Sysinternals tools from web to a local folder in a VM
 
  ****************************************************************
  * DO NOT USE IN A PRODUCTION ENVIRONMENT UNTIL YOU HAVE TESTED *
  * THOROUGHLY IN A LAB ENVIRONMENT. USE AT YOUR OWN RISK. IF *
  * YOU DO NOT UNDERSTAND WHAT THIS SCRIPT DOES OR HOW IT WORKS, *
  * DO NOT USE IT OUTSIDE OF A SECURE, TEST SETTING. *
  ****************************************************************
#>



[CmdletBinding(DefaultParameterSetName="VM")]
Param(
    [Parameter(Mandatory,ParameterSetName='VM')]
    #specify the name of a VM
    [string]$VMName,
    [Parameter(Mandatory,ParameterSetName='VM')]
    #Specify the user credential
    [PSCredential]$Credential,
    [Parameter(Mandatory,ParameterSetName="session")]
    #specify an existing PSSession object
    [System.Management.Automation.Runspaces.PSSession[]]$Session
)

Try {
    if ($PSCmdlet.ParameterSetName -eq 'VM') {
        Write-Host "Creating PSSession to $VMName" -ForegroundColor cyan
        $session = New-PSSession @PSBoundParameters -ErrorAction stop
    }

    $sb = {
        [string]$Destination = "C:\SysInternals"
        if (-Not (Test-Path $Destination)) {
            new-Item -Path $Destination -ItemType Directory
        }

        #start the WebClient service if it is not running
        if ((Get-Service WebClient).Status -eq 'Stopped') {
             Write-host "Starting WebClient" -ForegroundColor Magenta
             #always start the webclient service even if using -Whatif
             Start-Service WebClient -WhatIf:$false
             $Stopped = $True
        }
        else {
            <#
             Define a variable to indicate service was already running
             so that we don't stop it. Making an assumption that the
             service is already running for a reason.
            #>

            $Stopped = $False
        }

        Write-Host "Updating Sysinternals tools from \\live.sysinternals.com\tools to $destination" -ForegroundColor Cyan

        Get-ChildItem -path \\live.sysinternals.com\tools -file | Copy-Item -Destination $Destination -PassThru

        <#
        alternative but this might still copy files that haven't
        really changed
        Robocopy \\live.sysinternals.com\tools $destination /MIR
        #>


        if ( $Stopped ) {
            Write-host "Stopping web client" -ForegroundColor Magenta
            #always stop the service even if using -Whatif
            Stop-Service WebClient -WhatIf:$False
        }

        Write-Host "Sysinternals Update Complete" -ForegroundColor Cyan
        }

       Invoke-Command -ScriptBlock $sb -Session $session

       if ($PSCmdlet.ParameterSetName -eq 'VM') {
            Write-Host "Removing PSSession" -ForegroundColor cyan
            $Session | Remove-PSSession
        }
}
Catch {
    Throw $_
}