После установки родного от 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» можно обнаружить подключенный скрипт, который в своем имени содержит пробелы.
Чтобы ошибка пропала достаточно в имени скрипта убрать пробелы или заменить их на знак «подчеркивания». Ошибка после этого пропала.
Uptime Windows Server
У кого больше? 🙂

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»
Перенос WordPress на Debian с NGINX.
Привет! На днях решил заняться этим блогом. Решил немного попрактиковаться с web-сервером на linux-машине. Был выбран Debian 9 и nginx. Пришлось немного повозиться, наступить на различные грабли, но самое главное я добился своей цели. Не буду здесь писать инструкции как я это осуществил, так как в интернете полно материалов на данную тему. Могу лишь только сказать, что для начинающего администратора это может оказаться сложным. Если у кого-то будут вопросы по мигрированию или созданию новых блогов на данной платформе, то прошу вас, обращайтесь ко мне через комментарии к этой заметке или через обратную форму на главной странице.
P.S. Среднее время загрузки главной страницы сайта у меня теперь составляет менее 500 мс, хотя ранее на Windows с IIS web-сервером эта цифра составляла 3-4 секунды.
Ошибка «We couldn’t create a new partition or locate an existing one» при установке Windows Server 2012R2 на ProLiant BL460c G7
Привет! Первый раз столкнулся с проблемой установки серверной системы Microsoft на сервер HP. Вот возможные варианты решения данной проблемы:
- внедрить драйвера дискового контроллера в образ Windows
- драйвера дискового контроллера подсунуть на флешке, подключив ее перед запуском установки системы
- самый оптимальный для ленивых админов:
-
- нажать Shift+F10 в момент, когда появилось сообщение об ошибке.
- В cmd набрать команды:
diskpart
list disk
select disk 0 (номер диска куда устанавливается система)
clean
create partition primary
format fs=ntfs quick
assign
active
list volume (смотрим какая буква назначилась разделу и какая буква принадлежит iso с дистрибутивом)
exit
cd D: (переходим в каталог, где лежит дистрибутив системы)
xcopy d: c:/e/h/k (копируем дистрибутив на раздел куда будем устанавливать систему)
- после завершения копирования отключаем ISO-образ от сервера и перезагружаемся
- запустится инсталлятор системы непосредственно с дисковой подсистемы сервера. В процессе установки указываем тот же раздел, в который копировали установщик
- После завершения установки и входа в систему надо очистить корень системного диска С: от файлов и папок установщика.
- правим загрузчик системы., иначе по-умолчанию в его настройках будет 2 записи, одна из которых будет ссылаться на установочные файлы. Для этого в загруженной системе открываем cmd и пишем:
bcdedit
Находим запись об установщике Windows Setup и копируем его идентификатор
bcdedit /delete <ID>
Удаляем запись с нужным идентификатором
После этого установленная система не будет отличаться от той, что была бы установлена по 1 или 2 способу.