Меняю систему с wrkst0100 на wrkst0101 и столкнулся что мой скрипт резервного копирования не работает. Разбираюсь что еще нужно учесть в заметке.

Дело вот в чем. У меня на работе полетел жесткий диск на моей офисной рабочей станции, и этим днем оказалось, что это пятница, раз в этот день не так много задач, обычно их нет, я решил по-быстрому заменить себе систему. Взял купленный компьютер, который мы покупаем в сборе:

  • Motherboard: Asus H510M-R
  • CPU: Intel ® Core ™ i5-10400 CPU @2.90GHz
  • RAM: 8Gib
  • SSD: 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.

От ekzorchik