###########################################################################################################################
# This script will create an Excel file to auto document Ivanti Automation
# It will create individual worksheets in the Excel file for:
# *Runbooks
# *Projects
# *Modules
# *Tasks
# *Parameters
# Usage:
# All you need to do is export the BuildingBlock from Ivanti Automation . After the Export you can run this script against the created XML file.
#
# Example:
# Invoke-IVA-Documentation -exportpath "C:\\Temp" -BB "C:\\Temp\\runbook.xml" -excel "C:\\Temp\\runbook.xlsx" -CSV
# This will turn the buildingblock xml into an Excel file and create CSV\'s from each worksheet.
#
# Example2:
# Invoke-IVA-Documentation -exportpath "C:\\Temp" -BB "C:\\Temp\\runbook.xml" -excel "runbook.xlsx"
# This will do the same as the first example except without creating CSV files.
#
# Example3:
# Invoke-IVA-Documentation -exportpath "C:\\Temp" -BB "C:\\Temp\\runbook.xml" -excel "runbook.xlsx" -CSVSQL -CSVDelimiter ";" -SQLServer "DATABASE01\\INSTANCE01"
# This will do the same as the first example including importing the data in a SQL database "IVAMDOC".
#############################################################################################################################
function Invoke-IVA-Documentation {
[CmdletBinding()]
param (
[Parameter(Mandatory = $True)]
[string]$ExportPath,
[string]$BB,
[string]$Excel,
[Parameter(Mandatory = $false)]
[switch]$CSV,
[switch]$CSV2SQL,
[string]$CSVDelimiter,
[string]$SQLServer
)
### Get descriptions Ivanti Automation.
$workingdir = $exportpath
$Output = $Excel
$XML = $BB
[xml]$xml = Get-Content "$XML"
$Excelfile = "$workingdir\\$Output"
### Set database info for importing in SQL
$DBName = "IVAMDOC"
$Delimiter = $CSVDelimiter
$SQLInstance = $SQLServer
$RunbookCSVFile = "$workingdir\\runbook.csv"
if (Test-Path $RunbookCSVFile) { Remove-Item -Path $RunbookCSVFile }
$RunbookJobsCSVFile = "$workingdir\\runbookjobs.csv"
if (Test-Path $RunbookJobsCSVFile) { Remove-Item -Path $RunbookJobsCSVFile }
$ProjectCSVFile = "$workingdir\\project.csv"
if (Test-Path $ProjectCSVFile) { Remove-Item -Path $ProjectCSVFile }
$ProjectModuleCSVFile = "$workingdir\\projectmodule.csv"
if (Test-Path $ProjectModuleCSVFile) { Remove-Item -Path $ProjectModuleCSVFile }
$ModulesCSVFile = "$workingdir\\modules.csv"
if (Test-Path $ModulesCSVFile) { Remove-Item -Path $ModulesCSVFile }
$TasksCSVFile = "$workingdir\\tasks.csv"
if (Test-Path $TasksCSVFile) { Remove-Item -Path $TasksCSVFile }
$ParametersCSVFile = "$workingdir\\parameters.csv"
if (Test-Path $ParametersCSVFile) { Remove-Item -Path $ParametersCSVFile }
if (Test-Path $Excelfile) { Remove-Item -Path $Excelfile }
$EXmodule = Get-Module psexcel
if (!$EXmodule) {
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -scope CurrentUser
Install-Module PSExcel -Force -Scope CurrentUser
}
Import-Module PSExcel -Force
## If CSV2SQL enabled, check whether database $DBName exists on SQL instance $SQLInstance. If so, delete the database, and create a fresh one.
if ($CSV2SQL) {
$DBAmodule = Get-Module dbatools
if (!$DBAmodule) {
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -scope CurrentUser
Install-Module dbatools -Force -Scope CurrentUser
}
Import-Module dbatools -Force
$ExistingDB = Find-DbaDatabase -SqlInstance . -Pattern $DBName -Exact | Select-Object -ExpandProperty Name
if ($ExistingDB -eq $DBName) {
Remove-DbaDatabase -SqlInstance $SQLInstance -Database $DBName -Confirm:$false
}
New-DbaDatabase -SqlInstance $SQLInstance -Name $DBName
}
## Get information about the runbooks
$Runbooks = $xml.AutomationManager.buildingblock.runbooks.runbook.properties
$Runbooktable = @()
$Runbooktotal = @()
foreach ($Runbook in $Runbooks) {
#DATA CSV
$runbooktable = New-Object PSobject
$runbooktable | Add-Member -Type NoteProperty -Name Name -Value $runbook.name
$runbooktable | Add-Member -Type NoteProperty -Name Guid -Value $runbook.guid
$runbooktable | Add-Member -Type NoteProperty -Name Enabled -Value $runbook.enabled
$runbooktable | Add-Member -Type NoteProperty -Name Description -Value $runbook.description
$runbooktable | Add-Member -Type NoteProperty -Name Projects -Value $runbook.properties.jobs.job.count
$Runbooktotal += $Runbooktable
}
if ($CSV -or $CSV2SQL) {
$Runbooktotal | Export-Csv -Append -NoTypeInformation -Delimiter \';\' -Path $RunbookCSVFile
if ($CSV2SQL) {
Import-DbaCsv -Path $RunbookCSVFile -SqlInstance $SQLInstance -Database $DBName -Delimiter $Delimiter -AutoCreateTable
}
}
$Runbooktotal | Export-XLSX -Path $Excelfile -AutoFit -Table -TableStyle Medium2 -WorksheetName "Runbooks"
## Get information about the jobs in the runbook(s)
$Runbooks = $xml.AutomationManager.buildingblock.runbooks.runbook.properties
$RunbookJobstable = @()
$RunbookJobstotal = @()
foreach ($Runbook in $Runbooks) {
$order = 0
$jobs = $Runbook.properties.jobs
foreach ($job in $jobs) {
$a = $jobs.job
foreach ($i in $a) {
$order = $order + 1
#DATA CSV
$runbookjobstable = New-Object PSobject
$runbookjobstable | Add-Member -Type NoteProperty -Name RunbookGuid -Value $runbook.guid
$runbookjobstable | Add-Member -Type NoteProperty -Name Order -Value $order
$runbookjobstable | Add-Member -Type NoteProperty -Name Guid -Value $i.properties.what.innertext
$runbookjobstable | Add-Member -Type NoteProperty -Name Name -Value $i.properties.name
$runbookjobstable | Add-Member -Type NoteProperty -Name Enabled -Value $i.properties.enabled
$runbookjobstable | Add-Member -Type NoteProperty -Name JobType -Value $i.properties.what.type
$RunbookJobstotal += $RunbookJobstable
}
}
}
if ($CSV -or $CSV2SQL) {
$RunbookJobstotal | Export-Csv -Append -NoTypeInformation -Delimiter \';\' -Path $RunbookJobsCSVFile
if ($CSV2SQL) {
Import-DbaCsv -Path $RunbookJobsCSVFile -SqlInstance $SQLInstance -Database $DBName -Delimiter $Delimiter -AutoCreateTable
}
}
$RunbookJobstotal | Export-XLSX -Path $Excelfile -AutoFit -Table -TableStyle Medium2 -WorksheetName "RunbookJobs"
## Get information about Projects, if there is any
$Projects = $xml.AutomationManager.buildingblock.projects.project.properties
$Projecttable = @()
$Projecttotal = @()
if ($Projects.count -gt 0)
{
foreach ($Project in $Projects) {
#DATA CSV
$Projecttable = New-Object PSobject
$Projecttable | Add-Member -Type NoteProperty -Name Name -Value $Project.name
$Projecttable | Add-Member -Type NoteProperty -Name Guid -Value $Project.guid
$Projecttable | Add-Member -Type NoteProperty -Name Enabled -Value $Project.enabled
$Projecttable | Add-Member -Type NoteProperty -Name Description -Value $Project.description
$Projecttotal += $Projecttable
}
if ($CSV -or $CSV2SQL) {
$Projecttotal | Export-Csv -Append -NoTypeInformation -Delimiter \';\'-Path $ProjectCSVFile
if ($CSV2SQL) {
Import-DbaCsv -Path $ProjectCSVFile -SqlInstance $SQLInstance -Database $DBName -Delimiter $Delimiter -AutoCreateTable
}
}
$Projecttotal | Export-XLSX -Path $Excelfile -AutoFit -Table -TableStyle Medium2 -WorksheetName "Projects"
}
## Get information about Modules in the Project(s), if there is any Project
$Projects = $xml.AutomationManager.buildingblock.projects.project
$ProjectModuletable = @()
$ProjectModuletotal = @()
if ($Projects.count -gt 0)
{
foreach ($Project in $Projects) {
$order = 0
$modules = $Project.modules
foreach ($module in $modules) {
$a = $modules.module
foreach ($i in $a) {
$order = $order + 1
#DATA CSV
$ProjectModuletable = New-Object PSobject
$ProjectModuletable | Add-Member -Type NoteProperty -Name ProjectGuid -Value $Project.properties.guid
$ProjectModuletable | Add-Member -Type NoteProperty -Name Order -Value $order
$ProjectModuletable | Add-Member -Type NoteProperty -Name ModuleGuid -Value $i.guid
$ProjectModuletable | Add-Member -Type NoteProperty -Name Enabled -Value $i.enabled
$ProjectModuletotal += $ProjectModuletable
}
}
}
if ($CSV -or $CSV2SQL) {
$ProjectModuletotal | Export-Csv -Append -NoTypeInformation -Delimiter \';\'-Path $ProjectModuleCSVFile
if ($CSV2SQL) {
Import-DbaCsv -Path $ProjectModuleCSVFile -SqlInstance $SQLInstance -Database $DBName -Delimiter $Delimiter -AutoCreateTable
}
}
$ProjectModuletotal | Export-XLSX -Path $Excelfile -AutoFit -Table -TableStyle Medium2 -WorksheetName "ProjectModules"
}
## Get information about Modules, if there is any
$Modules = $xml.AutomationManager.buildingblock.modules.module
$Moduletable = @()
$Moduletotal = @()
if ($Modules.count -gt 0)
{
foreach ($Module in $Modules) {
#DATA CSV
$Moduletable = New-Object PSobject
$Moduletable | Add-Member -Type NoteProperty -Name Name -Value $Module.Properties.name
$Moduletable | Add-Member -Type NoteProperty -Name Guid -Value $Module.Properties.guid
$Moduletable | Add-Member -Type NoteProperty -Name Enabled -Value $Module.Properties.Enabled
$Moduletable | Add-Member -Type NoteProperty -Name Description -Value $Module.properties.description
$Moduletotal += $Moduletable
}
if ($CSV -or $CSV2SQL) {
$Moduletotal | Export-Csv -Append -NoTypeInformation -Delimiter \';\' -Path $ModulesCSVFile
if ($CSV2SQL) {
Import-DbaCsv -Path $ModulesCSVFile -SqlInstance $SQLInstance -Database $DBName -Delimiter $Delimiter -AutoCreateTable
}
}
$Moduletotal | Export-XLSX -Path $Excelfile -AutoFit -Table -TableStyle Medium2 -WorksheetName "Modules"
}
## Get information about Tasks in Module(s), if there is any module
$Modules = $xml.AutomationManager.buildingblock.modules.module
$Tasktable = @()
$Tasktotal = @()
if ($Modules.count -gt 0)
{
foreach ($Module in $Modules) {
$order = 0
$tasks = $module.tasks
foreach ($task in $tasks) {
$a = $tasks.task
foreach ($i in $a) {
if ($i.properties)
{
$order = $order + 1
$Tasktable = New-Object PSobject
$Tasktable | Add-Member -Type NoteProperty -Name "Part of Module" -Value $Module.Properties.name
$Tasktable | Add-Member -Type NoteProperty -Name "Part of Module (GUID)" -Value $Module.Properties.guid
$Tasktable | Add-Member -Type NoteProperty -Name Order -Value $order
$Tasktable | Add-Member -Type NoteProperty -Name Type -Value $i.properties.type
$Tasktable | Add-Member -Type NoteProperty -Name Enabled -Value $i.properties.enabled
$Tasktable | Add-Member -Type NoteProperty -Name Description -Value $i.properties.description
$Tasktable | Add-Member -Type NoteProperty -Name Comment -Value $i.properties.comments
$Tasktable | Add-Member -Type NoteProperty -Name Details -Value $i.settings.OuterXml
$Tasktotal += $Tasktable
}
}
}
}
if ($CSV -or $CSV2SQL) {
$Tasktotal | Export-Csv -Append -NoTypeInformation -Delimiter \';\' -Path $TasksCSVFile
if ($CSV2SQL) {
Import-DbaCsv -Path $TasksCSVFile -SqlInstance $SQLInstance -Database $DBName -Delimiter $Delimiter -AutoCreateTable
}
}
$Tasktotal | Export-XLSX -Path $Excelfile -AutoFit -Table -TableStyle Medium2 -WorksheetName "Tasks"
}
## Get information about Runbook Parameters
$Parameters = $xml.AutomationManager.buildingblock.runbooks.runbook.properties.properties.parameters.param
$Parametertable = @()
$Parametertotal = @()
if ($Parameters.count -gt 0)
{
foreach ($Parameter in $Parameters) {
#DATA CSV
$Parametertable = New-Object PSobject
$Parametertable | Add-Member -Type NoteProperty -Name Name -Value $Parameter.name
$Parametertable | Add-Member -Type NoteProperty -Name Value1 -Value $Parameter.Value1
$Parametertable | Add-Member -Type NoteProperty -Name Value2 -Value $Parameter.Value2
$Parametertable | Add-Member -Type NoteProperty -Name Value3 -Value $Parameter.Value3
$Parametertable | Add-Member -Type NoteProperty -Name Description -Value $Parameter.description
$Parametertotal += $Parametertable
}
if ($CSV -or $CSV2SQL) {
$Parametertotal | Export-Csv -Append -NoTypeInformation -Delimiter \';\' -Path $ParametersCSVFile
if ($CSV2SQL) {
Import-DbaCsv -Path $ParametersCSVFile -SqlInstance $SQLInstance -Database $DBName -Delimiter $Delimiter -AutoCreateTable
}
}
$Parametertotal | Export-XLSX -Path $Excelfile -AutoFit -Table -TableStyle Medium2 -WorksheetName "Parameters"
}
}
Invoke-IVA-Documentation -ExportPath "<PATH WHERE THE OUTPUT WILL BE SAVED>" -BB "<FULL PATH TO BUILDINGBLOCK.XML>" -Excel "<OUTPUTNAME.XLSX>" -CSV