{"id":9972,"date":"2026-10-19T01:23:53","date_gmt":"2026-10-19T01:23:53","guid":{"rendered":"https:\/\/pariswells.com\/blog\/?p=9972"},"modified":"2026-10-19T01:23:53","modified_gmt":"2026-10-19T01:23:53","slug":"check-for-connectwise-entraprise-apps-across-gdap-tenant","status":"publish","type":"post","link":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant","title":{"rendered":"Check for Connectwise Entraprise apps across GDAP Tenant"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code class=\"\">&lt;#\n.SYNOPSIS\n    Checks every GDAP customer tenant for the compromised ConnectWise vendor\n    Enterprise Applications (service principals) named in Huntress's October\n    2026 advisory on unauthorized ConnectWise vendor-credential access.\n\n.DESCRIPTION\n    Huntress reported that a ConnectWise vendor credential was obtained by an\n    unauthorized party and used to pull Microsoft Graph tokens for several\n    ConnectWise multi-tenant applications, with at least one instance observed\n    self-elevating to Global Administrator in a customer tenant:\n    https:\/\/www.huntress.com\/blog\/vendor-credential-enables-unauthorized-access\n\n    Reads the customer tenant list produced by Get-GDAPCustomerTenants.ps1 and,\n    for each customer, looks for Enterprise Applications whose AppId matches one\n    of the known-compromised ConnectWise application IDs. For every match found\n    it also checks whether that service principal has been added to the Global\n    Administrator directory role - the specific escalation Huntress observed.\n\n    AUTH DESIGN - delegated via GDAP only, no app registration\/service principal\n    of our own, matching how CIPP does this under the hood:\n      1. ONE interactive sign-in (New-PartnerAccessToken -UseAuthorizationCode),\n         using the same public multi-tenant client ID Connect-MgGraph itself\n         uses (\"Microsoft Graph Command Line Tools\": 14d82eec-204b-4c2f-b7e8-\n         296a70dab67e). This is delegated - it runs as you, under your own GDAP\n         role assignments, exactly like the interactive version of this script\n         did, just once instead of once per tenant.\n      2. For every customer tenant, the refresh token from step 1 is redeemed\n         for a Graph-scoped access token FOR THAT TENANT\n         (New-PartnerAccessToken -RefreshToken ... -Tenant &lt;customerTenantId>).\n         This is a silent token redemption - no browser, no prompt - because\n         it's just an OAuth refresh-token grant against a tenant your GDAP\n         relationship already gives you a role in. This is the same mechanism\n         Get-PartnerCenterLicensing.ps1 uses for Partner Center tokens, applied\n         to Microsoft Graph instead.\n      3. The resulting access token is used directly against the Graph v1.0\n         REST API (Invoke-RestMethod) - no Microsoft.Graph module needed, which\n         also sidesteps Connect-MgGraph's own per-tenant interactive re-prompt\n         behaviour that made the original version of this script re-prompt for\n         all 214 tenants one at a time.\n\n    This only tells you whether the named vendor app is PRESENT (consented) in\n    a customer's tenant - that's expected for ConnectWise RMM\/backup customers\n    and is not itself proof of compromise. Treat any row this script returns as\n    \"needs vendor-advisory triage\", not \"confirmed breach\": cross-check sign-in\/\n    audit logs for that service principal against the activity windows in\n    Huntress's writeup, and follow ConnectWise's own remediation guidance.\n\n.PARAMETER CustomerCsv\n    Path to the customer tenant list from Get-GDAPCustomerTenants.ps1.\n\n.PARAMETER OutputPath\n    Folder to write the CSV reports to. Defaults to the script's own folder.\n\n.PARAMETER AppIds\n    Override the built-in list of known-compromised ConnectWise AppIds (e.g. to\n    add IDs from a later Huntress\/ConnectWise update) instead of editing the\n    script.\n\n.PARAMETER IncludeOtherConnectWiseApps\n    Also report any OTHER service principal in the tenant owned by ConnectWise's\n    tenant (AppOwnerOrganizationId) that isn't one of the specific IOC AppIds\n    above. This is informational only - ConnectWise has many legitimate\n    multi-tenant apps - but gives a fuller picture of ConnectWise's footprint\n    in the tenant while this advisory is still developing.\n\n.NOTES\n    Requires the PartnerCenter PowerShell module (already a dependency of\n    Get-PartnerCenterLicensing.ps1 in this folder) purely for its\n    New-PartnerAccessToken helper - no Partner Center API calls are made here,\n    it's used only as a generic MSAL wrapper to mint Graph tokens per tenant.\n    Needs Application.Read.All and Directory.Read.All to already be usable via\n    your GDAP role in each customer tenant - the same requirement the previous,\n    fully-interactive version of this script had.\n#>\n\n[CmdletBinding()]\nparam(\n    [string]$CustomerCsv = (Join-Path $PSScriptRoot 'GDAPCustomers.csv'),\n    [string]$OutputPath  = $PSScriptRoot,\n    [string[]]$AppIds,\n    [switch]$IncludeOtherConnectWiseApps,\n    [string]$UserPrincipalName\n)\n\n$ErrorActionPreference = 'Stop'\n\nif (-not (Test-Path $CustomerCsv)) {\n    throw \"Customer list not found at '$CustomerCsv'. Run Get-GDAPCustomerTenants.ps1 first.\"\n}\n\nImport-Module PartnerCenter -RequiredVersion 3.0.10 -ErrorAction Stop\n\n# The well-known Microsoft Graph PowerShell (\"Microsoft Graph Command Line Tools\")\n# public client ID - the exact same one Connect-MgGraph uses internally (confirmed\n# by extracting the GUID literal from Microsoft.Graph.Authentication.dll). Reused\n# here via New-PartnerAccessToken purely as a generic MSAL wrapper so we can redeem\n# one interactive sign-in into a silent per-tenant token, which Connect-MgGraph\n# itself doesn't support across repeated -TenantId switches in one session.\n$graphClientId = '14d82eec-204b-4c2f-b7e8-296a70dab67e'\n$graphScope    = 'https:\/\/graph.microsoft.com\/.default'\n# Kept deliberately minimal and near-universally pre-consented, to avoid tripping an\n# admin-consent prompt (which showed up as \"access_denied\" when the bootstrap sign-in\n# requested .default straight away) - the admin-scoped request only happens per customer\n# tenant below, where it was already working in the previous interactive version.\n$bootstrapScope = 'https:\/\/graph.microsoft.com\/User.Read offline_access'\n\n# Source: https:\/\/www.huntress.com\/blog\/vendor-credential-enables-unauthorized-access\n# (Huntress advisory, 2026-10). The compromised credential belongs to ConnectWise's\n# own tenant and was used against these specific multi-tenant management apps.\n$connectWiseTenantId = '3f9cd7a0-127a-4ed4-bf06-2f830d5616b7'\n$knownVendorApps = @(\n    [pscustomobject]@{ AppId = '506e08f9-6e9a-4da4-942b-a099a03644ae'; Label = 'ConnectWise Cloud Backup (formerly SkyKick)';      Note = \"Huntress: credential confirmed in hostile hands - used to pull Graph tokens from unauthorized infrastructure (observed 2026-10-15).\" }\n    [pscustomobject]@{ AppId = '24205314-2b89-4e07-a2a4-579e898a5640'; Label = 'ConnectWise Cloud Management - MS Teams';          Note = \"Huntress: in one customer tenant this app assigned itself to Global Administrator, then ran a Python script modifying two other applications.\" }\n    [pscustomobject]@{ AppId = 'b78f6a77-d4e5-46fb-87e5-d1648bd02519'; Label = 'ConnectWise Cloud Management - Exchange Online';   Note = \"Huntress: identified with high confidence as abused for unauthorized access.\" }\n    [pscustomobject]@{ AppId = 'b2b55f5b-7758-4719-8d8f-88ae172e6bdb'; Label = 'ConnectWise Cloud Management - SharePoint Online'; Note = \"Huntress: one of multiple ConnectWise management apps observed in the exploitation activity.\" }\n    [pscustomobject]@{ AppId = '0de14c77-b9b0-4137-9360-34878a929827'; Label = 'ConnectWise Cloud Management - MS Graph';         Note = \"Huntress: used to obtain tokens as part of the unauthorized access campaign.\" }\n    [pscustomobject]@{ AppId = '412dcf96-176d-4b3a-a1b0-4981ad66971e'; Label = 'ConnectWise Cloud Management - Partner Center';   Note = \"Huntress: associated with vendor automation in the incident timeline.\" }\n    [pscustomobject]@{ AppId = '2399d300-6fca-4e6a-a686-399fefe75b83'; Label = 'ConnectWise Cloud Management (generic)';          Note = \"Huntress: general management app recommended for review and disablement.\" }\n)\nif ($AppIds) {\n    $knownVendorApps = $AppIds | ForEach-Object { [pscustomobject]@{ AppId = $_; Label = '(custom AppId)'; Note = '' } }\n}\n\n$globalAdminRoleTemplateId = '62e90394-69f5-4237-9190-012177145e10'\n\n$customers = Import-Csv -Path $CustomerCsv\nif (-not $customers -or $customers.Count -eq 0) {\n    Write-Warning \"No customer tenants in '$CustomerCsv'. Nothing to check.\"\n    return\n}\n\n$timestamp  = Get-Date -Format 'yyyyMMdd_HHmmss'\n$reportPath = Join-Path $OutputPath \"ConnectWiseVendorAppCheck_$timestamp.csv\"\n$errorsPath = Join-Path $OutputPath \"ConnectWiseVendorAppCheck_Errors_$timestamp.csv\"\n\n$findings = [System.Collections.Generic.List[object]]::new()\n$errors   = [System.Collections.Generic.List[object]]::new()\n\nfunction Add-ErrorRow {\n    param($TenantId, $TenantName, $Message)\n    $errors.Add([pscustomobject]@{ TenantId = $TenantId; TenantName = $TenantName; Message = $Message })\n}\n\nfunction Invoke-GraphGet {\n    param([string]$Uri, [string]$AccessToken)\n    $headers = @{ Authorization = \"Bearer $AccessToken\"; ConsistencyLevel = 'eventual' }\n    $items = [System.Collections.Generic.List[object]]::new()\n    do {\n        $resp = Invoke-RestMethod -Uri $Uri -Headers $headers -Method Get -ErrorAction Stop\n        if ($resp.value) { foreach ($v in $resp.value) { $items.Add($v) } }\n        $Uri = $resp.'@odata.nextLink'\n    } while ($Uri)\n    return $items\n}\n\nfunction Test-IsGlobalAdmin {\n    param([string]$ServicePrincipalObjectId, [string]$AccessToken)\n    try {\n        $memberOf = Invoke-GraphGet -Uri \"https:\/\/graph.microsoft.com\/v1.0\/servicePrincipals\/$ServicePrincipalObjectId\/memberOf\" -AccessToken $AccessToken\n        foreach ($m in $memberOf) {\n            if ($m.'@odata.type' -eq '#microsoft.graph.directoryRole' -and $m.roleTemplateId -eq $globalAdminRoleTemplateId) {\n                return $true\n            }\n        }\n        return $false\n    } catch {\n        # Directory.Read.All missing or role membership not readable - leave unknown rather than assume safe.\n        return $null\n    }\n}\n\nif (-not $UserPrincipalName -and [Environment]::UserInteractive -and -not [Console]::IsInputRedirected) {\n    try { $UserPrincipalName = Read-Host \"Enter the UPN\/email you'll sign in with (optional, just a reminder)\" } catch { }\n}\n\nWrite-Host \"`n=== Sign in once (delegated, via your GDAP access) ===\" -ForegroundColor Cyan\nWrite-Host \"A browser sign-in window will open - sign in there with your own admin\/GDAP account.\" -ForegroundColor Cyan\nif ($UserPrincipalName) {\n    Write-Host \">>> Sign in as: $UserPrincipalName &lt;&lt;&lt;\" -ForegroundColor Magenta\n    Write-Host \"If the browser offers a different\/cached account, choose 'Use another account' and enter the above.\" -ForegroundColor Cyan\n}\nWrite-Host \"Use passkey\/Windows Hello there if you have one registered. This happens ONCE - every customer tenant after this is a silent token redemption, no further prompts.\" -ForegroundColor Cyan\n$auth = New-PartnerAccessToken -ApplicationId $graphClientId -Scopes $bootstrapScope -UseAuthorizationCode\nWrite-Host \"Signed in.\" -ForegroundColor Green\nWrite-Host \"Customer tenants to check: $($customers.Count)\" -ForegroundColor Green\n\n$refreshToken = $auth.RefreshToken\n\nWrite-Host \"`n=== ConnectWise vendor app check across $($customers.Count) GDAP customer tenant(s) ===\" -ForegroundColor Cyan\nWrite-Host \"Checking for $($knownVendorApps.Count) known-compromised ConnectWise AppId(s).\" -ForegroundColor Cyan\n\n$idx = 0\nforeach ($customer in $customers) {\n    $idx++\n    $tenantLabel = if ($customer.TenantName) { $customer.TenantName } else { $customer.TenantId }\n    Write-Host \"`n[$idx\/$($customers.Count)] $tenantLabel\" -ForegroundColor Yellow\n\n    $customerToken = $null\n    try {\n        $customerToken = New-PartnerAccessToken -ApplicationId $graphClientId -RefreshToken $refreshToken -Scopes $graphScope -Tenant $customer.TenantId -ErrorAction Stop\n    } catch {\n        Write-Host \"  Skipped - no Graph access via GDAP in this tenant: $($_.Exception.Message)\" -ForegroundColor DarkGray\n        Add-ErrorRow -TenantId $customer.TenantId -TenantName $tenantLabel -Message \"Token redemption failed: $($_.Exception.Message)\"\n        continue\n    }\n    # Refresh tokens can rotate on each redemption - always carry the newest one forward.\n    if ($customerToken.RefreshToken) { $refreshToken = $customerToken.RefreshToken }\n    $accessToken = $customerToken.AccessToken\n\n    foreach ($vendorApp in $knownVendorApps) {\n        try {\n            $sp = Invoke-GraphGet -Uri \"https:\/\/graph.microsoft.com\/v1.0\/servicePrincipals?`$filter=appId eq '$($vendorApp.AppId)'\" -AccessToken $accessToken | Select-Object -First 1\n        } catch {\n            Add-ErrorRow -TenantId $customer.TenantId -TenantName $tenantLabel -Message \"Lookup failed for AppId $($vendorApp.AppId): $($_.Exception.Message)\"\n            continue\n        }\n        if (-not $sp) { continue }\n\n        $isGA = Test-IsGlobalAdmin -ServicePrincipalObjectId $sp.id -AccessToken $accessToken\n        $severity = if ($isGA -eq $true) { 'CRITICAL - app has Global Administrator' } elseif ($null -eq $isGA) { 'Present - GA membership unknown (insufficient read access)' } else { 'Present' }\n\n        $findings.Add([pscustomobject]@{\n            TenantId               = $customer.TenantId\n            TenantName             = $tenantLabel\n            AppId                  = $vendorApp.AppId\n            VendorAppLabel         = $vendorApp.Label\n            ServicePrincipalName   = $sp.displayName\n            ServicePrincipalObjId  = $sp.id\n            AccountEnabled         = $sp.accountEnabled\n            IsGlobalAdministrator  = $isGA\n            Severity               = $severity\n            HuntressNote           = $vendorApp.Note\n        })\n        $color = if ($isGA -eq $true) { 'Red' } else { 'Yellow' }\n        Write-Host \"    [FOUND] $($vendorApp.Label) - $severity\" -ForegroundColor $color\n    }\n\n    if ($IncludeOtherConnectWiseApps) {\n        try {\n            $otherSPs = Invoke-GraphGet -Uri \"https:\/\/graph.microsoft.com\/v1.0\/servicePrincipals?`$filter=appOwnerOrganizationId eq $connectWiseTenantId&amp;`$count=true\" -AccessToken $accessToken\n            foreach ($sp in $otherSPs) {\n                if ($knownVendorApps.AppId -contains $sp.appId) { continue }\n                $findings.Add([pscustomobject]@{\n                    TenantId               = $customer.TenantId\n                    TenantName             = $tenantLabel\n                    AppId                  = $sp.appId\n                    VendorAppLabel         = '(other ConnectWise app - not a named IOC)'\n                    ServicePrincipalName   = $sp.displayName\n                    ServicePrincipalObjId  = $sp.id\n                    AccountEnabled         = $sp.accountEnabled\n                    IsGlobalAdministrator  = $null\n                    Severity               = 'Informational'\n                    HuntressNote           = ''\n                })\n            }\n        } catch {\n            Add-ErrorRow -TenantId $customer.TenantId -TenantName $tenantLabel -Message \"Other-ConnectWise-app lookup failed: $($_.Exception.Message)\"\n        }\n    }\n}\n\n$findings | Export-Csv -Path $reportPath -NoTypeInformation -Encoding UTF8\n$errors   | Export-Csv -Path $errorsPath -NoTypeInformation -Encoding UTF8\n\nWrite-Host \"`n=== Done ===\" -ForegroundColor Cyan\nWrite-Host \"Customer tenants checked       : $($customers.Count)\" -ForegroundColor Green\nWrite-Host \"Vendor app matches found       : $($findings.Count)\" -ForegroundColor $(if ($findings.Count -gt 0) { 'Red' } else { 'Green' })\nWrite-Host \"Tenants with a lookup error    : $($errors.Count)\" -ForegroundColor Yellow\nWrite-Host \"Report                         : $reportPath\" -ForegroundColor Green\nWrite-Host \"Errors log                     : $errorsPath\" -ForegroundColor Yellow\nif ($findings | Where-Object { $_.Severity -like 'CRITICAL*' }) {\n    Write-Host \"`nCRITICAL rows found - at least one vendor app holds Global Administrator in a customer tenant. Treat as an active incident, not routine triage.\" -ForegroundColor Red\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9972","post","type-post","status-publish","format-standard","hentry","category-research"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"paris\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Welcome to Pariswells.com |\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Check for Connectwise Entraprise apps across GDAP Tenant | Welcome to Pariswells.com\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-10-19T01:23:53+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-10-19T01:23:53+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Check for Connectwise Entraprise apps across GDAP Tenant | Welcome to Pariswells.com\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/research\\\/check-for-connectwise-entraprise-apps-across-gdap-tenant#article\",\"name\":\"Check for Connectwise Entraprise apps across GDAP Tenant | Welcome to Pariswells.com\",\"headline\":\"Check for Connectwise Entraprise apps across GDAP Tenant\",\"author\":{\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/author\\\/paris#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/#organization\"},\"datePublished\":\"2026-10-19T01:23:53+00:00\",\"dateModified\":\"2026-10-19T01:23:53+00:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/research\\\/check-for-connectwise-entraprise-apps-across-gdap-tenant#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/research\\\/check-for-connectwise-entraprise-apps-across-gdap-tenant#webpage\"},\"articleSection\":\"Research\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/research\\\/check-for-connectwise-entraprise-apps-across-gdap-tenant#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/category\\\/research#listItem\",\"name\":\"Research\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/category\\\/research#listItem\",\"position\":2,\"name\":\"Research\",\"item\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/category\\\/research\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/research\\\/check-for-connectwise-entraprise-apps-across-gdap-tenant#listItem\",\"name\":\"Check for Connectwise Entraprise apps across GDAP Tenant\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/research\\\/check-for-connectwise-entraprise-apps-across-gdap-tenant#listItem\",\"position\":3,\"name\":\"Check for Connectwise Entraprise apps across GDAP Tenant\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/category\\\/research#listItem\",\"name\":\"Research\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/#organization\",\"name\":\"Welcome to Pariswells.com\",\"url\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/author\\\/paris#author\",\"url\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/author\\\/paris\",\"name\":\"paris\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/research\\\/check-for-connectwise-entraprise-apps-across-gdap-tenant#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/93b8ee3f592ac401167f870452bd82d43de80152cd3524e2853403658ada9984?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"paris\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/research\\\/check-for-connectwise-entraprise-apps-across-gdap-tenant#webpage\",\"url\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/research\\\/check-for-connectwise-entraprise-apps-across-gdap-tenant\",\"name\":\"Check for Connectwise Entraprise apps across GDAP Tenant | Welcome to Pariswells.com\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/research\\\/check-for-connectwise-entraprise-apps-across-gdap-tenant#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/author\\\/paris#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/author\\\/paris#author\"},\"datePublished\":\"2026-10-19T01:23:53+00:00\",\"dateModified\":\"2026-10-19T01:23:53+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/\",\"name\":\"Welcome to Pariswells.com\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/pariswells.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Check for Connectwise Entraprise apps across GDAP Tenant | Welcome to Pariswells.com","description":"","canonical_url":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant#article","name":"Check for Connectwise Entraprise apps across GDAP Tenant | Welcome to Pariswells.com","headline":"Check for Connectwise Entraprise apps across GDAP Tenant","author":{"@id":"https:\/\/pariswells.com\/blog\/author\/paris#author"},"publisher":{"@id":"https:\/\/pariswells.com\/blog\/#organization"},"datePublished":"2026-10-19T01:23:53+00:00","dateModified":"2026-10-19T01:23:53+00:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant#webpage"},"isPartOf":{"@id":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant#webpage"},"articleSection":"Research"},{"@type":"BreadcrumbList","@id":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/pariswells.com\/blog\/#listItem","position":1,"name":"Home","item":"https:\/\/pariswells.com\/blog\/","nextItem":{"@type":"ListItem","@id":"https:\/\/pariswells.com\/blog\/category\/research#listItem","name":"Research"}},{"@type":"ListItem","@id":"https:\/\/pariswells.com\/blog\/category\/research#listItem","position":2,"name":"Research","item":"https:\/\/pariswells.com\/blog\/category\/research","nextItem":{"@type":"ListItem","@id":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant#listItem","name":"Check for Connectwise Entraprise apps across GDAP Tenant"},"previousItem":{"@type":"ListItem","@id":"https:\/\/pariswells.com\/blog\/#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant#listItem","position":3,"name":"Check for Connectwise Entraprise apps across GDAP Tenant","previousItem":{"@type":"ListItem","@id":"https:\/\/pariswells.com\/blog\/category\/research#listItem","name":"Research"}}]},{"@type":"Organization","@id":"https:\/\/pariswells.com\/blog\/#organization","name":"Welcome to Pariswells.com","url":"https:\/\/pariswells.com\/blog\/"},{"@type":"Person","@id":"https:\/\/pariswells.com\/blog\/author\/paris#author","url":"https:\/\/pariswells.com\/blog\/author\/paris","name":"paris","image":{"@type":"ImageObject","@id":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/93b8ee3f592ac401167f870452bd82d43de80152cd3524e2853403658ada9984?s=96&d=mm&r=g","width":96,"height":96,"caption":"paris"}},{"@type":"WebPage","@id":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant#webpage","url":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant","name":"Check for Connectwise Entraprise apps across GDAP Tenant | Welcome to Pariswells.com","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/pariswells.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant#breadcrumblist"},"author":{"@id":"https:\/\/pariswells.com\/blog\/author\/paris#author"},"creator":{"@id":"https:\/\/pariswells.com\/blog\/author\/paris#author"},"datePublished":"2026-10-19T01:23:53+00:00","dateModified":"2026-10-19T01:23:53+00:00"},{"@type":"WebSite","@id":"https:\/\/pariswells.com\/blog\/#website","url":"https:\/\/pariswells.com\/blog\/","name":"Welcome to Pariswells.com","inLanguage":"en-US","publisher":{"@id":"https:\/\/pariswells.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Welcome to Pariswells.com |","og:type":"article","og:title":"Check for Connectwise Entraprise apps across GDAP Tenant | Welcome to Pariswells.com","og:url":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant","article:published_time":"2026-10-19T01:23:53+00:00","article:modified_time":"2026-10-19T01:23:53+00:00","twitter:card":"summary","twitter:title":"Check for Connectwise Entraprise apps across GDAP Tenant | Welcome to Pariswells.com"},"aioseo_meta_data":{"post_id":"9972","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-10-19 01:23:26","updated":"2026-10-19 01:23:53","primary_term":null,"seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/pariswells.com\/blog\/\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/pariswells.com\/blog\/category\/research\" title=\"Research\">Research<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tCheck for Connectwise Entraprise apps across GDAP Tenant\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/pariswells.com\/blog\/"},{"label":"Research","link":"https:\/\/pariswells.com\/blog\/category\/research"},{"label":"Check for Connectwise Entraprise apps across GDAP Tenant","link":"https:\/\/pariswells.com\/blog\/research\/check-for-connectwise-entraprise-apps-across-gdap-tenant"}],"_links":{"self":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts\/9972","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/comments?post=9972"}],"version-history":[{"count":1,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts\/9972\/revisions"}],"predecessor-version":[{"id":9973,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts\/9972\/revisions\/9973"}],"wp:attachment":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/media?parent=9972"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/categories?post=9972"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/tags?post=9972"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}