Sample PowerShell Code to Get Host Details

This Appendix section attached the sample codes to receive the Software Vulnerability Host Details as shown below:

Sample PowerShell Code

#

#Fetch Host Details

#

$Site = ( "Account", "https://csi7.secunia.com/csi/api/","username=User_Name&password=*******")

$global:QueryLimit = 10000

$global:WebServiceHeader = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"

$global:WebServiceHeader.Add("Content-Type", 'application/x-www-form-urlencoded')

$global:URL = $Site[1]

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$global:ErrorArray = @()

 

function GetData ($URL, $Retry, $Post, $Body)

{

    $result = @()

    $Count = 0

    while ($Count -lt $Retry)

    {

        try

        {

            $Count++

            if ($Post)

            {

                $result = Invoke-RestMethod -Uri $URL -Method Post -Headers $global:WebServiceHeader -Body $Body  -WebSession $global:Session

            }

            else

            {

                $result = Invoke-RestMethod $URL -Method Get -Headers $global:WebServiceHeader -TimeoutSec 5 -WebSession $global:Session

            }

            $result.data

            $Count = $Retry

        }

        catch

        {

            Start-Sleep -s 2

            if ($Count -eq $Retry)

            {

                $global:ErrorArray += ("Error GetData " + $URL + " " +  $_.Exception.Message + " " + $_.Exception.ItemName+ " " + $_.Exception.Status + " " + $_.Exception.Response)

                Write-Host "Timeout Exceeded and Exhausted Retries" -ForegroundColor Red

            }

            else

            {

                Write-Host "Timeout Exceeded -- will retry in 2 sec" -ForegroundColor Yellow

            }

        }

    }

    return $result

}

 

function QueryData ($Post, $Token, $URL, $Body)

{

    # Get First Page of results (25 items)

    [int] $Start = 0

    [int] $Limit = 11

    [int] $CurrentTotal = -1

    $Total = 0

    $results = @()

    while ($CurrentTotal -lt $Total)

    {

        $CurrentTotal = $CurrentTotal + $Limit

        

        $FullURLGet = $global:URL + "?uid=" + $Token + $URL + "&start=" + [string]$Start + "&limit=" + [string]$Limit

        $FullURLPut = $global:URL + "?uid=" + $Token + $URL

        $BodyFull =  $Body + "&start=" + [string]$Start + "&limit=" + [string]$Limit

        try

        {

            if ($Post)

            {

                $result = GetData $FullURLPut 5 $Post $BodyFull

                if ($result)

                {

                    $results = $results + $result

                }

            }

            else

            {

                $result = GetData $FullURLGet 5 $Post $Body

                if ($result.rows)

                {

                    $results = $results + $result.rows

                }

            }

            [string]$TotalString = $result.total;

            $Total = [int]$TotalString.Trim(" ");

            

            if ($results.Count -gt $global:QueryLimit)

            {

                break;

            }

        }

        catch

        {  

            $global:ErrorArray += ("Error QueryData2 " + $result.next + " " +  $_.Exception.Message + " " + $_.Exception.ItemName)

            return $results

        }

        $Start = $Start + $Limit

    }

    $results = $results | ? {$_}

    return $results

}

 

function GetUserToken ($Cred)

{

    $Data =  Invoke-WebRequest -Uri ($global:URL + "?action=manuallogin") -Body $Cred -Method Post -Headers $global:WebServiceHeader -SessionVariable 'global:Session'

    if ($Data.StatusCode -eq 200)

    {

        $Response = ConvertFrom-Json $Data.Content

        return $Response.uid

    }

    return ""

}

 

$Token = GetUserToken $Site[2]

if (![string]::IsNullOrWhiteSpace($Token))

{

    $Data = QueryData $False $Token "&action=smart_groups&which=getSmartGroupContents&smartGroupTextType=host&smartGroupId=1"

    $Count = 0

    $Data | Format-Table -Property host_name, num_insecure, num_eol, num_patched, num_installations, nsi_device_id, score

 

    $Body = "device_id=1182" + "&dir=ASC" + "&eol=true" + "&insecure=true"  + "&patched=true"

    $Data2 = QueryData $True $Token "&action=hosts&which=get_host_scan_results" $Body

    $Data2.data | Format-Table -Property product_name, version, state, vuln_id, vuln_title

}