Меняю систему с wrkst0100 на wrkst0101 и столкнулся что мой скрипт резервного копирования не работает. Разбираюсь что еще нужно учесть в заметке.
Дело вот в чем. У меня на работе полетел жесткий диск на моей офисной рабочей станции, и этим днем оказалось, что это пятница, раз в этот день не так много задач, обычно их нет, я решил по-быстрому заменить себе систему. Взял купленный компьютер, который мы покупаем в сборе:
Motherboard: Asus H510M-RCPU: Intel ® Core ™ i5-10400 CPU @2.90GHzRAM: 8GibSSD: 250Gb
установил на него систему Windows 10 Pro из дистрибутива SW_DVD9_Win_Pro_10_1909.2_64BIT_Russian_Pro_Ent_EDU_N_MLF_X22-26638.ISO
приступил к настройке под рабочее окружение и когда открыл свою заметку "Централизованное резервное копирования Mikrotik через PowerShell" столкнулся, что возможно что-то поменялось в использованном командлете в статье, что вот прям как там описано у меня заработало, но не полностью. А значит нужно дополнить заметку некоторыми нюансами:
Шаг №1: На сетевом устройстве Mikrotik(а) нужно создать административную учетную запись подключаясь по которой будет производиться бекапы (backup & rsc).
Шаг №2: Проверять что порт 22 на Mikrotik(е/ах) открыт.
Шаг №3: Создаю каталог в котором будут содержаться список(списки) файлов в которых IP&DNS адреса микротиков:
Win — набираю cmd, через правый клик мыши на найденном "Командная строка" выбираю "Запуск от имени администратора", нажимаю "Да"
C:\Windows\system32>mkdir c:\tips_mikrotik
Шаг №4: Создаю каталог в котором будут располагаться бекапы (backup & rsc файлы)
Win — набираю cmd, через правый клик мыши на найденном "Командная строка" выбираю "Запуск от имени администратора", нажимаю "Да"
C:\Windows\system32>mkdir -p c:\tips_backup\mikrotik
Шаг №5: Создаю текстовый файл C:\tips_mikrotik\lists.txt через Notepad++ в котором указан IP&DNS адрес Mikrotik(а):
sw_1-2-1.polygon.local
Шаг №6: Устанавливаю архиватор 7zip (x86), а можно сделать проще, создать каталог C:\tips_exe и поместить в него от x86 файл 7z.exe
На заметку: файл 7z.exe & 7z.dll должны быть одной архитектуры (x86 & x64)
и после размещения данных файлов в каталоге w:\tips_exe\ бекап проходит успешно.
Шаг №7: Произвожу преднастройки PowerShell которые должны будут запускать мой скрипт на PowerShell:
Win — набираю cmd, через правый клик мыши на найденном "Командная строка" выбираю "Запуск от имени администратора", нажимаю "Да"
C:\Windows\system32>powershell
Windows PowerShell (C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены. Попробуйте новую кроссплатформенную оболочку PowerShell (https://aka.ms/pscore6)
PS C:\Windows\system32> get-host
Name : ConsoleHost
Version : 5.1.18362.628
InstanceId : 2eecf240-7459-4f23-9f69-316d80402f17
UI : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture : ru-RU
CurrentUICulture : ru-RU
PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled : True
IsRunspacePushed : False
Runspace : System.Management.Automation.Runspaces.LocalRunspace
PS C:\Windows\system32> uninstall-module posh-ssh PackageManagement\Uninstall-Package : Для указанных условий поиска и имен модулей "posh-ssh" не найдено никаких совпадений. C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:2194 знак:21 + ... $null = PackageManagement\Uninstall-Package @PSBoundParameters + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Microsoft.Power...ninstallPackage:UninstallPackage) [Uninstall-Package]
, Exception
+ FullyQualifiedErrorId : NoMatchFound,Microsoft.PowerShell.PackageManagement.Cmdlets.UninstallPackage
PS C:\Windows\system32> unregister-psrepository psgallery
PS C:\Windows\system32> register-psrepository -Default
Для продолжения требуется поставщик NuGet
Для взаимодействия с репозиториями на основе NuGet модулю PowerShellGet требуется версия поставщика NuGet "2.8.5.201"
или более новая. Поставщик NuGet должен быть доступен в "C:\Program Files\PackageManagement\ProviderAssemblies" или
"C:\Users\aolloadm\AppData\Local\PackageManagement\ProviderAssemblies". Поставщик NuGet можно также установить,
выполнив команду "Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force". Вы хотите, чтобы модуль
PowerShellGet установил и импортировал поставщик NuGet прямо сейчас?
[Y] Да - Y [N] Нет - N [S] Приостановить - S [?] Справка (значением по умолчанию является "Y"): нажимаю клавишу "Y"
PS C:\Windows\system32> Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
Name Version Source Summary
---- ------- ------ -------
nuget 2.8.5.208 https://onege... NuGet provider for the OneGet meta-package manager
PS C:\Windows\system32>
Отобразить список всех установленных пакетов:
PS C:\Windows\system32> get-packageprovider
Name Version DynamicOptions
---- ------- --------------
msi 3.0.0.0 AdditionalArguments
msu 3.0.0.0
NuGet 2.8.5.208 Destination, ExcludeVersion, Scope, SkipDependencies, Headers, FilterOnTag...
PowerShellGet 1.0.0.1 PackageManagementProvider, Type, Scope, AllowClobber, SkipPublisherCheck, ...
Programs 3.0.0.0 IncludeWindowsInstaller, IncludeSystemComponent
PS C:\Windows\system32> set-executionpolicy remotesigned
Отобразить какова текущая политика запуска скриптов:
PS C:\Windows\system32> get-executionpolicy
Unrestricted
Устанавливаю пакет Posh-SSH версии 2.0.2 (если не указать ключ -force, то все равно установится версия 3.0.8 на момент написания данной заметки):
PS C:\Windows\system32> install-Module -Name Posh-SSH -RequiredVersion 2.0.2 -force
Ненадежный репозиторий
Идет установка модулей из ненадежного репозитория. Если вы доверяете этому репозиторию, измените его значение
InstallationPolicy, запустив командлет Set-PSRepository. Вы действительно хотите установить модули из "PSGallery"?
[Y] Да - Y [A] Да для всех - A [N] Нет - N [L] Нет для всех - L [S] Приостановить - S [?] Справка
(значением по умолчанию является "N"): нажимаю клавишу "Y"
Отобразить какие версии модулей установлены (предварительно нужно закрыть консоль командной строки и заново ее открыть с правами Администратора и перейти в режим powershell), должно быть, как вывод ниже:
PS C:\Windows\system32> get-module -listavailable -name posh-ssh
Каталог: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 2.0.2 Posh-SSH {Get-SCPFile, Get-SCPFolder, Get-SFTPFile, Set-SFTPFile...} PS
На заметку: Только одна версия модуля posh-ssh должна быть установлена, в моем случае это 2.0.2, если стоит 3.0.8 удаляем ее
PS C:\Windows\system32> uninstall-module -name posh-ssh -RequiredVersion 3.0.8 -force
PS C:\Windows\system32> get-module -listavailable -name posh-ssh
Каталог: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 2.0.2 Posh-SSH {Get-SCPFile, Get-SCPFolder, Get-SFTPFile, Set-SFTPFile...}
PS C:\Windows\system32>
C:\Windows\system32>
PS C:\Windows\system32> set-executionpolicy remotesigned
PS C:\Windows\system32> exit
C:\Windows\system32>
Шаг №8: Содержимое скрипта bmikrotikoffice.ps1:
Set-Executionpolicy unrestricted
#New-SSHSession : Key exchange negotiation failed
Get-SSHTrustedHost | Remove-SSHTrustedHost
#Check if out module loaded
if (Get-Module -ListAvailable -Name Posh-SSH) { <# do nothing #> }
else {
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Confirm
Install-Module Posh-SSH
}
#Текущая дата
$CurrentDate = get-date -format dd-MM-yyyy
#Каталог расположения бекапов
$Letter_Drive = "C:"
$BackupFolder = "backup"
#$BackupPath = $Letter_Drive + "\" + $BackupFolder
$BackupPath = $Letter_Drive + "\" + $BackupFolder + "\" + $CurrentDate
#Функция для создания структуры каталогов
Function CheckPath ($Path) {
$Path_Exists = Test-Path -Path $Path
If ($Path_Exists -eq $False) {
New-Item $Path -Type directory
}
}
#Создаем каталог для бекапов
CheckPath $BackupPath | Out-Null
#Передайте нежелательные результаты команд / вызовов функций
#в вызываемой функции через "... | Out-Null",
#а затем просто верните нужную вещь.
write-host $BackupPath
#Импортирую установленный модуль
Import-Module Posh-SSH
$username = "backup"
$password = "password"
$Port = "22"
#$fnamebackup = "backup_$(Get-Date -Format ddMMyyyy)"
#$fnamersc = "backup_$(Get-Date -Format ddMMyyyy)"
$fnamebackup = "backup_$(Get-Date -Format HH_mm_dd_MM_yyyy)"
$fnamersc = "backup_$(Get-Date -Format HH_mm_dd_MM_yyyy)"
function bkprtr {
param($ipaddr)
$secpassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ($username, $secpassword)
start-sleep -s 15
$ssh = New-SSHSession $ipaddr -AcceptKey:$true -Credential $Cred -ErrorAction Stop -Port 22
$outbackup = (Invoke-SSHCommand $ssh -Command "/system backup save name=$fnamebackup dont-encrypt=yes" -EnsureConnection).Output
$outrsc = (Invoke-SSHCommand $ssh -Command "export file=$fnamersc" -EnsureConnection).Output
#set name mikrotik
$mikrotikname = (Invoke-SSHCommand $ssh -Command "/system identity print" -EnsureConnection).Output
#Форматируем значение переменной $mikrotikname
$fa = $mikrotikname | out-file $BackupPath\name.txt
$fb = Get-Content $BackupPath\name.txt -first 1
$fc = $fb.Split(": ")[-1]
$fc
#Создаем внутри каталога C:\backup каталог с именем Mikrotik,
#ключ Force обязателен, т.к. каталог уже есть и каждый последующий день будет тут же
$MName = new-item -Path $BackupPath\$fc -Type Directory -Force
$MName
#Делаем бекапы backup и бекап конфигурации rsc и через ftp забираем их на каталог c:\backup\<mikrotik_name>
#А после удаляем с Mikrotik
if($outbackup.Trim() -eq "Configuration backup saved")
{
$sftp = New-SFTPSession $ipaddr -AcceptKey:$true -Credential $Cred
Get-SFTPFile -SFTPSession $sftp -RemoteFile "/$fnamebackup.backup" -LocalPath "$MName\" -Overwrite
Get-SFTPFile -SFTPSession $sftp -RemoteFile "/$fnamersc.rsc" -LocalPath "$MName\" -Overwrite
#Start-Sleep 2
start-sleep -s 15
Remove-SFTPItem -SFTPSession $sftp -Path "/$fnamebackup.backup" -Force
Remove-SFTPItem -SFTPSession $sftp -Path "/$fnamersc.rsc" -Force
Remove-SFTPSession $sftp
}
Remove-SSHSession $ssh
}
foreach ($ip in gc C:\tips_mikrotik\lists.txt) {bkprtr($ip)}
$MName
#if (-not (test-path "$env:ProgramFiles\7-Zip\7z.exe")) {throw "$env:ProgramFiles\7-Zip\7z.exe needed"}
#set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"
set-alias sz "C:\tips_exe\7z.exe"
#Что бекапируем
$Letter_Drive = "C:"
$BackupFolder = "backup"
$ITOGO = $Letter_Drive + "\" + $BackupFolder + "\" + $CurrentDate
$ITOGO
$ITOGOBackup = "C:\tips_backup\mikrotik"
#Архивируем созданный каталог где его имя это имя текущей даты
sz a -t7z "$ITOGOBackup\backup_mikrotik_$CurrentDate.7z" "$ITOGO"
#rmdir $ITOGO
#or
Remove-Item $ITOGO -Force -Recurse
Шаг №9: Проверяю запуск скрипта bmikrotikoffice.ps1:
На заметку: При подключении скриптом к хосту Mikrotik в профиле пользователя запущенной строки от имени Администратора будет формироваться файл, в котором будет отражена информация об удаленном узле подключения.
C:\Users\%username%\.poshssh\hosts.json
PS C:\Windows\system32> C:\Script\bmikrotikoffice.ps1
C:\backup\23-05-2023
1-2-1
Каталог: C:\backup\23-05-2023
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 23.05.2023 9:05 1-2-1
True
True
C:\backup\23-05-2023
7-Zip 19.00 (x86) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21
Scanning the drive:
2 folders, 3 files, 51241 bytes (51 KiB)
Creating archive: C:\tips_backup\mikrotik\backup_mikrotik_23-05-2023.7z
Add new data to archive: 2 folders, 3 files, 51241 bytes (51 KiB)
Files read from disk: 3
Archive size: 10710 bytes (11 KiB)
Everything is Ok
PS C:\Windows\system32>
Отлично, скрипт успешно отработал.
Шаг №10: Но я обычно делаю бекапы не находясь в среде PowerShell, а просто запускаю консоль командной строки cmd.exe с правами Администратора, перехожу в каталог C:\Script где у меня содержится скрипт, посредством которого я буду осуществлять резервное копирование сетевых устройств и запускаю свой скрипт:
C:\Windows\system32>cd /d c:\Script
c:\Script>
c:\Script>powershell -file bmikrotikoffice.ps1
Скрипт также успешно выполняется.
Итого изначальная заметка писалась, когда у меня получился скрипт и я упустил некоторые моменты, но сейчас, когда я столкнулся что моя изначальная заметка вот прям сейчас не заработала у меня, я проработал на чистой от и до, а значит это дополнение. Потому правду говорят, если сделал и получилось сделай на другой системе с нуля дабы выявить еще какие-либо нюансы.
На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.