Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This is the thirdin third in a series of articles giving extended example of how to use the RestAPI. This article will demonstrate how to generate a report equivalent to the Version 3 "OutputUsers" view using PowerShell.

You can download the latest version of the file: OutputUsers.ps1, and simply customise the $user, $pass and $sonar values and it should run in your environment

Fields in the original report

...

Build the CSV file header row

PowerShell has a number of built in libraries for handling output to various file formats. For this example we will be saving the results in a CSV file that can be viewed directly in EXCEL or imported into other databases.


Code Block
languagepowershell
themeMidnight
titleDefine columns
# Build the CSV File header row
$csv = @()
$row = New-Object System.Object

# email and ModuleName will always be NULL. Omit if not needed for backwards compatibility
$row | Add-Member -MemberType NoteProperty -Name "Account" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "eMail" -Value $null		
$row | Add-Member -MemberType NoteProperty -Name "UserID" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "SoftwareName" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "ModuleName" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "ApplicationID" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "DeviceID" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "Role" -Value $null

...

Code Block
languagepowershell
themeMidnight
titleInner and Outer loops
$offset = 1				# offset
$seen   = 1;			# first offset is 1, not 0
while ( $seen -lt $appCount)
{
	$url = -join ("http://", $sonar, "/api/v1/applications/?offset=", $offset,  "&fetch_size=", $fs)
	$applications = Invoke-RestMethod $url -Credential $credential
	$i = 1
	while ($i -lt $applications.count)
	{
        $thisApplication = $applications[$i]
		$currApp = Invoke-RestMethod $thisApplication.self -Credential $credential
		$usercount = $currApp.users.count
		
		if ($usercount -gt 0)
		{
			$appid = $currApp.application_id
			$deviceid = $currApp.devices[0].device_id
			$SoftwareName = $currApp.product.name
			$k = 0
			while ( $k -lt $usercount)
			{
				$row = New-Object System.Object
				$row | Add-Member -MemberType NoteProperty -Name "Account" -Value $currApp.users[$k].user_name
				$row | Add-Member -MemberType NoteProperty -Name "UserID" -Value $currApp.users[$k].user_name
				$row | Add-Member -MemberType NoteProperty -Name "SoftwareName" -Value $SoftwareName
				$row | Add-Member -MemberType NoteProperty -Name "ApplicationID" -Value $appid
				$row | Add-Member -MemberType NoteProperty -Name "DeviceID" -Value $deviceid
				$row | Add-Member -MemberType NoteProperty -Name "Role" -Value $currApp.users[$k].user_role
				$csv += $row	
				$k = $k + 1			
			}
		}
 
		$i = $i + 1;		# keep track for inner loop
		$seen = $seen + 1;  # keep track for outer loop
		if ( $seen % 10 -eq 0) {
			# progress indicator - display a "." every 10 devices
			write-host "." -nonewline
		}
	}
	# Finished this batch
	$offset = $seen
}
write-host " Done. Saving output to OutputUsers.csv now."
# Since we always insert all the columns in the same order, we don't need to insert the code to force an ordering here unless you NEED the empty columns
$csv | Export-csv OutputUsers.csv -NoTypeInformation		# We will further refine this line later

As this report has a smaller number of columns and requires simpler logic, that's all we need to do.

Code Block
languagepowershell
themeMidnight
titleCompleted Script
collapsetrue
#
# Output Users
# Generate OutputDevices equivalent report via RestAPI
# Version 1.00	2018-10-11	First version
#

# Change these values to suit your location
$user    = "admin"
$pass    = "your password"
$sonar	 = "your iQSonar Host"
# Optional - UPDATE THIS FOR YOUR SITE
$fs     = 100			# fetch_size

# Connect to RestAPI and count number of Applications
$secpass = ConvertTo-SecureString $pass -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($user,$secpass)
$uri     = -join ("http://", $sonar, "/api/v1/applications/?offset=1&fetch_size=1")
$r = Invoke-WebRequest $uri -Credential $credential
# $r.headers has HTML headers, $r.content has text content
$appCount = $r.headers.'X-fetch-count'
# Let the user know how many devices we can see
$output = -join ( "There are: ", $appCount, " applications in total")

# Build the CSV File header row
$csv = @()
$row = New-Object System.Object

# Build the CSV File header row
$csv = @()
$row = New-Object System.Object
 
# email and ModuleName will always be NULL. Omit if not needed for backwards compatibility
$row | Add-Member -MemberType NoteProperty -Name "Account" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "eMail" -Value $null      
$row | Add-Member -MemberType NoteProperty -Name "UserID" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "SoftwareName" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "ModuleName" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "ApplicationID" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "DeviceID" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "Role" -Value $null

$offset = 1             # offset
$seen   = 1;            # first offset is 1, not 0
while ( $seen -lt $appCount)
{
    $url = -join ("http://", $sonar, "/api/v1/applications/?offset=", $offset,  "&fetch_size=", $fs)
    $applications = Invoke-RestMethod $url -Credential $credential
    $i = 1
    while ($i -lt $applications.count)
    {
        $thisApplication = $applications[$i]
		$currApp = Invoke-RestMethod $thisApplication.self -Credential $credential
		$usercount = $currApp.users.count
		
		if ($usercount -gt 0)
		{
			$appid = $currApp.application_id
			$deviceid = $currApp.devices[0].device_id
			$SoftwareName = $currApp.product.name
			$k = 0
			while ( $k -lt $usercount)
			{
				$row = New-Object System.Object
				$row | Add-Member -MemberType NoteProperty -Name "Account" -Value $currApp.users[$k].user_name
				$row | Add-Member -MemberType NoteProperty -Name "UserID" -Value $currApp.users[$k].user_name
				$row | Add-Member -MemberType NoteProperty -Name "SoftwareName" -Value $SoftwareName
				$row | Add-Member -MemberType NoteProperty -Name "ApplicationID" -Value $appid
				$row | Add-Member -MemberType NoteProperty -Name "DeviceID" -Value $deviceid
				$row | Add-Member -MemberType NoteProperty -Name "Role" -Value $currApp.users[$k].user_role
				$csv += $row
				$k = $k + 1
			}
		}
 
        $i = $i + 1;        # keep track for inner loop
        $seen = $seen + 1;  # keep track for outer loop
        if ( $seen % 10 -eq 0) {
            # progress indicator - display a "." every 10 devices
            write-host "." -nonewline
        }
    }
    # Finished this batch
    $offset = $seen
}
write-host " Done. Saving output to OutputUsers.csv now."
$csv | Export-csv OutputUsers.csv -NoTypeInformation


What might be useful to add?

This script duplicates the output from the Version 3 report as closely as possible. 
It might be useful to include the device hostname ($currApp.devices[0].host_name) or the application name (usually Instance name for MS SQL or database name for Oracle for example, found in $currApp.name) as columns in the spreadsheet.