Error Veeam Backup and Replication: «Unable get OIB by id»

Неожиданно на агентском задании бекапа SQL-кластера в Veeam BR 9.5 Update 4 возникла ошибка «Error: Unable get OIB by id ‘f3d18c39-7ff7-4524-b1db-e862719c6230’ «. Ошибка не хотела пропадать даже после создания нового задания. Пришлось обратиться в техническую поддержку Veeam за помощью и вот что они предложили сделать:
1) Выполняем SQL запрос для конфигурационной базы Veeam:
select * FROM [dbo].[Backup.Model.OibsWithAlwaysOnGroups] where oib_id=’f3d18c39-7ff7-4524-b1db-e862719c6230’
должен вывести проблемную точку восстановления
2) Выполняем SQL запрос delete [dbo].[Backup.Model.OibsWithAlwaysOnGroups] where oib_id=’f3d18c39-7ff7-4524-b1db-e862719c6230′ -для удаления проблемной точки восстановления из цепочки.
3) Делаем рескан репозитория, где хранятся резервные копии проблемного задания бекапа и после снова запускаем задание.
После проделанных действий ошибка пропала и бекап снова стал выполняться.

Ошибка «FC initiators list is empty» в Veeam Backup & Replication 9.5 Update 4

После обновления Veeam BR до обновления Update 4 стала появляться периодически ошибка «При бекапе виртуальной машины возникает ошибка «FC initiators list is empty«.

Причина: данная проблема возникает после установки Update 4, если в инфраструктуре используется хранилище Dell EMC Unity и когда в задании резервного копирования используется настройка «Автоматический выбор прокси-сервера».

Решение: на сервере Veeam BR необходимо создать ключ в реестре. В следующем обновлении Veeam данная проблема должна быть решена и ключ в реестре нужно будет удалить.

  1. Запускаем regedit
  2. Открываем ветку реестра HKEY_LOCAL_MACHINE\SOFTWARE\Veeam\Veeam Backup and Replication\
  3. Создаем ключ типа REG_DWORD с названием EMCUseUnityApi и со значением 0.


Недоступно RDP-подключение на Windows Server 2003

После установки родного от Microsoft iSCSI-инициатора на английский windows-сервер 2003R2 SE SP2 x64 возникла проблема — неожиданно пропал доступ к серверу по RDP. Перезагрузка сервера не помогала. Включение/выключение удаленного доступа также ничего не давало. В реестре все настройки были выставлены верно, но при этом netstat -ant | findstr 3389 ничего не выдавал. Выяснилось, что не установлено обновление KB948496, которое в том числе решает проблему с удаленным рабочим столом. После установки патча и перезагрузки сервера проблема была решена.

Удаленное изменение настроек SNMP в Windows используя скрипт

Привет! Появилась задача: необходимо на серверах с Windows Server 2003 и выше поменять настройки службы SNMP, добавив в настройки еще один IP-адрес, куда будут отсылаться SNMP-трапы и куда их вообще разрешено отсылать. Приведу два скриншота того, о чем я говорю:

Получается, на примере мне надо добавить к IP-адресу 192.168.1.1 еще один, например 192.168.1.2 в обе вкладки.

Проблемы были следующие: компьютеры не в домене; на компьютерах может быть разный локальный администратор и пароль.
Из плюсов: к большинству серверов имеется удаленный доступ к административной шаре admin$.

Был написан скрипт на powershell, который из файла на рабочем столе с именем servers.csv и содержащим список серверов, берет имя сервера и стандартными командами reg и sc очищает ветки реестра, в которых находятся нужные нам данные, и перезагружает службу SNMP. В случае проблем с подключением к серверу, выводится сообщение об ошибке. В процессе работы скрипта лишний вывод сообщений в окно терминала отключен.

Вот содержимое файла servers.csv для примера:

А вот содержимое самого скрипта:

chcp 1251 | Out-Null
cd ~/Desktop
$List = Import-Csv Servers.csv -Header Servers
Foreach ($s in $List) {
    $Serv= $s.Servers
    Write-Host "Подключение к серверу: " -foregroundcolor yellow -NoNewline  
    Write-Host $Serv -foregroundcolor green
    reg delete \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\PermittedManagers /va /f   
    reg add \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\PermittedManagers /v 1 /t REG_SZ /d 192.168.1.1 2>&1 | Out-Null
    reg add \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\PermittedManagers /v 2 /t REG_SZ /d 192.168.1.2 2>&1 | Out-Null
    
    reg delete  \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\TrapConfiguration\SPECTRUM  /va /f 2>&1 | Out-Null
    reg add \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\TrapConfiguration\SPECTRUM /v 1 /t REG_SZ /d 192.168.1.1 2>&1 | Out-Null
    reg add \\$Serv\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SNMP\Parameters\TrapConfiguration\SPECTRUM /v 2 /t REG_SZ /d 192.168.1.2 2>&1 | Out-Null
    sc.exe \\$Serv stop SNMP 2>&1 | Out-Null
    sc.exe \\$Serv start SNMP 2>&1 | Out-Null
}

Для того, чтобы скрипт запустить от имени локального администратора сервера нужно запустить командную строку и в ней выполнить команду:

runas /netonly /user:admin "powershell"

подразумевая, что на сервере есть пользователь admin с паролем. Если учетная запись не присутствует на сервере или пароль был введен не правильно, то при выполнении скрипта появится сообщение «Ошибка: Отказано в доступе». Если к серверу невозможно подключиться по причине его сетевой недоступности, то тогда ошибка будет «Ошибка: Не найден сетевой путь». 

В случае успешного подключения появится сообщение «Операция успешно завершена«. Язык вывода сообщений конечно же зависит от установленного языка интерфейса в системе.

Системная служба заняла всю свободную оперативную память

Возникла проблема: на двух серверах Windows Server 2008R2 SP1, на которых давно не ставили обновления и которые не перезагружались больше года, кончилась свободная оперативная память на сервере. При беглом взгляде было обнаружено, что проблема вроде бы как в системных службах, в частности в службе «Установщик модулей Windows» (aka TrustedInstaller). После ее перезапуска проблема не устранилась, тут же другая системная служба заняла всю доступную оперативную память. И тут пришла идея проверить количество дескрипторов, занятых процессами..

Сразу стало понятно в чем источник проблемы. Перезапуск службы «Digi Anywhere» инициировал активную работу служб, которые заняли оперативную память и через 20-30 секунд вместо 4 ГБ занятой памяти осталось только 1 ГБ. Проблема бесследно исчезла. Так что почаще проверяйте количество дескрипторов, использующимися вашими процессами, возможно проблема в них.

Ошибка «SCP Wrong response: 1scp: ambiguous target » в Veeam BR

Привет! Столкнулся сегодня с такой ошибкой в отчете резервного копирования, который Veeam присылает на почту:
Error: SCP Wrong response: 1scp: ambiguous target
В логе с именем файла task.<имя сервера>.log, который находится в директории C:\ProgramData\Veeam\Backup\<имя задачи>\ на сервере Veeam BR я нашел следующую строчку:
Info [LinuxEpBackupManagementService] Uploading local file C:\Scripts\rhel-share_do-backup-catalog — Job ABS_FIO.sh to /var/lib/veeam/scripts/rhel-share_do-backup-catalog — Job ABS_FIO.sh on target machine.
Как видно в строчку в строке с директорией содержатся пробелы. Если посмотреть настройки этой задачи, то в настройках «Application-aware processing» можно обнаружить подключенный скрипт, который в своем имени содержит пробелы.
Чтобы ошибка пропала достаточно в имени скрипта убрать пробелы или заменить их на знак «подчеркивания». Ошибка после этого пропала.

Powershell cкрипт для массового отображения/изменения ACL на файловом сервере

Привет! Понадобилось мне недавно провести вручную операцию по удалению из ACL лишней записи. Проблема была в том, что таких папок было около 50 штук. Спасало только то, что это нужно было сделать в папке с одним и тем же именем в разных директориях с одним общим корнем. Я это сделал вручную, так как задачу надо было выполнить быстро, но решил для себя написать скрипт, чтобы можно было быстро править ACL-листы папок в Windows. Необходимо только, чтобы на сервере был Powershell и немного его знания, так как скрипт практически не оттестирован и не проверен в реальной работе на большом количестве данных.
Вот он сам, по комментариям внутри него думаю будет понятно, что надо делать.

function Print_Dir($list_catalogs)
    {
         $Table = New-Object system.Data.DataTable “$Table_Security”  <#Создание таблицы для отображения ACL#>
         $column1 = New-Object system.Data.DataColumn Директория,([string])
         $column2 = New-Object system.Data.DataColumn ACL,([string])
         $column3 = New-Object system.Data.DataColumn Владелец,([string])
         $table.columns.add($column1)
         $table.columns.add($column2)
         $table.columns.add($column3)
         foreach ($Foundfolder in $list_catalogs) 
            {
                $Access = (Get-Acl $Foundfolder.FullName).AccessToString  
                $row = $table.NewRow()
                $row.Директория = $Foundfolder.FullName
                $row.ACL = “$Access”
                $row.Владелец = $AccessACL.Owner
                $table.Rows.Add($row)
            } 
         $table | format-table -Wrap
        
    }

function Found_Folder()
    {
                $Root_Path = Read-Host 'Введите корневую директорию'   <#Директория в которой производится поиск по-умолчанию#>
                $Target_Folder = Read-Host 'Введите название папки'    <#папка для поиска по-умолчанию #>
                $FFolder = Get-ChildItem $Root_Path -Recurse -Directory -Force -ErrorAction SilentlyContinue -Filter "$Target_Folder" <#Найденные папки#>
                return $FFolder
    }

While ($KEY='1')
{
$ACL_Key = Read-Host 'Что необходимо сделать? (1 - Вывести текущие значения ACL; 2 - Добавление; 3 - Удаление; 4 - Выход из программы)'
switch ($ACL_Key)
{
    1 
        {
                $Found_Folder = Found_Folder
                Print_Dir($Found_Folder)
        }
    2
        {
                $Found_Folder = Found_Folder
                $AccessRuleAdd = New-Object System.Security.AccessControl.FileSystemAccessRule "ONIX\TestAV", "Modify","ContainerInherit,ObjectInherit", "None","Allow" <#ACL, которую требуется добавить в папки#>
                foreach ($Foundfolder in $Found_Folder)
                    {
                        $ACL = $Foundfolder.GetAccessControl("Access")  
                        $ACL.AddAccessRule($AccessRuleAdd)
                        $Foundfolder.SetAccessControl($ACL)
                    } 
                Print_Dir($Found_Folder)
        }
    3
        {
                $Found_Folder = Found_Folder
                $AccessRuleDel = New-Object System.Security.AccessControl.FileSystemAccessRule "ONIX\TestAV", "Modify","ContainerInherit,ObjectInherit", "None","Allow" <#ACL, которую требуется добавить в папки#>
                foreach ($Foundfolder in $Found_Folder)
                    {
                        $ACL = $Foundfolder.GetAccessControl("Access")  
                        $ACL.RemoveAccessRule($AccessRuleDel)
                        $Foundfolder.SetAccessControl($ACL)
                    } 
                Print_Dir($Found_Folder)
        }
    4   
        {
            exit
        }
} 
}

Автоматическое восстановление базы данных SQL из Veeam Backup

Понадобилось автоматически восстанавливать MS SQL базу данных из Veeam Backup & Replication 9.5. Задание должно было запускаться сразу после того, как заканчивалось резервное копирование и восстановление должно было происходить на другой сервер. Вот какой скрипт у меня получился:

Add-PSSnapin VeeamPSSnapIn

$source_host        = "SQL_Original"
$source_db1         = "DB1"
$source_db2         = "DB2"
$source_db3         = "DB3"
$source_db4         = "DB4"
$target_host        = "SQL_Target"
$target_cred        = Get-VBRCredentials -Name "onix\onix_backup"
$target_instance    = "test"

$target_db1    = $source_db1
$target_db2    = $source_db2
$target_db3    = $source_db3
$target_db4    = $source_db4

$(
$restorepoint = Get-VBRApplicationRestorePoint -SQL -Name $source_host| Sort-Object creationtime -Descending | Select-Object -First 1
$database1 = Get-VBRSQLDatabase -ApplicationRestorePoint $restorepoint -Name $source_db1
$database2 = Get-VBRSQLDatabase -ApplicationRestorePoint $restorepoint -Name $source_db2
$database3 = Get-VBRSQLDatabase -ApplicationRestorePoint $restorepoint -Name $source_db3
$database4 = Get-VBRSQLDatabase -ApplicationRestorePoint $restorepoint -Name $source_db4
$restore_session = Start-VBRSQLDatabaseRestore -Database $database1 -ServerName $target_host -InstanceName $target_instance -DatabaseName $target_db1 -GuestCredentials $target_cred -SqlCredentials $target_cred -Force -Wait
$restore_session = Start-VBRSQLDatabaseRestore -Database $database2 -ServerName $target_host -InstanceName $target_instance -DatabaseName $target_db2 -GuestCredentials $target_cred -SqlCredentials $target_cred -Force -Wait
$restore_session = Start-VBRSQLDatabaseRestore -Database $database3 -ServerName $target_host -InstanceName $target_instance -DatabaseName $target_db3 -GuestCredentials $target_cred -SqlCredentials $target_cred -Force -Wait
$restore_session = Start-VBRSQLDatabaseRestore -Database $database4 -ServerName $target_host -InstanceName $target_instance -DatabaseName $target_db4 -GuestCredentials $target_cred -SqlCredentials $target_cred -Force -Wait
) *>&1 >> "C:\SQLRestore_errors.log"

Все достаточно просто: берется оригинальный хост с базами данных, список баз для восстановления, хост на который надо восстановить, учетная запись от имени которой будет восстановление (должна быть сохранена в «Manage Credentials» и целевой инстанс SQL если требуется). Находится последняя точка резервного копирования базы (на точку восстановления с проигрыванием логов восстановиться можно, но не получится это сделать автоматически) и восстанавливается. Если происходят ошибки, то они выводятся в текстовый файл (в консоли Veeam ошибки работы скрипта показаны не будут).

Остается в задаче, которая бекапит SQL-сервер, настроить запуск скрипта, делаем это в «Advanced Settings». Задаем так строку C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noninteractive -file «C:\Scripts\SQLRestore.ps1»

Сброс пароля в Kaspersky Endpoint Security 10

Понадобилось вчера переустановить антивирус Касперского в доменной среде, при незнании пароля, установленного в KSC для блокирования изменения настроек. К сожалению bat -файл с раздела технической поддержки Касперского, который сбрасывает пароль, не работает на серверных операционных системах, поэтому пришлось искать другой способ. Оказывается он совсем простой, достаточно только также загрузиться в безопасный режим и в реестре найти ветку HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\KasperskyLab\protected\KES10\settings (для Win x64) или HKEY_LOCAL_MACHINE\SOFTWARE\KasperskyLab\protected\KES10\settings (для Win x32) и изменить ключ на следующее значение:

"EnablePswrdProtect"=dword:00000000

После этого перезагружаемся опять в безопасный режим и можно смело удалять антивирус, пароль уже не потребуется. Для удаления я воспользовался утилитой kavremvr.exe. от того же Касперского. Делал я по той причине, что Касперский никак не хотел ставиться после обновления системы на новую версию, ошибка в логах была «Failed to extract stream: mklifx64nt602.cab Error 0x80070006»