The IT Assets Database was replaced by the IT Admins CMDB and is EOL / End of Life, no further development will be done on this project.
Most IT departments use checklists for common tasks like deploying new workstations, on-boarding employees or new servers. It does not matter weather you on-board / deploy or you terminate / decommission a user or system. Checklist can be created for various tasks for assets like workstations, servers and equipment as well as employees.
Implemented and used right, those checklists can become incredible useful and important. They can help you through whole system migrations, besides the usual on-boarding and termination processes or deployment and retirement. Checklists change with time – but a once created checklist does not, cause checklists are copied from the template as it is at a certain point in time – so you can easily look at a older checklist and have a completely different checklist compared to what the current one looks like. I personally can’t encourage you enough to use them and implement proper script to automate standard processes where you can. It is not just because of the scripts, it is about standardization and streamlining everything. This avoids even to tell the team constantly about process changes, you simply change the checklist. As long they really go through them step by step, you will have an incredible tool and process on how to change certain steps. And if you ever worry – the checklist search actually indicates on how long someone was in a checklist as well as the fact that each click on a checkbox or even selecting a value from a drop down field or entering text in a field will result in a history information. Hover over a field in a real checklist and you will see a tip-text that will show you who changed it last with date and time.
You can create the similar lists – e.g. a list new accounting user / new manufacturing user – or – PC build (for preparing available systems with the default image) / PC deployment (for deploying and customizing the system when deployed to a user). In the end it is up to you how you use and engage those checklists, but they can be very powerful.
A checklist of course might not just be a simple list with instructions, it might collect data like version numbers, dates, etc. as well as having links to your intranet documentation about specific steps for a task to even executing scripts. All of this can be accomplished with the checklists. You can add a single title per item, additional instructions (item memo), define if the item is mandatory or not, define if it has a textbox to expect information from the employee that is executing the list, add additional links to e.g. intranet places like Exchange Web-Admin portal that can be clicked while working with the list, and even add scripts as cmd-scripts or PowerShell scripts that can be executed with a single button click and even retrieve information from the parent table/asset from the database as well as for any checklist text field or even drop down field select value – any column when you use drop-down fields. In order to accomplish this and making sure that the script executes right, a mini-validation will happen before the script even fires. If this mini-validation fails, the user will be informed of what is missing as well.
Drop-Down fields have been added in version 3.0 of the database. Those can relate to either existing views and tables, direct transact SQL queries or value lists. Eventually they act as any other Microsoft Access DropDown field. If you use SQL queries, always make sure you show all values – do not restrict the values to only “Active” entries, this would cause issues if you load an older checklist – if the values would been since retired/in-active – you would not see what was select. It is to recommend to simply put ORDER statements to accomplish this, if at all – or show enough columns.
Useful examples for lists are below – you can use them and even process the select information in scripts in order to automate settings.
- Departments
- type: Table/Query
- columns: 3
- width: 0,0 (this avoids that the first and second column is shown)
- qryDepartments
- Manager / Supervisor
- type: Table/Query
- columns: 4
- width: 0 (only first column is invisible)
- SELECT E.UserName, E.EmployeeName, E.department, E.RemovedDate
FROM tblEmployees AS E INNER JOIN tblEmployeesLDAPSyncLastSeen AS L ON E.ID = L.EmployeeID
WHERE (((E.UserName) Not Like ‘ilsd%’ And (E.UserName) Not Like ‘%_admin’) AND ((E.EmployeeName) Not Like ‘, %’ And (E.EmployeeName) Not Like ‘Admin, %’) AND ((E.LDAPSync)=True))
ORDER BY Format(L.LDAPSyncLastSeen,”yyyy/mm/dd”) DESC , E.EmployeeName, E.department;
- Yes/No fields
- type: Value List
- columns: 1
- width: <leave empty>
- “Yes”,”No”
- Workstation
- type: Table/Query
- columns: 2
- width: 0 (only the first column is invisible)
- SELECT ID, UserName FROM tblEmployees ORDER BY RemovedDate, EmployeeName
Got curious on those SELECT statements? You need a full version of Microsoft Access – click on the SHOW TABLES button in the Main Menu and create your own query in Microsoft Access – show the SQL code for the query once it looks like you want it and gives you the data you want to show and insert it to the checklist. This is rather easy and does not need a lot of SQL code knowledge nor database development knowledge. If you get stuck, use the contact form and reach out – I am always happy to help.
To accomplish this, you first create a template and define to which asset type it belongs. Then you add checklist items – in a simple tabular form. Please pay attention to the green instructions text above this table that gives you hints on how to most effectively enter the items.
Use the preview checklist button to see how your checklist will look like.
Limitation – please be aware that there is a limitation due to the way the checklist system works and Microsoft Access that only allows a certain maximum form height and width. A checklist can go over two columns, left and right – but once you filled it up – you might need to split it in two separate templates that both would need to be executed. You can limit the wasted space by transferring instructions in the Memo field that might be rather long to a local intranet and just use the links to point to them.
When you look at a checklist, you see that there are two columns of checkboxes at the left of each checklist item. The first column defines if it is applicable, this is checked by default, the second checkbox is to be checked once the item / task is finished – by the executing employee. By design – either both checkboxes need to be checked or unchecked – they can’t be different. If a entry becomes mandatory, the applicable checkbox can not be unchecked. Similar rules apply to the text-fields that can be added.
A checklist remains in progress until it is finished with the appropriate buttons in the top. It only can be finished if all necessary fields are checked / entered as defined in the template. Altering the template after a list was started / created will not alter the target list – in other words – if you e.g. create in workstations a checklist based on any template – this template will be copied completely as is – if you a few minutes or months later alter the template – the created list still will not change or be affected. There is a version control on those lists.
Only application users with the right to create templates can unlock a finished checklist, making it edible again. This avoids that your regular database users lock and unlock checklists as they like and give you some kind of certainty that the data wasn’t altered afterwards.
To further help with this task and determining when something was checked, unchecked, text entered or e.g. a button for a script clicked, the information will be saved as well in the database. If you hover of an item that was clicked somehow before – it will show you tool-tip-text with information who and when the field / button was clicked or data entered.
The biggest challenge might be the scripts – I do have some scripts active for e.g. removing Active Directory accounts or password database entries, as well as sending welcome emails. But all of this is so specific to each and every environment, that you really need to develop them yourself. Once they are working, they will become very powerful.
Checklists have additional SysConfig parameter for some control over the necessary rights, e.g. execute as a certain user or relative user (default user: jdoe / executing user: jdoe_admin – depending on logged on user, etc…). Please refer to the section in the manual for details.
Data field and reference overview
This list shows and partly explains the configuration values for the templates, since the entries are not directly asset related rather then configuring a checklist template. Adjusting checklists will not alter existing checklists – cause those are always copied from the current template.
Hovering with the mouse cursor over most of those fields will show you a tooltip text that helps understanding their purpose and usage.
- Active / Disabled
- Target Table – this determines where the checklist will be available
- checklist name
- new deployment status – leave empty or define a new deployment status that will be set to the asset when the checklist is finished
- Notes
- filled out lists overview
- checklist items / template configuration – sub-table
- active / disabled
- sort-order – where in the checklist the entry will appear
- suggestion – jump big – like in 1000 steps to be able to sort easily later on or add sub-entries in between
- sub-level
- chose one of four levels to move the entry more to the right and show it as a sub-entry
- item name
- has checkbox – if not – the entry does not need to be completed and might be just a title for sub-entries
- mandatory – setting this box causes the APPLICABLE checkbox to be disabled and making it mandatory that this item is processed – it also write the title RED in the checklist
- Item Memo – long text for the item – explanation on what needs to be done etc..
- TIP: press SHIFT + F2 to open an edit window in Access and hit ENTER to break the lines and make it better readable
- Has TextBox
- input field size – how many rows the textbox field should be
- textbox target field – this must be a field on the target-table – the value in the textbox would be pushed to this field when click on finished – leave empty if no write back to the source table is needed
- useful for description and status notes fields
- input field reference
- this reference can be used as a script parameter
- set it to: ABC
- use it as a script parameter: “scriptpath\script” “-parameter1:[!checklist_ABC!]”
- this reference can be used as a script parameter
- link
- shows a clickable link on the checklist – good for external Wiki’s, direct access to web-portals etc. – simply to make live easier
- scripts
- script-type (PowerShell/ps1 or CMD/Batch-File)
- script
- TIP: press SHIFT + F2 to edit this field
- put text quotes around the script path and name as well as each single parameter
- “\\server\path\folder\script.ps1” “[!checklist_ABC!]” “[!checklist_ABC.2!]” “[!sourcecolumn/alternativesourcecolumn!]”
- if you want to access columns from a LIST (defined in the checklist, see further below) you need to keep in mind to set a reference tag and that columns are 0 based
- assume you have 3 columns (ID, DepartmentName, DepartmentNumber) and the reference is CHKDEPT you use the following parameters to inject the selected values in the script parameters
- [!checklist_CHKDEPT.0!] – this gives you the ID column value
- [!checklist_CHKDEPT.1!] – this gives you the DepartmentName column value
- [!checklist_CHKDEPT.2!] – this gives you the DepartmentNr column value
- assume you have 3 columns (ID, DepartmentName, DepartmentNumber) and the reference is CHKDEPT you use the following parameters to inject the selected values in the script parameters
- alternative script source
- per default script parameter can be any field/column of the target-table see example above – you can set another source e.g. a query/view instead – the parameters still work the same but are based on this alternate table
- note: there will be a SQL query that says: SELECT * FROM ALTERNATIVESCRIPTSOURCE WHERE ID = X
- this means you need to have the ID field as reference in this alternative script source / query/view available
- run elevated – this will use the SysConfig defined username abbreviation and ask for the user password while executing a RUN-AS command
- Lists
- List Type – value list or Table/Query
- refer to Microsoft Access Drop Drown fields in general – this field configuration works the same way
- value lists: you enter the values comma separated in to the list source, e.g.:
- single column example
- “Yes”,”No”
- column count = 1
- multi column example
- 1,”okay”,2,”failed”,3,”cancelled”
- column count = 2
- column width = 0 (assuming you only want to see column 2)
- single column example
- Table/Query (SQL)
- List source would be a SQL query or the name of a query or table
- example select workstation
- select id, hostname, assettag, type, departmentname, departmentnr, deploymentstatus, employeename from qryWorkstations order by deploymentstatus,departmentname,assettag
- count = 8
- widths = 0
- example departments
- qryDepartments
- count = 3
- widths = 0,0
- List target field = DepartmentID
- example LDAP manager for Employees
- SELECT E.UserName, E.EmployeeName, E.department, E.RemovedDate
FROM tblEmployees AS E INNER JOIN tblEmployeesLDAPSyncLastSeen AS L ON E.ID = L.EmployeeID
WHERE (((E.UserName) Not Like ‘ilsd%’ And (E.UserName) Not Like ‘%_admin’) AND ((E.EmployeeName) Not Like ‘, %’ And (E.EmployeeName) Not Like ‘Admin, %’) AND ((E.LDAPSync)=True))
ORDER BY Format(L.LDAPSyncLastSeen,”yyyy/mm/dd”) DESC , E.EmployeeName, E.department; - count = 4
- width = 0
- SELECT E.UserName, E.EmployeeName, E.department, E.RemovedDate
- list column count
- amount of columns in this list in total to be visible – starting from the left – you can hide columns from the left / additional columns are not available as data source for script parameters
- list column widths
- leave empty to show all columns, set 0 to hide the first column, input comma separated values for multiple columns – you can define the size of each column
- ListTargetFiled – this must be a field on the target-table – the value in the textbox would be pushed to this field when click on finished – leave empty if no write back to the source table is needed
- ListShowHeaders – show column names on top of the list when dropped down
- LimitToList – only list entries and user can enter independent value
- List Reference – this reference can be used as a script parameter
- set it to: ABC
- use it as a script parameter: “scriptpath\script” “-parameter1:[!checklist_ABC!].0”
- List Type – value list or Table/Query
Examples for scripts
Since there seems to be a lot of questions about script, I thought I post some example scripts here to keep you going. Please see below for more information.
DHCP reservations
Create this SQL server view in the database
1 2 3 4 5 6 | SELECT S.ID, I.IPAddress, M.MACAddress, S.Hostname, S.Domain, V.IPNotation FROM dbo.tblServers AS S LEFT OUTER JOIN dbo.tblServerMACs AS M ON S.ID = M.ServerID LEFT OUTER JOIN dbo.tblIPAddresses AS I ON S.ID = I.ServerID AND M.ID = I.ServerMACID RIGHT OUTER JOIN dbo.tblIPVLANs AS V ON V.ID = I.VLANID WHERE (S.ID IS NOT NULL) |
And create the following script in your defined scripts folder
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | param( [string] $HostName = "", [string] $DomainName = "", [string] $MACAddress = "", [string] $IPAddress = "", [string] $IPscope = "" ) $DHCPServer = "yourDHCPserver.domain.local" $CIMSession = New-CimSession -ComputerName $DHCPServer function Check-IPaddress([string]$IP){ [ref]$ValidIP = [ipaddress]::None If ([ipaddress]::TryParse($IP,$ValidIP)) { return $true } Else { return $false } } Write-Host "Script starting..." Write-Host "" Write-Host "Parameters submitted to script:" Write-Host "===============================" Write-Host "Host-Name: $HostName" Write-Host "Domain-Name: $DomainName" Write-Host "MAC Address: $MACAddress" Write-Host "IP Address: $IPAddress" Write-Host "IP scope: $IPscope" Write-Host "" $MACAddress = $MACAddress.Replace(".",""); $MACAddress = $MACAddress.Replace("-",""); $MACAddress = $MACAddress.Replace(":",""); $MACAddress = $MACAddress.Replace(" ",""); $MACAddress = $MACAddress.Trim(); If ($MACAddress.Length -eq 12) { #Re-Formatting MAC to correct format (dashed) $NewMAC; $cnt = 0; $UseDash = $false; foreach($char in [char[]]$MACAddress) { $cnt += 1; If ($cnt -eq 12) { $NewMAC += $char; } Else { If ($UseDash -eq $false) { $UseDash = $true; $NewMAC += $char; } Else { $UseDash = $false; $NewMAC += $char + "-"; } } } If (Check-IPaddress($IPAddress) -eq $true) { $NewIPscope = $IPscope.Split("/")[0] If (Check-IPaddress($NewIPscope) -eq $true) { $NewReservationName = "$HostName" If ($DomainName.Length -gt 0) { $NewReservationName += ".$DomainName" } If ($NewReservationName.Length -gt 0) { Write-Host "" Write-Host "" Write-Host "check DHCP server ($DHCPServer) for existing reservations on this IP address..." Try { $ExistingReserverations = Get-DhcpServerv4Reservation -ComputerName $DHCPServer -IPAddress $IPAddress -CimSession $CIMSession -ErrorAction Stop $foundReservation = $true } Catch { $foundReservation = $false $Error.Clear() } If ($foundReservation -eq $true){ Write-Host "" Write-Host "" Write-Host "The following reservation exists on the DHCP server for the defined IP - remove this first!" -ForegroundColor Red Write-Host "===========================================================================================" $ExistingReserverations Write-Host "" Write-Host "" $Readhost = Read-Host "Remove this reservation? (y/n)" Switch ($ReadHost) { Y { Try { Remove-DhcpServerv4Reservation -ComputerName $DHCPServer -IPAddress $IPAddress -CimSession $CIMSession $foundReservation = $false } Catch { Write-Host "Couldn't remove the reservation..." -ForegroundColor Red } } Default {} } } If ($foundReservation -eq $true){ Write-Host "Cant' proceed.. the existing reservation needs to be removed first..." -ForegroundColor Red } Else { Write-Host "" Write-Host "" Write-Host "Transformed parameters for DHCP reservation:" -BackgroundColor DarkBlue Write-Host "============================================" -BackgroundColor DarkBlue Write-Host "Correct formatted MAC: $NewMAC" -BackgroundColor DarkBlue Write-Host "Foramtted Reservation Name: $NewReservationName" -BackgroundColor DarkBlue Write-Host "IP address: $IPAddress" -BackgroundColor DarkBlue Write-Host "IP scope: $NewIPscope" -BackgroundColor DarkBlue Write-Host "" Write-Host "" Read-Host -Prompt "Press any key/enter to continue or CTRL+C to quit" Write-Host "" Write-Host "" Write-Host "Attempting to add DHCP reservation..." Add-DhcpServerv4Reservation -ComputerName $DHCPServer -ScopeId $NewIPscope -IPAddress $IPAddress -ClientId $NewMAC -Description $NewReservationName -Name $NewReservationName -CimSession $CIMSession Write-Host "" Write-Host "" Write-Host "Attempt to add DHCP finished - reservation check results:" Get-DhcpServerv4Reservation -ComputerName $DHCPServer -IPAddress $IPAddress -CimSession $CIMSession Write-Host "" Write-Host "" } } Else { Write-Host "No hostname / domain name detected" -ForegroundColor Red } } Else { Write-Host "IP scope definition is invalid - exiting script" -ForegroundColor Red } } Else { Write-Host "IP Address is invalid - exiting script" -ForegroundColor Red } } Else { Write-Host "MAC Address malformatted: $MACAddress - exiting script" -ForegroundColor Red } Remove-CimSession -Id $CIMSession.Id Write-Host "Script finished..." |
In this script, adjust this line to your preferred DHCP server – this could be a parameter as well, but in this example it is hard coded in the script.
$DHCPServer = “yourDHCPserver.domain.local”
Now add a checklist entry – the parameters should look similar to this – keep in mind – this is specifically for SERVERS and nothing else – otherwise adjust the SQL view to the table PRINTERS or WORKSTATIONS as needed.
- Script
- “C:\IT Assets\ChecklistScripts\CreateDHCPReservation.ps1″ [!hostname!] [!domain!] [!MACAddress!] [!IPAddress!] [!IPNotation!]
- Script-Type
- ps1
- AlternativeScriptSource
- qryCheckListScriptServerMACIP
Remove DHCP reservation (retirement checklist)
SQL – we will use the same view we used for the DHCP reservation script – see above – if you have it already, you are all set. We now will create a second script
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | param( [string] $IPAddress = "", [string] $IPscope = "" ) $DHCPServer = "yourDHCPserver.domain.local" $CIMSession = New-CimSession -ComputerName $DHCPServer function Check-IPaddress([string]$IP){ [ref]$ValidIP = [ipaddress]::None If ([ipaddress]::TryParse($IP,$ValidIP)) { return $true } Else { return $false } } Write-Host "Script starting..." Write-Host "" Write-Host "Parameters submitted to script:" Write-Host "===============================" Write-Host "IP Address: $IPAddress" Write-Host "IP scope: $IPscope" Write-Host "" $NewIPscope = $IPscope.Split("/")[0] If (Check-IPaddress($NewIPscope) -eq $true) { Write-Host "" Write-Host "" Write-Host "check DHCP server ($DHCPServer) for existing reservations on this IP address..." try { $ExistingReserverations = Get-DhcpServerv4Reservation -ComputerName $DHCPServer -IPAddress $IPAddress -CimSession $CIMSession -ErrorAction Stop $foundReservation = $true } catch { $foundReservation = $false } If ($foundReservation -eq $true){ Write-Host "" Write-Host "" Write-Host "The following reservation exists on the DHCP server for the defined IP" -ForegroundColor Red Write-Host "======================================================================" $ExistingReserverations Write-Host "" Write-Host "" $Readhost = Read-Host "Remove this reservation? (y/n)" Switch ($ReadHost) { Y { Try { Remove-DhcpServerv4Reservation -ComputerName $DHCPServer -IPAddress $IPAddress -CimSession $CIMSession $foundReservation = $false } Catch { Write-Host "Couldn't remove the reservation..." -ForegroundColor Red } } Default {} } } Else { Write-Host "No reservation found on DHCP server ($DHCPServer)" -ForegroundColor Red } } Else { Write-Host "IP scope definition is invalid - exiting script" -ForegroundColor Red } Remove-CimSession -Id $CIMSession.Id Write-Host "Script finished..." |
In this script, adjust this line to your preferred DHCP server – this could be a parameter as well, but in this example it is hard coded in the script.
$DHCPServer = “yourDHCPserver.domain.local”
Now add a checklist entry – the parameters should look similar to this – keep in mind – this is specifically for SERVERS and nothing else – otherwise adjust the SQL view to the table PRINTERS or WORKSTATIONS as needed.
- Script
- “C:\IT Assets\ChecklistScripts\RemoveDHCPReservation.ps1” [!IPAddress!] [!IPNotation!]
- Script-Type
- ps1
- AlternativeScriptSource
- qryCheckListScriptServerMACIP
Remove a server/workstation from Active Directory
1 2 3 4 5 6 7 8 | param([string] $HostName = "") Write-Host "Script starting..." Write-Host "Trying to find computer: $HostName" $Computer = GET-ADComputer -Identity $HostName Write-Host "Trying to remove computer: $HostName" Remove-ADComputer -Identity $Computer -Confirm:$false Write-Host "Script finished..." |
- Script
- “C:\IT Assets\ChecklistScripts\RemoveWorkstationFromAD.ps1” [!hostname!]
- Script-Type
- ps1
This is a way simpler script as the DHCP reservation – but it works as well. Similar stuff can be done with adding systems to groups etc…
Assign Office 365 licenses
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | Param( [string]$username ) $userUPN="$username@domain.com" try{ Get-AzureADUser -ObjectId $userUPN } catch { Connect-AzureAD } Write-Host "" Write-Host "" Write-Host "Currently assigned licenses for: $userUPN" Get-AzureADUser -objectid $userUPN | Select -ExpandProperty AssignedPlans | Where {$_.CapabilityStatus -eq "Enabled"} | ft Write-Host "" Write-Host "" Set-AzureADUser -ObjectID $userUPN -UsageLocation "US" $planName="OFFICESUBSCRIPTION" Write-Host "Assigning new license $planName to $userUPN" Write-Host "" Write-Host "" $License = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense $License.SkuId = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $planName -EQ).SkuID $LicensesToAssign = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses $LicensesToAssign.AddLicenses = $License Set-AzureADUserLicense -ObjectId $userUPN -AssignedLicenses $LicensesToAssign Write-Host "" Write-Host "" Write-Host "Now currently assigned licenses for: $userUPN" Get-AzureADUser -objectid $userUPN | Select -ExpandProperty AssignedPlans | Where {$_.CapabilityStatus -eq "Enabled"} | ft Write-Host "" Write-Host "" |
- Script
- “C:\IT Assets\ChecklistScripts\O365.ps1” [!username!]
- Script-Type
- ps1
Update or set Generic user information
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Param( [string]$username, [string]$empNumber, [string]$departmentNumber, [string]$department, [string]$title, [string]$phone, [string]$manager ) Import-Module ActiveDirectory Set-ADUser $username -streetAddress "your streed" -city "city" -state "state" -postalCode "zip code" -company "company" -Manager $manager -OfficePhone $phone -Department $department -title $title -Replace @{'employeeNumber'="$empNumber";'departmentNumber'="$departmentNumber";'description'="$title";'physicalDeliveryOfficeName'="your office"} Get-ADUser $username -Properties employeeNumber,Department,departmentNumber,Title,Description,OfficePhone,Manager,streetAddress,city,state,postalCode,physicalDeliveryOfficeName,company Add-ADGroupMember -Identity "Company_All Users" -Members $username |
- Script
- “C:\IT Assets\ChecklistScripts\Employee_UpdateAll.ps1” [!username!] [!checklist_empNumber!] [!checklist_dept.1!] “[!checklist_dept.2!]” “[!checklist_title!]” [!checklist_phone!] [!checklist_mgr.0!]
- Be aware – the above is a rather complex example that relates to various fields in the checklist, especially drop down lists!
- Script-Type
- ps1