functions/Collection.ps1

function Get-Autoruns()
{
    [CmdletBinding(SupportsShouldProcess=$True)]
    param(
        [string[]] $ComputerName,
        [string] $ComputerList,
        [string] $OutputPath,
        [switch] $NoRemoteRegistry = $false
    )

    $Function = $MyInvocation.MyCommand
    Write-Verbose "Entering $Function"

    $returnobject = @()
    $RemoteRegistryStarted = $false
    $WhatIfPassed = $false

    Write-Verbose "Using PsExec and Autorunsc.exe for collecting the logs."

    $targets = Get-Target -ComputerList:$(if ($ComputerList){$ComputerList}) -ComputerName:$(if ($ComputerName){$ComputerName})

    if ($PSBoundParameters.ContainsKey('whatif') -and $PSBoundParameters['whatif'])
    {
        $WhatIfPassed = $true
    }
    Write-Verbose "whatif: $WhatIfPassed"

    # without OutputPath given by user, use current dir
    if ($OutputPath)
    {
        if (!(test-path $OutputPath))
        {
            $Status = "fail"
            $Reason = "Path $OutputPath not reachable"

            $returnobject += New-PowerSponseObject -Function $Function -Status $Status -Reason $Reason
            $returnobject

            Write-Verbose "Leaving $($MyInvocation.MyCommand)"
            return
        }
    }
    else
    {
        $OutputPath = $pwd
    }

    Write-Verbose "Using OutputPath $OutputPath"

    foreach ($target in $targets)
    {
        Write-Progress -Activity "Running $Function" -Status "Checking connection to $target..."
        $IsLocalhost = ($target -match "localhost")

        if(!$IsLocalhost -and !$WhatIfPassed -and !(Test-Connection $target -count 1 -quiet))
        {
            $Status = "fail"
            $Reason = "$target offline"
            $returnobject += New-PowerSponseObject -Function $Function -Status $Status -Reason $Reason -ComputerName $target
            Continue
        }

        # Enable and start RemoteRegistry if not already done by other functions
        if ($NoRemoteRegistry -or $IsLocalhost)
        {
            $RemoteRegistryStarted = $true
        }
        else
        {
            try
            {
                # Enable RemoteRegistry for psexec
                $err = Enable-RemoteRegistry -method external -ComputerName $target -WhatIf:$WhatIfPassed -OnlineCheck:$false
                $returnobject += $err
                $srr = Start-Service -ComputerName $target -method external -Name "RemoteRegistry" -WhatIf:$WhatIfPassed -OnlineCheck:$false
                $returnobject += $srr
                $RemoteRegistryStarted = ($srr.status -match "pass")
            }
            catch
            {
                $Status = "fail"
                $Reason = "Error while enabling RemoteRegistry"
                $returnobject += New-PowerSponseObject -Function $Function -Status $Status -Reason $Reason
                Continue
            }
        } # Enabling RemoteRegistry

        if ($WhatIfPassed)
        {
            $RemoteRegistryStarted = $true
        }

        if ($pscmdlet.ShouldProcess($target, "Collecting autoruns"))
        {

            if ($RemoteRegistryStarted)
            {
                Write-Progress -Activity "Running $Function" -Status "Run autorunsc on $target..."
                # run psexec with autoruns
                #
                if ($IsLocalhost)
                {
                    $AutorunsResult = (Start-Process -Binary $ModuleRoot\bin\autorunsc.exe -CommandLine "-nobanner -accepteula -a * -c -h -s *")
                }
                else
                {
                    $AutorunsResult = (Start-Process -Binary PsExec.exe -CommandLine "-accepteula -nobanner \\$target -s -c -f $ModuleRoot\bin\autorunsc.exe -nobanner -accepteula -a * -c -h -s *")
                }

                if ($AutorunsResult.exitcode -eq 0)
                {
                    # replace null bytes
                    $AutorunsResult =  $AutorunsResult.stdout -replace "`0",""

                    if ($target -match "localhost")
                    {
                        $FileName = "$($env:COMPUTERNAME)_v000.csv"
                    }
                    else
                    {
                        $FileName = "$($target)_v000.csv"
                    }

                    $FilePath = "$($OutputPath)\$FileName"
                    Write-Verbose "Write file $FilePath"

                    try
                    {
                        Set-Content -value $AutorunsResult -path $FilePath -ea stop
                        $Status = "pass"
                        $Reason = "$OutputPath;$FileName"
                    }
                    catch [UnauthorizedAccessException]
                    {
                        $Status = "fail"
                        $Reason = "Error while writing to $FilePath - PermissionDenied"
                    }
                    catch
                    {
                        $Status = "fail"
                        $Reason = "Error while writing to $FilePath"
                    }
                } # psexec returns ok
                else
                {
                    $Status = "fail"
                    $Reason = "Error running autoruns on $target. Could be due to permissions."
                }
            } #RemoteRegistryStarted true
            else
            {
                $Status = "fail"
                $Reason = "Error while enabling RemoteRegistry"
            }
        } #without whatif
        else
        {
            $Status = "pass"
            $Reason = "Not executed - started with -WhatIf"
        } #whatif used

        # Stop and Disable RemoteRegistry
        if (!$IsLocalhost -and (!$NoRemoteRegistry -and $RemoteRegistryStarted) -or (!$NoRemoteRegistry -and $WhatIfPassed))
        {
            try
            {
                Write-Verbose "Cleanup RemoteRegistry"
                $srr = Stop-Service -ComputerName $target -method external -Name "RemoteRegistry" -WhatIf:$WhatIfPassed -OnlineCheck:$false
                $returnobject += $srr
                $drr = Disable-RemoteRegistry -method external -ComputerName $target -WhatIf:$WhatIfPassed -OnlineCheck:$false
                $returnobject += $drr
            }
            catch
            {
                $Status = "fail"
                $Reason = "Error while disabling RemoteRegistry"
            }
        }

        $returnobject += New-PowerSponseObject -Function $Function -ComputerName $target -Arguments $Arguments -Status $Status -Reason $Reason

    } # foreach target

    # returnobject with all powersponse objects
    $returnobject

    Write-Verbose "Leaving $($MyInvocation.MyCommand)"

} # Get-Autoruns

function Get-Sysmon()
{
    # todo
    # Use existing sysmon collection script
}