Краткое описание
Скрипт автоматически развёртывает пользовательское представление (Custom View) в Windows Event Viewer на выбранных серверах. Представление позволяет централизованно просматривать события компонентов Cisco ICM, отфильтрованные по необходимым источникам журналов, без ручной настройки каждого сервера.
Скрипт поддерживает автоматический поиск серверов в Active Directory, выбор конкретных серверов или интерактивный режим с выбором из списка. Развёртывание выполняется удалённо через PowerShell Remoting (WinRM) с сохранением стандартных разрешений файлов Windows.
Назначение
Используется для автоматизации создания единого пользовательского представления журналов событий Cisco ICM на серверах инфраструктуры B и X.
После выполнения на сервере создаётся файл:
%ProgramData%\Microsoft\Event Viewer\Views\CiscoSystemsIncICMCustomView.xml
который автоматически отображается в разделе Custom Views оснастки Event Viewer.
Представление включает события следующих источников:
- Cisco Contact Center SNMP Management
- Cisco ICM Diagnostic Framework
- Cisco Systems, Inc. ICM
и исключает события:
- Event ID 49201
- Event ID 49202
Основные возможности
- автоматический поиск серверов в Active Directory;
- поддержка режимов Test, All и Interactive;
- удалённое развёртывание через WinRM;
- режим предварительной проверки (WhatIf);
- автоматическое создание каталога Views, если он отсутствует;
- сохранение стандартных ACL (без изменения разрешений файла);
- отображение результатов выполнения по каждому серверу.
Требования
- PowerShell 5.1 или выше;
- установленный модуль ActiveDirectory (RSAT);
- включённый PowerShell Remoting (WinRM) на целевых серверах;
- права локального администратора на целевых серверах;
- учётная запись с правами, достаточными для удалённого выполнения команд (например, Domain Admins).
Результат выполнения
После успешного запуска на каждом выбранном сервере появляется пользовательское представление Cisco Systems, Inc. ICM Custom View, доступное в разделе Event Viewer → Custom Views, что обеспечивает единый способ просмотра диагностических событий Cisco ICM на всех серверах инфраструктуры.
<#
.SYNOPSIS
Развёртывание Custom View "Cisco Systems, Inc. ICM Custom View" на серверах GRB/OVX.
Файл создаётся с правами по умолчанию (наследуются от папки Views).
.DESCRIPTION
Скрипт запускается напрямую (F5 / .\Deploy-CiscoCustomView.ps1), без параметров.
Всё управление — через переменные в блоке "НАСТРОЙКИ" ниже.
Режимы выбора серверов ($SelectionMode):
'Test' - использовать список $TestServers (ручной ввод конкретных серверов)
'All' - применить сразу ко всем серверам GRB*/OVX*, найденным в AD
'Interactive' - найти серверы в AD и показать окно выбора (Out-GridView)
.NOTES
Требования:
- Модуль ActiveDirectory (RSAT) на машине, с которой запускается скрипт.
- Права локального администратора на целевых серверах (запись файла, Set-Acl).
- Включённый WinRM на целевых серверах (Enable-PSRemoting).
- Запуск от учётки, входящей в Domain Admins (или с эквивалентными правами).
#>
# ============================== НАСТРОЙКИ ==============================
# Режим выбора серверов: 'Test', 'All' или 'Interactive'
$SelectionMode = 'All'
# Список серверов для режима 'Test' (укажите один или несколько)
$TestServers = @('B01')
# Пример нескольких серверов:
# $TestServers = @('B01', 'X02')
# OU для поиска в AD (DistinguishedName). Пусто = искать по всему домену.
$SearchBase = ''
# Маски имён серверов для поиска в AD
$ServerNamePatterns = @('*')
# Только реально проверить и вывести список действий, без применения изменений
$WhatIfMode = $false
# Название представления и имя файла
$ViewName = 'Cisco Systems, Inc. ICM Custom View'
$FileName = 'CiscoSystemsIncICMCustomView.xml'
# Содержимое Custom View (полный формат ViewerConfig - именно так Windows сохраняет
# пользовательские представления, чтобы они появлялись в дереве Custom Views с именем)
$XmlContent = @"
<ViewerConfig>
<QueryConfig>
<QueryParams>
<UserQuery />
</QueryParams>
<QueryNode>
<Name>$ViewName</Name>
<QueryList>
<Query Id="0" Path="Application">
<Select Path="Application">*[System[Provider[@Name='Cisco Contact Center SNMP Management' or @Name='Cisco ICM Diagnostic Framework' or @Name='Cisco Systems, Inc. ICM'] and (Level=1 or Level=2 or Level=3 or Level=4 or Level=0 or Level=5)]]</Select>
<Suppress Path="Application">*[System[(EventID=49202) or (EventID=49201)]]</Suppress>
</Query>
</QueryList>
</QueryNode>
</QueryConfig>
</ViewerConfig>
"@
# ============================ КОНЕЦ НАСТРОЕК ============================
Import-Module ActiveDirectory -ErrorAction Stop
function Get-CiscoTargetServers {
param(
[string]$SearchBase,
[string[]]$NamePatterns
)
$nameFilter = ($NamePatterns | ForEach-Object { "Name -like '$_'" }) -join ' -or '
$filter = "($nameFilter) -and (Enabled -eq 'True')"
$params = @{
Filter = $filter
Properties = 'OperatingSystem'
}
if ($SearchBase) { $params['SearchBase'] = $SearchBase }
Get-ADComputer @params |
Where-Object { $_.OperatingSystem -match 'Server' } |
Select-Object -ExpandProperty Name |
Sort-Object
}
function Deploy-CiscoCustomView {
param(
[Parameter(Mandatory)][string]$ComputerName,
[Parameter(Mandatory)][string]$XmlContent,
[Parameter(Mandatory)][string]$FileName,
[switch]$WhatIfMode
)
Write-Host "==> $ComputerName" -ForegroundColor Cyan
if ($WhatIfMode) {
Write-Host " [WhatIf] Будет записан файл (права по умолчанию, наследуемые от папки)" -ForegroundColor DarkYellow
return [pscustomobject]@{ Server = $ComputerName; Status = 'WhatIf - не применялось' }
}
if (-not (Test-Connection -ComputerName $ComputerName -Count 1 -Quiet)) {
Write-Warning "$ComputerName недоступен (ping). Пропуск."
return [pscustomobject]@{ Server = $ComputerName; Status = 'Unreachable' }
}
try {
Invoke-Command -ComputerName $ComputerName -ScriptBlock {
param($XmlContent, $FileName)
$viewsFolder = Join-Path $env:ProgramData 'Microsoft\Event Viewer\Views'
if (-not (Test-Path $viewsFolder)) {
New-Item -Path $viewsFolder -ItemType Directory -Force | Out-Null
}
$filePath = Join-Path $viewsFolder $FileName
Set-Content -Path $filePath -Value $XmlContent -Encoding UTF8 -Force
# Права на файл не переопределяются - остаются по умолчанию (наследуются от папки Views)
[pscustomobject]@{
Server = $env:COMPUTERNAME
Path = $filePath
Status = 'OK'
}
} -ArgumentList $XmlContent, $FileName
}
catch {
Write-Warning "Ошибка на $ComputerName : $($_.Exception.Message)"
[pscustomobject]@{ Server = $ComputerName; Status = "Error: $($_.Exception.Message)" }
}
}
# ================================ ЗАПУСК ================================
switch ($SelectionMode) {
'Test' {
$targets = $TestServers
Write-Host "Режим: Test. Серверы -> $($targets -join ', ')" -ForegroundColor Yellow
}
'All' {
$found = Get-CiscoTargetServers -SearchBase $SearchBase -NamePatterns $ServerNamePatterns
if (-not $found) {
Write-Warning 'В AD не найдено серверов, подходящих под маски GRB*/OVX*.'
return
}
Write-Host "Режим: All. Найдено в AD: $($found.Count) серверов" -ForegroundColor Yellow
$found | ForEach-Object { Write-Host " $_" }
$targets = $found
}
'Interactive' {
$found = Get-CiscoTargetServers -SearchBase $SearchBase -NamePatterns $ServerNamePatterns
if (-not $found) {
Write-Warning 'В AD не найдено серверов, подходящих под маски GRB*/OVX*.'
return
}
Write-Host 'Найдено в AD:' -ForegroundColor Green
$found | ForEach-Object { Write-Host " $_" }
$targets = $found | Out-GridView -Title 'Выберите сервер(ы) для развёртывания' -PassThru
if (-not $targets) {
Write-Host 'Ничего не выбрано. Выход.' -ForegroundColor Yellow
return
}
}
default {
throw "Неизвестный SelectionMode: '$SelectionMode'. Допустимые значения: Test, All, Interactive."
}
}
$results = foreach ($server in $targets) {
Deploy-CiscoCustomView -ComputerName $server -XmlContent $XmlContent -FileName $FileName -WhatIfMode:$WhatIfMode
}
$results | Format-Table -AutoSize