
Start NinjaOne Patch Scan
This script triggers an OS Patch Scan for a specified Windows device within the NinjaOne platform. It automates the process of initiating an OS Patch scan. Note this does not apply OS patches, just initiates a scan.
# --------------------------------------------------
# Author: Gavin Stone (NinjaOne)
# Attribution: Luke Whitelock (NinjaOne) for his work on the Authentication Functions
# Date: 25th March 2025
# Description: Triggers the API Patch Scan for Windows Devices
# Version: 1.0
# --------------------------------------------------
# User editable variables:
$NinjaOneInstance = 'eu.ninjarmm.com' # Please replace with the region instance you login to (app.ninjarmm.com, us2.ninjarmm.com, eu.ninjarmm.com, ca.ninjarmm.com, oc.ninjarmm.com)
$NinjaOneClientId = ''
$NinjaOneClientSecret = ''
$NinjaDeviceIDToPatchScan = '117' # Please replace with the device ID you wish to patch
# Functions for Authentication
function Get-NinjaOneToken {
[CmdletBinding()]
param()
if ($Script:NinjaOneInstance -and $Script:NinjaOneClientID -and $Script:NinjaOneClientSecret ) {
if ($Script:NinjaTokenExpiry -and (Get-Date) -lt $Script:NinjaTokenExpiry) {
return $Script:NinjaToken
}
else {
if ($Script:NinjaOneRefreshToken) {
$Body = @{
'grant_type' = 'refresh_token'
'client_id' = $Script:NinjaOneClientID
'client_secret' = $Script:NinjaOneClientSecret
'refresh_token' = $Script:NinjaOneRefreshToken
}
}
else {
$body = @{
grant_type = 'client_credentials'
client_id = $Script:NinjaOneClientID
client_secret = $Script:NinjaOneClientSecret
scope = 'monitoring management'
}
}
$token = Invoke-RestMethod -Uri "https://$($Script:NinjaOneInstance -replace '/ws','')/ws/oauth/token" -Method Post -Body $body -ContentType 'application/x-www-form-urlencoded' -UseBasicParsing
$Script:NinjaTokenExpiry = (Get-Date).AddSeconds($Token.expires_in)
$Script:NinjaToken = $token
Write-Host 'Fetched New Token'
return $token
}
else {
Throw 'Please run Connect-NinjaOne first'
}
}
}
function Connect-NinjaOne {
[CmdletBinding()]
param (
[Parameter(mandatory = $true)]
$NinjaOneInstance,
[Parameter(mandatory = $true)]
$NinjaOneClientID,
[Parameter(mandatory = $true)]
$NinjaOneClientSecret,
$NinjaOneRefreshToken
)
$Script:NinjaOneInstance = $NinjaOneInstance
$Script:NinjaOneClientID = $NinjaOneClientID
$Script:NinjaOneClientSecret = $NinjaOneClientSecret
$Script:NinjaOneRefreshToken = $NinjaOneRefreshToken
try {
$Null = Get-NinjaOneToken -ea Stop
}
catch {
Throw "Failed to Connect to NinjaOne: $_"
}
}
function Invoke-NinjaOneRequest {
param(
$Method,
$Body,
$InputObject,
$Path,
$QueryParams,
[Switch]$Paginate,
[Switch]$AsArray
)
$Token = Get-NinjaOneToken
if ($InputObject) {
if ($AsArray) {
$Body = $InputObject | ConvertTo-Json -depth 100
if (($InputObject | Measure-Object).count -eq 1 ) {
$Body = '[' + $Body + ']'
}
}
else {
$Body = $InputObject | ConvertTo-Json -depth 100
}
}
try {
if ($Method -in @('GET', 'DELETE')) {
if ($Paginate) {
$After = 0
$PageSize = 1000
$NinjaResult = do {
$Result = Invoke-WebRequest -uri "https://$($Script:NinjaOneInstance)/api/v2/$($Path)?pageSize=$PageSize&after=$After$(if ($QueryParams){"&$QueryParams"})" -Method $Method -Headers @{Authorization = "Bearer $($token.access_token)" } -ContentType 'application/json' -UseBasicParsing
$Result
$ResultCount = ($Result.id | Measure-Object -Maximum)
$After = $ResultCount.maximum
} while ($ResultCount.count -eq $PageSize)
}
else {
$NinjaResult = Invoke-WebRequest -uri "https://$($Script:NinjaOneInstance)/api/v2/$($Path)$(if ($QueryParams){"?$QueryParams"})" -Method $Method -Headers @{Authorization = "Bearer $($token.access_token)" } -ContentType 'application/json; charset=utf-8' -UseBasicParsing
}
}
elseif ($Method -in @('PATCH', 'PUT', 'POST')) {
$NinjaResult = Invoke-WebRequest -uri "https://$($Script:NinjaOneInstance)/api/v2/$($Path)$(if ($QueryParams){"?$QueryParams"})" -Method $Method -Headers @{Authorization = "Bearer $($token.access_token)" } -Body $Body -ContentType 'application/json; charset=utf-8' -UseBasicParsing
}
else {
Throw 'Unknown Method'
}
}
catch {
Throw "Error Occured: $_"
}
try {
return $NinjaResult.content | ConvertFrom-Json -ea stop
}
catch {
return $NinjaResult.content
}
}
# Connect to NinjaOne API
try {
Connect-NinjaOne -NinjaOneInstance $NinjaOneInstance -NinjaOneClientID $NinjaOneClientId -NinjaOneClientSecret $NinjaOneClientSecret
}
catch {
Write-Output "Failed to connect to NinjaOne API: $_"
exit 1
}
Invoke-NinjaOneRequest -Method Post -Path "device/$($NinjaDeviceIDToPatchScan)/patch/os/scan"
Start-NinjaOnePatchScan.ps1
Overview
This script triggers an OS Patch Scan for a specified Windows device within the NinjaOne platform. It automates the process of initiating an OS Patch scan. Note this does not apply OS patches, just initiates a scan.
Equivalent in Ninja

Attribution
- Author: Gavin Stone (NinjaOne)
- Attribution: Luke Whitelock (NinjaOne) for his work on the Authentication Functions
- Source: Start-NinjaOnePatchScan.ps1
Requirements / Prerequisites
- NinjaOne API Credentials:
NinjaOneClientIdNinjaOneClientSecret
- NinjaOne Instance URL: e.g.,
eu.ninjarmm.com
How It Works
- Authentication: The script authenticates with the NinjaOne API using the provided client ID and client secret. It obtains an access token, which is used for subsequent API requests.
- Initiate Patch Scan: After successful authentication, the script sends a POST request to the NinjaOne API endpoint corresponding to the specified device, triggering a patch scan.
Usage
-
Set User Variables:
-
Open the script in an appropriate editor like Visual Studio Code or PowerShell ISE.
-
Replace the placeholder values with your actual NinjaOne instance, client ID, client secret, and the device ID you wish to initiate the OS patch scan on:
$NinjaOneInstance = 'your_ninjaone_instance' # e.g., 'eu.ninjarmm.com' $NinjaOneClientId = 'your_client_id' $NinjaOneClientSecret = 'your_client_secret' $NinjaDeviceIDToPatchScan = 'device_id' # e.g., '117'
-
-
Run the Script:
-
Save the changes.
-
Execute the script in PowerShell:
.\Start-NinjaOnePatchScan.ps1
-
Expected Output
Upon successful execution, the script will connect to the NinjaOne API and trigger an OS patch scan for the specified device.
Troubleshooting
-
Issue: Authentication fails with an error message.
- Solution: Verify that the
NinjaOneClientIdandNinjaOneClientSecretare correct
- Solution: Verify that the
-
Issue: The script cannot connect to the NinjaOne API.
- Solution: Ensure that the
NinjaOneInstanceURL is correct and accessible from your network.
- Solution: Ensure that the
-
Issue: Patch scan does not initiate.
- Solution: Confirm that the
NinjaDeviceIDToPatchScancorresponds to a valid device ID in your NinjaOne account.
- Solution: Confirm that the
Notes
- Ensure that your NinjaOne API credentials are kept secure and not shared.
- The script is designed for Windows devices managed within NinjaOne.