Перейти к содержимому

Как развернуть пользовательского представления Event Viewer «Cisco Systems, Inc. ICM Custom View» на серверах в ad

Краткое описание

Скрипт автоматически развёртывает пользовательское представление (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;
  • поддержка режимов TestAll и 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

 

Similar Posts:

Метки:

Добавить комментарий

Яндекс.Метрика