Geräte-Tab: serverseitige Suche via Graph API
Suche ruft bei jeder Eingabe die API auf statt lokal zu filtern. Seriennummer wird per exaktem eq-Filter parallel gesucht und mit Namens-Treffern zusammengeführt (Graph unterstützt kein startswith auf serialNumber). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+44
-13
@@ -1544,23 +1544,54 @@ function Search-DevicesEndpoint {
|
||||
$q = [string]$Query.q
|
||||
$os = [string]$Query.os
|
||||
$compliance = [string]$Query.compliance
|
||||
$top = 100
|
||||
$top = 50
|
||||
|
||||
$filters = @()
|
||||
if ($q -and $q.Length -ge 2) {
|
||||
$qEnc = [uri]::EscapeDataString($q)
|
||||
$filters += "(startswith(deviceName,'$q') or startswith(userDisplayName,'$q') or startswith(serialNumber,'$q'))"
|
||||
}
|
||||
if ($os) { $filters += "operatingSystem eq '$os'" }
|
||||
if ($compliance) { $filters += "complianceState eq '$compliance'" }
|
||||
|
||||
$filterStr = if ($filters.Count -gt 0) { '$filter=' + [uri]::EscapeDataString(($filters -join ' and ')) + '&' } else { '' }
|
||||
$select = 'id,deviceName,userDisplayName,userPrincipalName,operatingSystem,osVersion,complianceState,lastSyncDateTime,managementState,serialNumber,model,manufacturer,enrolledDateTime'
|
||||
$uri = "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices?${filterStr}`$select=$select&`$top=$top&`$orderby=deviceName"
|
||||
|
||||
# Ohne Suchbegriff: alle Geräte (erste Seite)
|
||||
# Mit Suchbegriff: Graph unterstuetzt startswith nur auf deviceName/userDisplayName/userPrincipalName.
|
||||
# Seriennummer wird separat per exaktem Filter gesucht und mit Name-Ergebnissen zusammengefuehrt.
|
||||
$nameItems = @()
|
||||
$snItems = @()
|
||||
|
||||
if ($q -and $q.Length -ge 2) {
|
||||
$filters = @()
|
||||
$nameFilter = "(startswith(deviceName,'$q') or startswith(userDisplayName,'$q') or startswith(userPrincipalName,'$q'))"
|
||||
$filters += $nameFilter
|
||||
if ($os) { $filters += "operatingSystem eq '$os'" }
|
||||
if ($compliance) { $filters += "complianceState eq '$compliance'" }
|
||||
$filterStr = '$filter=' + [uri]::EscapeDataString(($filters -join ' and ')) + '&'
|
||||
$uri = "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices?${filterStr}`$select=$select&`$top=$top&`$orderby=deviceName"
|
||||
$resp = Invoke-MgGraphRequestRetry -Uri $uri -Method GET
|
||||
$nameItems = @($resp.value)
|
||||
|
||||
# Seriennummer: exakter Vergleich (Graph unterstuetzt kein startswith auf serialNumber)
|
||||
$snFilters = @("serialNumber eq '$q'")
|
||||
if ($os) { $snFilters += "operatingSystem eq '$os'" }
|
||||
if ($compliance) { $snFilters += "complianceState eq '$compliance'" }
|
||||
$snFilter = '$filter=' + [uri]::EscapeDataString(($snFilters -join ' and ')) + '&'
|
||||
$snUri = "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices?${snFilter}`$select=$select&`$top=10"
|
||||
try {
|
||||
$snResp = Invoke-MgGraphRequestRetry -Uri $snUri -Method GET
|
||||
$snItems = @($snResp.value)
|
||||
} catch { $snItems = @() }
|
||||
} else {
|
||||
$filters = @()
|
||||
if ($os) { $filters += "operatingSystem eq '$os'" }
|
||||
if ($compliance) { $filters += "complianceState eq '$compliance'" }
|
||||
$filterStr = if ($filters.Count -gt 0) { '$filter=' + [uri]::EscapeDataString(($filters -join ' and ')) + '&' } else { '' }
|
||||
$uri = "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices?${filterStr}`$select=$select&`$top=$top&`$orderby=deviceName"
|
||||
$resp = Invoke-MgGraphRequestRetry -Uri $uri -Method GET
|
||||
$nameItems = @($resp.value)
|
||||
}
|
||||
|
||||
# Zusammenfuehren, Duplikate entfernen
|
||||
$seen = @{}
|
||||
$all = @($nameItems) + @($snItems)
|
||||
$items = @()
|
||||
$resp = Invoke-MgGraphRequestRetry -Uri $uri -Method GET
|
||||
foreach ($d in $resp.value) {
|
||||
foreach ($d in $all) {
|
||||
if (-not $d.id -or $seen[$d.id]) { continue }
|
||||
$seen[$d.id] = $true
|
||||
$items += [pscustomobject]@{
|
||||
Id = $d.id
|
||||
DeviceName = $d.deviceName
|
||||
|
||||
Reference in New Issue
Block a user