Синопсис:
Есть два сервера приложений 1С на Windows, на каждом сервере по несколько служб 1С, на каждой службе 1С по одному локальному кластеру; между двумя серверами локальные кластеры собраны в кластеры из двух центральных серверов, уровень отказоустойчивости 0.
Требование:
Поставлена задача, чтобы журнал регистрации писался только на первом сервере приложений. Все просто. И как было бы круто просто настроить на первом сервере ТНФ «Сервис журналов регистрации» с типом «Назначать», а на втором это же требование с типом «Не назначать». Но если первый сервер будет выключен, то это ТНФ убьет всю отказоустойчивость, пользователи не смогут зайти на второй сервер т.к. журнал регистрации на него запрещено писать.
Кажется, опять все просто, на первом сервере для ТНФ «Сервис журналов регистрации» нужно поставить тип «Назначать», приоритет 1; на втором сервере для ТНФ «Сервис журналов регистрации» нужно поставить тип «Назначать», приоритет 0. Тогда посте применения ТНФ журнал регистрации пишется на первый сервер, а если первый сервер выключить, то начинает писаться на второй. НО когда первый сервер будет включен то журнал регистрации так и будет писаться на второй сервер, пока снова не применить ТНФ. Вот этот момент отслеживать и тыкать руками применение не очень-то прикольно, поэтому был создан скрипт на PowerShell, который, по расписанию в планировщике Windows, обходит все кластера 1С на сервере и применяет ТНФ.
При желании скрипт можно легко переделать на применение ТНФ не для всех кластеров сервера, а для конкретного. Так же легко изменить его назначение, заменив код применяющий ТНФ на любые другие команды сервера администрирования(rac.exe –help).
Важно: 1. писал выше, но повторюсь, чтобы скрипт работал, нужно чтобы для каждой службы 1С была создана служба RAS. Как создавать службу RAS, что это такое и как ей пользоваться есть статья //infostart.ru/1c/articles/810752/, но если потребуются пояснения, примеры и т.п. то пишите в комментарии.
2. Скрипт нужно добавить в планировщик.
Всем спасибо!
Скрипт:
cls
&chcp 1251
$srv_name = Get-WmiObject -Class win32_ComputerSystem | select name
$hostras = $srv_name.name
$rasservers = gwmi win32_service -Filter "PathName like '%ras.exe%'" | select PathName #получить все службы RAS
#получить параметры служб RAS с помощью регулярных выражений
$rasmas = $rasservers | select `
"-",
@{N="RasPort";E={[regex]::match($_.PathName,"(?<=--port=)\d+").value}},
@{N="BinaryPath";E={[regex]::match($_.PathName,"^.*ras.exe").value -replace "`"",""}},
@{N="RacBin";E={([regex]::match($_.PathName,"^.*ras.exe").value -replace "`"","" -replace "ras.exe", "rac.exe")}},
@{N="HostPort";E={("$hostras`:"+[regex]::match($_.PathName,"(?<=--port=)\d+").value)}},
#получить id кластеров
@{N="Clusters";E={[regex]::Matches((&([regex]::match($_.PathName,"^.*ras.exe").value -replace "`"","" -replace "ras.exe", "rac.exe") ('cluster') ("$hostras`:"+[regex]::match($_.PathName,"(?<=--port=)\d+").value) ("list")|out-string),"[0-9a-fA-F]{8}[-][0-9a-fA-F]{4}[-][0-9a-fA-F]{4}[-][0-9a-fA-F]{4}[-][0-9a-fA-F]{12}")}},
@{N="PathName";E={$_.PathName}}
$rasmas
#обход полученных кластеров ras
foreach($ras in $rasmas){
foreach($clust in $ras.clusters){
$adr = ""; $adr = $ras.HostPort
$cluster = ""; $cluster = "--cluster="+$clust.Value
$adr
$cluster
#применение ТНФ
&$ras.RacBin 'rule' $adr $cluster 'apply' --full
}
}