Files
claudetools/scripts/syncro-update-sc-properties.ps1
Mike Swanson e34f51fe5d Session 2026-03-30: SOPS vault, SC-Syncro sync, Syncro scripts
- SOPS+age credential vault created (59 encrypted files, separate repo)
- Updated CLAUDE.md credential access to reference SOPS vault
- Updated memory for ACG-5070 (Windows 11, replaces CachyOS)
- SC-Syncro sync script: enriched 410 SC sessions with company/device data
- Syncro scripts: SC property updater, SC deployer, rogue SC killer
- Session log with full details

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 19:38:38 -07:00

95 lines
3.9 KiB
PowerShell

# Syncro Script: Update ScreenConnect Session Properties via RESTful API
#
# Runs on each machine to self-report its company/device info to ScreenConnect.
# Designed to run on a schedule (e.g., daily) alongside other maintenance scripts.
#
# Syncro Platform Variables (set in script editor):
# $OrgName - platform - {{customer_business_name_or_customer_name}}
#
# File Type: PowerShell | Run as: System | Max Run Time: 5 minutes
Import-Module $env:SyncroModule
# ============================================================================
# Configuration
# ============================================================================
$SCBaseUrl = "https://computerguru.screenconnect.com"
$SCExtGuid = "2d558935-686a-4bd0-9991-07539f5fe749"
$SCAuthSecret = "FTnl15dK1uaKCOeFzkO1UnjGqpgtqCA5vRExWeXT38LjAV4vF9W/mYf8GpCyqlAv"
# ============================================================================
# Check if ScreenConnect is installed
# ============================================================================
$SCService = Get-Service -Name "ScreenConnect Client*" -ErrorAction SilentlyContinue
if (-not $SCService) {
Write-Host "ScreenConnect not installed - skipping."
exit 0
}
# ============================================================================
# Extract session GUID from service name
# ============================================================================
# Service name format: "ScreenConnect Client (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)"
$guidMatch = $SCService.Name | Select-String -Pattern '\(([0-9a-f\-]{36})\)' -AllMatches
if (-not $guidMatch -or -not $guidMatch.Matches) {
Write-Host "Could not extract session GUID from service: $($SCService.Name)"
exit 1
}
$SessionGuid = $guidMatch.Matches[0].Groups[1].Value
Write-Host "SC Session GUID: $SessionGuid"
# ============================================================================
# Determine device type
# ============================================================================
$DeviceType = "Desktop"
try {
$chassis = (Get-CimInstance -ClassName Win32_SystemEnclosure).ChassisTypes
if ($chassis | Where-Object { $_ -in @(8,9,10,11,12,14,18,21,31,32) }) { $DeviceType = "Laptop" }
if ($chassis | Where-Object { $_ -in @(17,23) }) { $DeviceType = "Server" }
$model = (Get-CimInstance -ClassName Win32_ComputerSystem).Model
if ($model -match "Virtual|VMware|VirtualBox|Hyper-V|KVM|Xen") { $DeviceType = "Virtual $DeviceType" }
} catch {
Write-Host "Could not detect device type, defaulting to Desktop"
}
# ============================================================================
# Build and send API request
# ============================================================================
$Company = if ([string]::IsNullOrWhiteSpace($OrgName)) { "Unassigned" } else { $OrgName }
Write-Host "Updating SC: Company='$Company', DeviceType='$DeviceType', Tag='Syncro-Matched'"
# CP1=Company, CP2=Site, CP3=Department, CP4=DeviceType, CP5=Tag, CP6-8=blank
$body = ConvertTo-Json @(
$SessionGuid,
@($Company, "", "", $DeviceType, "Syncro-Matched", "", "", "")
) -Compress
$url = "$SCBaseUrl/App_Extensions/$SCExtGuid/Service.ashx/UpdateSessionCustomProperties"
try {
$response = Invoke-WebRequest -Uri $url -Method POST -Body $body -ContentType "application/json" -Headers @{
"CTRLAuthHeader" = $SCAuthSecret
"Origin" = $SCBaseUrl
} -UseBasicParsing -ErrorAction Stop
if ($response.StatusCode -eq 200) {
Write-Host "Success - SC session updated."
Log-Activity -Message "SC Properties: $Company / $DeviceType" -EventName "ScreenConnect"
} else {
Write-Host "Unexpected status: $($response.StatusCode)"
Write-Host $response.Content
}
} catch {
$err = $_.Exception.Message
Write-Host "API call failed: $err"
Log-Activity -Message "SC Properties FAILED: $err" -EventName "ScreenConnect"
exit 1
}