feat(windows): add install kit and stabilize dlp print document matching
This commit is contained in:
@@ -402,6 +402,64 @@ function Test-LooksLikeMojibakeQuestionMarks {
|
||||
return $Value -match '\?{2,}'
|
||||
}
|
||||
|
||||
function Normalize-OwnerForMatch {
|
||||
param([AllowNull()][string]$Value)
|
||||
if ([string]::IsNullOrWhiteSpace($Value)) { return '' }
|
||||
$normalized = $Value.Trim().ToLowerInvariant()
|
||||
if ($normalized -match '[\\/]') {
|
||||
$parts = $normalized -split '[\\/]'
|
||||
if ($parts.Count -gt 0) {
|
||||
$normalized = [string]$parts[$parts.Count - 1]
|
||||
}
|
||||
}
|
||||
if ($normalized -match '@') {
|
||||
$parts = $normalized -split '@'
|
||||
if ($parts.Count -gt 0) {
|
||||
$normalized = [string]$parts[0]
|
||||
}
|
||||
}
|
||||
return $normalized
|
||||
}
|
||||
|
||||
function Test-OwnerLooseMatch {
|
||||
param(
|
||||
[string]$Expected,
|
||||
[string]$Actual
|
||||
)
|
||||
$expectedNorm = Normalize-OwnerForMatch -Value $Expected
|
||||
$actualNorm = Normalize-OwnerForMatch -Value $Actual
|
||||
if ([string]::IsNullOrWhiteSpace($expectedNorm) -or [string]::IsNullOrWhiteSpace($actualNorm)) {
|
||||
return $false
|
||||
}
|
||||
return ($actualNorm -eq $expectedNorm) -or $actualNorm.Contains($expectedNorm) -or $expectedNorm.Contains($actualNorm)
|
||||
}
|
||||
|
||||
function Normalize-PrinterForMatch {
|
||||
param([AllowNull()][string]$Value)
|
||||
if ([string]::IsNullOrWhiteSpace($Value)) { return '' }
|
||||
$normalized = $Value.Trim().ToLowerInvariant()
|
||||
if ($normalized.Contains(',')) {
|
||||
$normalized = ($normalized -split ',', 2)[0].Trim()
|
||||
}
|
||||
if ($normalized -match '\son\s') {
|
||||
$normalized = ($normalized -split '\son\s', 2)[0].Trim()
|
||||
}
|
||||
return $normalized
|
||||
}
|
||||
|
||||
function Test-PrinterLooseMatch {
|
||||
param(
|
||||
[string]$Expected,
|
||||
[string]$Actual
|
||||
)
|
||||
$expectedNorm = Normalize-PrinterForMatch -Value $Expected
|
||||
$actualNorm = Normalize-PrinterForMatch -Value $Actual
|
||||
if ([string]::IsNullOrWhiteSpace($expectedNorm) -or [string]::IsNullOrWhiteSpace($actualNorm)) {
|
||||
return $false
|
||||
}
|
||||
return ($actualNorm -eq $expectedNorm) -or $actualNorm.Contains($expectedNorm) -or $expectedNorm.Contains($actualNorm)
|
||||
}
|
||||
|
||||
function Get-PrintServiceEventSummary {
|
||||
param([Parameter(Mandatory = $true)]$Event)
|
||||
|
||||
@@ -515,32 +573,40 @@ function Get-BetterDocumentNameFromPrintServiceEvents {
|
||||
StartTime = $startTime
|
||||
} -MaxEvents 200 -ErrorAction Stop
|
||||
|
||||
foreach ($event in @($events)) {
|
||||
$summary = Get-PrintServiceEventSummary -Event $event
|
||||
$matchReason = 'scan'
|
||||
$resolvedDocument = Get-PrintServiceDocumentFallback -EventSummary $summary -Owner $Owner -PrinterName $PrinterName
|
||||
foreach ($pass in @('strict', 'relaxed')) {
|
||||
foreach ($event in @($events)) {
|
||||
$summary = Get-PrintServiceEventSummary -Event $event
|
||||
$resolvedDocument = Get-PrintServiceDocumentFallback -EventSummary $summary -Owner $Owner -PrinterName $PrinterName
|
||||
|
||||
if ($Owner -and $summary.Owner -and ($summary.Owner -notlike "*$Owner*")) {
|
||||
$matchReason = 'owner-mismatch'
|
||||
Write-PrintServiceEventTrace -EventSummary $summary -Phase 'scan' -MatchReason $matchReason -ResolvedDocument $resolvedDocument
|
||||
continue
|
||||
$ownerMatches = if ($Owner) { Test-OwnerLooseMatch -Expected $Owner -Actual $summary.Owner } else { $true }
|
||||
$printerMatches = if ($PrinterName) { Test-PrinterLooseMatch -Expected $PrinterName -Actual $summary.PrinterName } else { $true }
|
||||
|
||||
if ($pass -eq 'strict') {
|
||||
if ($Owner -and -not $ownerMatches) {
|
||||
Write-PrintServiceEventTrace -EventSummary $summary -Phase 'scan' -MatchReason 'owner-mismatch-strict' -ResolvedDocument $resolvedDocument
|
||||
continue
|
||||
}
|
||||
if ($PrinterName -and -not $printerMatches) {
|
||||
Write-PrintServiceEventTrace -EventSummary $summary -Phase 'scan' -MatchReason 'printer-mismatch-strict' -ResolvedDocument $resolvedDocument
|
||||
continue
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ($Owner -and $PrinterName -and -not $ownerMatches -and -not $printerMatches) {
|
||||
Write-PrintServiceEventTrace -EventSummary $summary -Phase 'scan' -MatchReason 'owner-and-printer-mismatch-relaxed' -ResolvedDocument $resolvedDocument
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
if ([string]::IsNullOrWhiteSpace($resolvedDocument)) {
|
||||
Write-PrintServiceEventTrace -EventSummary $summary -Phase 'scan' -MatchReason ('no-document-candidate-' + $pass) -ResolvedDocument ''
|
||||
continue
|
||||
}
|
||||
|
||||
$matchReasonBase = if (Test-LooksLikeMojibakeQuestionMarks -Value $summary.DocumentName) { 'fallback-used' } else { 'direct' }
|
||||
Write-PrintServiceEventTrace -EventSummary $summary -Phase 'selected' -MatchReason ($matchReasonBase + '-' + $pass) -ResolvedDocument $resolvedDocument
|
||||
return $resolvedDocument
|
||||
}
|
||||
|
||||
if ($PrinterName -and $summary.PrinterName -and ($summary.PrinterName -notlike "*$PrinterName*")) {
|
||||
$matchReason = 'printer-mismatch'
|
||||
Write-PrintServiceEventTrace -EventSummary $summary -Phase 'scan' -MatchReason $matchReason -ResolvedDocument $resolvedDocument
|
||||
continue
|
||||
}
|
||||
|
||||
if ([string]::IsNullOrWhiteSpace($resolvedDocument)) {
|
||||
$matchReason = 'no-document-candidate'
|
||||
Write-PrintServiceEventTrace -EventSummary $summary -Phase 'scan' -MatchReason $matchReason -ResolvedDocument ''
|
||||
continue
|
||||
}
|
||||
|
||||
$matchReason = if (Test-LooksLikeMojibakeQuestionMarks -Value $summary.DocumentName) { 'fallback-used' } else { 'direct' }
|
||||
Write-PrintServiceEventTrace -EventSummary $summary -Phase 'selected' -MatchReason $matchReason -ResolvedDocument $resolvedDocument
|
||||
return $resolvedDocument
|
||||
}
|
||||
}
|
||||
catch {
|
||||
|
||||
Reference in New Issue
Block a user