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 10 -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
                                                
                }
                                                
                if ($result -and $result.rows)
                                                
                    {
                                                
                    $results = $results + $result
                                                
                    }
                                                
            }
                                                
            [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
                                                
     $Data2 = QueryData $False $Token "&action=hosts&which=get_host_scan_results&device_id=14&dir=ASC&dir=ASC&insecure=true&patched=true"
                                                
    $Data2 | Format-Table -Property product_name, version, state, vuln_id, vuln_title
                                                
    }