From 7767e846858d0130bb8f73a22dd97a0ac6bc2881 Mon Sep 17 00:00:00 2001 From: Alex Kup <116945542+Lifailon@users.noreply.github.com> Date: Wed, 1 Mar 2023 11:48:57 +0300 Subject: [PATCH] Update README.md --- README.md | 330 +++++++++++++++++++++++++++++------------------------- 1 file changed, 178 insertions(+), 152 deletions(-) diff --git a/README.md b/README.md index e2f1f06..444694a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # PowerShell Commands +- [Items](#Items) - [WinRM](#WinRM) - [SMB](#SMB) - [ComObject](#ComObject) @@ -8,6 +9,7 @@ - [ServerManager](#ServerManager) - [PackageManagement](#PackageManagement) - [PowerCLI](#PowerCLI) +- [Veeam](#Veeam) ### Help `Get-Command *Service*` поиск команды по имени \ @@ -127,6 +129,20 @@ `[int32]$days=($fDate-$gDate).Days` получить разницу в днях \ `"5/7/07" -as [DateTime]` преобразовать входные данные в тип данных [DateTime] +### Time +`(Measure-Command {ping ya.ru}).TotalSeconds` узнать только время выполнения \ +`(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine` посчитать время работы последней [-1] (select -Last 1) выполненной команды и узнать ее статус \ +`$start_time = Get-Date` зафиксировать время до выполнения команды \ +`$end_time = Get-Date` зафиксировать время по завершению \ +`$time = $end_time - $start_time` высчитать время работы скрипта \ +`$min = $time.minutes` \ +`$sec = $time.seconds` \ +`Write-Host "$min минут $sec секунд"` \ +`$timer = [System.Diagnostics.Stopwatch]::StartNew()` запустить таймер \ +`$timer.IsRunning` статус работы таймера \ +`$timer.Elapsed.TotalSeconds` отобразить время с момента запуска (в секундах) \ +`$timer.Stop()` остановить таймер + ### Regex (регулярные выражения) `-replace "1","2"` замена элементов в индексах массива (везде где присутствует 1, заменить на 2), для удаления используется только первое значение \ `-split " "` преобразовать строку в массив, разделителем указан пробел, которой удаляется ($url.Split("/")[-1]) \ @@ -253,7 +269,7 @@ `Compare-Object -ReferenceObject $group1 -DifferenceObject $group2 -IncludeEqual` `==` нет изменений \ `<=` есть изменения в $group1 \ -`=>` есть изменения в $group2 \ +`=>` есть изменения в $group2 ### Where-Object (?) `Get-Process | Where-Object {$_.ProcessName -match "zabbix"}` фильтрация/поиск процессов по имени свойства объекта \ @@ -263,7 +279,7 @@ `Get-Service -ComputerName $srv | Where {$_.Name -match "WinRM"} | Restart-Service` перезапустить службу на удаленном компьютере \ `(Get-Service).DisplayName` вывести значения свойства массива \ `netstat -an | where {$_ -match 443}` \ -`netstat -an | ? {$_ -match 443}` \ +`netstat -an | ?{$_ -match 443}` \ `(netstat -an) -match 443` ### Sort-Object @@ -277,149 +293,11 @@ ### ConvertTo-HTML `Get-Process | select Name, CPU | ConvertTo-HTML -As list > "$env:userprofile\desktop\proc-list.html"` вывод в формате List (Format-List) или Table (Format-Table) -### EventLog -`Get-EventLog -List` отобразить все корневые журналы логов и их размер \ -`Clear-EventLog Application` очистить логи указанного журнала \ -`Get-EventLog -LogName Security -InstanceId 4624` найти логи по ID в журнале Security +### Out-Gridview +`Get-Service -cn $srv | Out-GridView -Title "Service $srv" -OutputMode Single –PassThru | Restart-Service` перезапустить выбранную службу -`function Get-Log ($count=30,$hour=-3) {` # указать значения параметров по умолчанию \ -`Get-EventLog -LogName Application -Newest $count | where-Object TimeWritten -ge (Get-Date).AddHours($hour)` # отобразить 30 новых событий за последние 3 часа \ -`}` \ -`Get-Log 10 -1` # передача параметров функции (если значения идут по порядку, то можно не указывать названия переменных) +# Items -### WinEvent -`Get-WinEvent -ListLog * | where logname -match SMB | sort -Descending RecordCount` отобразить все доступные журналы логов \ -`Get-WinEvent -LogName "Microsoft-Windows-SmbClient/Connectivity" | where` \ -`Get-WinEvent -LogName Security -MaxEvents 100` отобразить последние 100 событий \ -`Get-WinEvent -FilterHashtable @{LogName="Security";ID=4624}` найти логи по ID в журнале Security - -`$RDPAuths = Get-WinEvent -ComputerName $srv -LogName "Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational" -FilterXPath ''` \ -`[xml[]]$xml = $RDPAuths | Foreach {$_.ToXml()}` \ -`$EventData = Foreach ($event in $xml.Event) {` \ -`New-Object PSObject -Property @{` \ -`"Время подключения" = (Get-Date ($event.System.TimeCreated.SystemTime) -Format 'yyyy-MM-dd hh:mm K')` \ -`"Имя пользователя" = $event.UserData.EventXML.Param1` \ -`"Адрес клиента" = $event.UserData.EventXML.Param3` \ -`}}` \ -`$EventData | Out-Gridview -Title "История RDP подключений на сервере $srv"` - -`$obj = @() \ -`$fw = Get-WinEvent 'Microsoft-Windows-Windows Firewall With Advanced Security/Firewall'` \ -`foreach ($temp_fw in $fw) {` \ -`if ($temp_fw.id -eq 2004) {$type = "Added Rule"} elseif ($id -eq 2006) {$type = "Deleted Rule"}` \ -`$port = $temp_fw.Properties[7] | select -ExpandProperty value` \ -`$name = $temp_fw.Properties[1] | select -ExpandProperty value` \ -`$obj += [PSCustomObject]@{Time = $temp_fw.TimeCreated; Type = $type; Port = $port; Name = $name}` \ -`}` - -### Time -`(Measure-Command {ping ya.ru}).TotalSeconds` узнать только время выполнения \ -`(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine` посчитать время работы последней [-1] (select -Last 1) выполненной команды и узнать ее статус \ -`$start_time = Get-Date` зафиксировать время до выполнения команды \ -`$end_time = Get-Date` зафиксировать время по завершению \ -`$time = $end_time - $start_time` высчитать время работы скрипта \ -`$min = $time.minutes` \ -`$sec = $time.seconds` \ -`Write-Host "$min минут $sec секунд"` \ -`$timer = [System.Diagnostics.Stopwatch]::StartNew()` запустить таймер \ -`$timer.IsRunning` статус работы таймера \ -`$timer.Elapsed.TotalSeconds` отобразить время с момента запуска (в секундах) \ -`$timer.Stop()` остановить таймер - -### Firewall -`New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol TCP -LocalPort 135` открыть in-порт \ -`Get-NetFirewallRule | Where-Object {$_.DisplayName -match "135"}` найти правило по имени \ -`Get-NetFirewallPortFilter | where LocalPort -like 80` найти действующие правило по номеру порта - -`Get-NetFirewallRule -Enabled True -Direction Inbound | select -Property DisplayName,` -`@{Name='Protocol';Expression={($_ | Get-NetFirewallPortFilter).Protocol}},` -`@{Name='LocalPort';Expression={($_ | Get-NetFirewallPortFilter).LocalPort}},` -`@{Name='RemotePort';Expression={($_ | Get-NetFirewallPortFilter).RemotePort}},` -`@{Name='RemoteAddress';Expression={($_ | Get-NetFirewallAddressFilter).RemoteAddress}},` -`Enabled,Profile` - -### Firewall-Manager -`Install-Module Firewall-Manager` \ -`Export-FirewallRules -Name * -CSVFile $home\documents\fw.csv` -Inbound -Outbound -Enabled -Disabled -Allow -Block (фильтр правил для экспорта) \ -`Import-FirewallRules -CSVFile $home\documents\fw.csv` - -### Performance -`(Get-Counter -ListSet *).CounterSetName` вывести список всех доступных счетчиков производительности в системе \ -`(Get-Counter -ListSet *memory*).Counter` все счетчики, включая дочернии, поиск по wildcard-имени \ -`Get-Counter "\Memory\Available MBytes"` объем свободной оперативной памяти \ -`Get-Counter -cn $srv "\LogicalDisk(*)\% Free Space"` % свободного места на всех разделах дисков \ -`(Get-Counter "\Process(*)\ID Process").CounterSamples` \ -`Get-Counter "\Processor(_Total)\% Processor Time" –ComputerName $srv -MaxSamples 5 -SampleInterval 2` 5 проверок каждые 2 секунды \ -`Get-Counter "\Процессор(_Total)\% загруженности процессора" -Continuous` непрерывно \ -`(Get-Counter "\Процессор(*)\% загруженности процессора").CounterSamples` - -### ThreadJob -`Install-Module -Name ThreadJob` установить модуль \ -`Get-Module ThreadJob -list` \ -`(Start-ThreadJob {ping ya.ru}) | Out-Null` создать фоновую задачу \ -`while ($True){` \ -`$status = @((Get-Job).State)[-1]` # отобразить статус последней [-1] фоновой задачи \ -`if ($status -like "Completed"){` # если Completed \ -`Get-Job | Receive-Job` # отобразить вывод, после каждого запроса результат удаляется (Get-Job).HasMoreData -eq $False \ -`Get-Job | Remove-Job -Force` # удалить все задачи \ -`break` # остановить цикл \ -`}}` \ -`Get-Job | Receive-Job -Keep` отобразить и не удалять вывод (-Keep) - -### Event -`Register-EngineEvent` регистрирует подписку на события PowerShell или New-Event и создает задание (Get-Job) \ -`Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action {` \ -`$date = Get-Date -f hh:mm:ss; (New-Object -ComObject Wscript.Shell).Popup("PowerShell Exit: $date",0,"Action",64)` \ -`}` \ -`-SupportEvent` не выводит результат регистрации события на экран, в Get-EventSubscriber и Get-Job \ -`-Forward` перенаправляет события из удаленного сеанса (New-PSSession) в локальный сеанс - -`Register-ObjectEvent` регистрирует подписку на события объектов .NET \ -`$System_Obj | Get-Member -MemberType Event` отобразить список всех событий объекта \ -`Register-ObjectEvent -InputObject $System_Obj -EventName Click -SourceIdentifier SrvListClick -Action {` \ -`Write-Host $System_Obj.Text` \ -`}` \ -`Get-EventSubscriber` список зарегистрированных подписок на события в текущей сессии \ -`Unregister-Event -SourceIdentifier SrvListClick` удаляет регистрацию подписки на событие по имени события (или все *) \ -`Remove-Job -Name SrvListClick` удаляет задание \ -`-InputObject` объект или переменная, хранящая объект \ -`-EventName` событие (например, Click,MouseClick) \ -`-SourceIdentifier` название регистрируемого события \ -`-Action` действие при возникновении события - -### Out-File -`Read-Host –AsSecureString | ConvertFrom-SecureString | Out-File "$env:userprofile\desktop\password.txt"` писать в файл. Преобразовать пароль в формат SecureString с использованием шифрования Windows Data Protection API (DPAPI) - -### Get-Content (gc/cat/type) -`$password = gc "$env:userprofile\desktop\password.txt" | ConvertTo-SecureString` читать хэш пароля из файла с помощью ключей, хранящихся в профиле текущего пользователя, который невозможно прочитать на другом копьютере - -### AES Key -`$AESKey = New-Object Byte[] 32` \ -`[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey)` \ -`$AESKey | Out-File "C:\password.key"` \ -`$Cred.Password | ConvertFrom-SecureString -Key (Get-Content "C:\password.key") | Set-Content "C:\password.txt"` сохранить пароль в файл используя внешний ключ \ -`$pass = Get-Content "C:\password.txt" | ConvertTo-SecureString -Key (Get-Content "\\Server\Share\password.key")` расшифровать пароль на втором компьютере - -### Credential -`$Cred = Get-Credential` сохраняет креды в переменные $Cred.Username и $Cred.Password \ -`$Cred.GetNetworkCredential().password` извлечь пароль \ -`cmdkey /generic:"TERMSRV/$srv" /user:"$username" /pass:"$password"` добавить указанные креды аудентификации на на терминальный сервер для подключения без пароля \ -`mstsc /admin /v:$srv` авторизоваться \ -`cmdkey /delete:"TERMSRV/$srv"` удалить добавленные креды аудентификации из системы \ -`rundll32.exe keymgr.dll,KRShowKeyMgr` хранилище Stored User Names and Password \ -`Get-Service VaultSvc` служба для работы Credential Manager \ -`Install-Module CredentialManager` установить модуль управления Credential Manager к хранилищу PasswordVault из PowerShell \ -`[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Tls11,Tls12'` для устаноки модуля \ -`Get-StoredCredential` получить учетные данные из хранилища Windows Vault \ -`Get-StrongPassword` генератор пароля \ -`New-StoredCredential -UserName test -Password "123456"` добавить учетную запись \ -`Remove-StoredCredential` удалить учетную запись \ -`$Cred = Get-StoredCredential | where {$_.username -match "admin"}` \ -`$pass = $cred.password` \ -`$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)` \ -`[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)` - -### Items `Test-Path $path` проверить доступность пути \ `Get-Location` отобразить текущие месторасположение (Alias: pwd/gl) \ `Set-Location $path` перемещение по каталогам (Alias: cd/sl) \ @@ -459,8 +337,133 @@ `Add-LocalGroupMember -Group "Administrators" -Member "1C"` добавить в группу Администраторов \ `Get-LocalGroupMember "Administrators"` члены группы -### Out-Gridview -`Get-Service -cn $srv | Out-GridView -Title "Service $srv" -OutputMode Single –PassThru | Restart-Service` перезапустить выбранную службу +### Credential +`$Cred = Get-Credential` сохраняет креды в переменные $Cred.Username и $Cred.Password \ +`$Cred.GetNetworkCredential().password` извлечь пароль \ +`cmdkey /generic:"TERMSRV/$srv" /user:"$username" /pass:"$password"` добавить указанные креды аудентификации на на терминальный сервер для подключения без пароля \ +`mstsc /admin /v:$srv` авторизоваться \ +`cmdkey /delete:"TERMSRV/$srv"` удалить добавленные креды аудентификации из системы \ +`rundll32.exe keymgr.dll,KRShowKeyMgr` хранилище Stored User Names and Password \ +`Get-Service VaultSvc` служба для работы Credential Manager \ +`Install-Module CredentialManager` установить модуль управления Credential Manager к хранилищу PasswordVault из PowerShell \ +`[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Tls11,Tls12'` для устаноки модуля \ +`Get-StoredCredential` получить учетные данные из хранилища Windows Vault \ +`Get-StrongPassword` генератор пароля \ +`New-StoredCredential -UserName test -Password "123456"` добавить учетную запись \ +`Remove-StoredCredential` удалить учетную запись \ +`$Cred = Get-StoredCredential | where {$_.username -match "admin"}` \ +`$pass = $cred.password` \ +`$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)` \ +`[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)` + +### Out-File +`Read-Host –AsSecureString | ConvertFrom-SecureString | Out-File "$env:userprofile\desktop\password.txt"` писать в файл. Преобразовать пароль в формат SecureString с использованием шифрования Windows Data Protection API (DPAPI) + +### Get-Content (gc/cat/type) +`$password = gc "$env:userprofile\desktop\password.txt" | ConvertTo-SecureString` читать хэш пароля из файла с помощью ключей, хранящихся в профиле текущего пользователя, который невозможно прочитать на другом копьютере + +### AES Key +`$AESKey = New-Object Byte[] 32` \ +`[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey)` \ +`$AESKey | Out-File "C:\password.key"` \ +`$Cred.Password | ConvertFrom-SecureString -Key (Get-Content "C:\password.key") | Set-Content "C:\password.txt"` сохранить пароль в файл используя внешний ключ \ +`$pass = Get-Content "C:\password.txt" | ConvertTo-SecureString -Key (Get-Content "\\Server\Share\password.key")` расшифровать пароль на втором компьютере + +### Import-Clixml +`$CredFile = ".\cred.xml"` \ +`try {` \ +`$Cred = Import-Clixml -path $credFile` \ +`}` \ +`catch {` \ +`$Cred = Get-Credential -Message "Enter credential"` \ +`if ($Cred -ne $null) {` \ +`$Cred | Export-CliXml -Path $credFile` \ +`}` \ +`else {return}` \ +`}` + +### EventLog +`Get-EventLog -List` отобразить все корневые журналы логов и их размер \ +`Clear-EventLog Application` очистить логи указанного журнала \ +`Get-EventLog -LogName Security -InstanceId 4624` найти логи по ID в журнале Security + +`function Get-Log ($count=30,$hour=-3) {` # указать значения параметров по умолчанию \ +`Get-EventLog -LogName Application -Newest $count | where-Object TimeWritten -ge (Get-Date).AddHours($hour)` # отобразить 30 новых событий за последние 3 часа \ +`}` \ +`Get-Log 10 -1` # передача параметров функции (если значения идут по порядку, то можно не указывать названия переменных) + +### WinEvent +`Get-WinEvent -ListLog * | where logname -match SMB | sort -Descending RecordCount` отобразить все доступные журналы логов \ +`Get-WinEvent -LogName "Microsoft-Windows-SmbClient/Connectivity" | where` \ +`Get-WinEvent -LogName Security -MaxEvents 100` отобразить последние 100 событий \ +`Get-WinEvent -FilterHashtable @{LogName="Security";ID=4624}` найти логи по ID в журнале Security + +`$RDPAuths = Get-WinEvent -ComputerName $srv -LogName "Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational" -FilterXPath ''` \ +`[xml[]]$xml = $RDPAuths | Foreach {$_.ToXml()}` \ +`$EventData = Foreach ($event in $xml.Event) {` \ +`New-Object PSObject -Property @{` \ +`"Время подключения" = (Get-Date ($event.System.TimeCreated.SystemTime) -Format 'yyyy-MM-dd hh:mm K')` \ +`"Имя пользователя" = $event.UserData.EventXML.Param1` \ +`"Адрес клиента" = $event.UserData.EventXML.Param3` \ +`}}` \ +`$EventData | Out-Gridview -Title "История RDP подключений на сервере $srv"` + +`$obj = @() \ +`$fw = Get-WinEvent 'Microsoft-Windows-Windows Firewall With Advanced Security/Firewall'` \ +`foreach ($temp_fw in $fw) {` \ +`if ($temp_fw.id -eq 2004) {$type = "Added Rule"} elseif ($id -eq 2006) {$type = "Deleted Rule"}` \ +`$port = $temp_fw.Properties[7] | select -ExpandProperty value` \ +`$name = $temp_fw.Properties[1] | select -ExpandProperty value` \ +`$obj += [PSCustomObject]@{Time = $temp_fw.TimeCreated; Type = $type; Port = $port; Name = $name}` \ +`}` + +### Event +`Register-EngineEvent` регистрирует подписку на события PowerShell или New-Event и создает задание (Get-Job) \ +`Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action {` \ +`$date = Get-Date -f hh:mm:ss; (New-Object -ComObject Wscript.Shell).Popup("PowerShell Exit: $date",0,"Action",64)` \ +`}` \ +`-SupportEvent` не выводит результат регистрации события на экран, в Get-EventSubscriber и Get-Job \ +`-Forward` перенаправляет события из удаленного сеанса (New-PSSession) в локальный сеанс + +`Register-ObjectEvent` регистрирует подписку на события объектов .NET \ +`$System_Obj | Get-Member -MemberType Event` отобразить список всех событий объекта \ +`Register-ObjectEvent -InputObject $System_Obj -EventName Click -SourceIdentifier SrvListClick -Action {` \ +`Write-Host $System_Obj.Text` \ +`}` \ +`Get-EventSubscriber` список зарегистрированных подписок на события в текущей сессии \ +`Unregister-Event -SourceIdentifier SrvListClick` удаляет регистрацию подписки на событие по имени события (или все *) \ +`Remove-Job -Name SrvListClick` удаляет задание \ +`-InputObject` объект или переменная, хранящая объект \ +`-EventName` событие (например, Click,MouseClick) \ +`-SourceIdentifier` название регистрируемого события \ +`-Action` действие при возникновении события + +### Firewall +`New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol TCP -LocalPort 135` открыть in-порт \ +`Get-NetFirewallRule | Where-Object {$_.DisplayName -match "135"}` найти правило по имени \ +`Get-NetFirewallPortFilter | where LocalPort -like 80` найти действующие правило по номеру порта + +`Get-NetFirewallRule -Enabled True -Direction Inbound | select -Property DisplayName,` +`@{Name='Protocol';Expression={($_ | Get-NetFirewallPortFilter).Protocol}},` +`@{Name='LocalPort';Expression={($_ | Get-NetFirewallPortFilter).LocalPort}},` +`@{Name='RemotePort';Expression={($_ | Get-NetFirewallPortFilter).RemotePort}},` +`@{Name='RemoteAddress';Expression={($_ | Get-NetFirewallAddressFilter).RemoteAddress}},` +`Enabled,Profile` + +### Firewall-Manager +`Install-Module Firewall-Manager` \ +`Export-FirewallRules -Name * -CSVFile $home\documents\fw.csv` -Inbound -Outbound -Enabled -Disabled -Allow -Block (фильтр правил для экспорта) \ +`Import-FirewallRules -CSVFile $home\documents\fw.csv` + +### Performance +`(Get-Counter -ListSet *).CounterSetName` вывести список всех доступных счетчиков производительности в системе \ +`(Get-Counter -ListSet *memory*).Counter` все счетчики, включая дочернии, поиск по wildcard-имени \ +`Get-Counter "\Memory\Available MBytes"` объем свободной оперативной памяти \ +`Get-Counter -cn $srv "\LogicalDisk(*)\% Free Space"` % свободного места на всех разделах дисков \ +`(Get-Counter "\Process(*)\ID Process").CounterSamples` \ +`Get-Counter "\Processor(_Total)\% Processor Time" –ComputerName $srv -MaxSamples 5 -SampleInterval 2` 5 проверок каждые 2 секунды \ +`Get-Counter "\Процессор(_Total)\% загруженности процессора" -Continuous` непрерывно \ +`(Get-Counter "\Процессор(*)\% загруженности процессора").CounterSamples` ### Regedit `Get-PSDrive` список всех доступных дисков и веток реестра \ @@ -964,13 +967,18 @@ `Install-Package -Name Veeam.PowerCLI-Interactions` -ProviderName PSGallery # установка пакета \ `Get-Command *Veeam*` -### Veeam -`Set-ExecutionPolicy AllSigned # or Set-ExecutionPolicy Bypass -Scope Process` \ -`Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))` \ -`choco install veeam-backup-and-replication-console` \ -`Get-Command -Module Veeam.Backup.PowerShell` Get-VBRCommand \ -`Get-Module Veeam.Backup.PowerShell` \ -`Get-Help Veeam.Backup.PowerShell` +### ThreadJob +`Install-Module -Name ThreadJob` установить модуль \ +`Get-Module ThreadJob -list` \ +`(Start-ThreadJob {ping ya.ru}) | Out-Null` создать фоновую задачу \ +`while ($True){` \ +`$status = @((Get-Job).State)[-1]` # отобразить статус последней [-1] фоновой задачи \ +`if ($status -like "Completed"){` # если Completed \ +`Get-Job | Receive-Job` # отобразить вывод, после каждого запроса результат удаляется (Get-Job).HasMoreData -eq $False \ +`Get-Job | Remove-Job -Force` # удалить все задачи \ +`break` # остановить цикл \ +`}}` \ +`Get-Job | Receive-Job -Keep` отобразить и не удалять вывод (-Keep) ### PS2EXE `Install-Module ps2exe` установка модуля из PSGallery \ @@ -1070,3 +1078,21 @@ `Get-Command –Module *vmware* -name *syslog*` \ `Set-VMHostSysLogServer -VMHost esxi-05 -SysLogServer "tcp://192.168.3.100" -SysLogServerPort 3515` \ `Get-VMHostSysLogServer -VMHost esxi-05` + +# Veeam + +`Set-ExecutionPolicy AllSigned` or Set-ExecutionPolicy Bypass -Scope Process \ +`Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))` \ +`choco install veeam-backup-and-replication-console` \ +`Get-Module Veeam.Backup.PowerShell` \ +`Get-Command -Module Veeam.Backup.PowerShell` or Get-VBRCommand \ +`Connect-VBRServer -Server $srv -Credential $cred` or -user and -password \ +`Get-VBRJob` \ +`Get-VBRCommand *get*backup*` \ +`Get-VBRComputerBackupJob` \ +`Get-VBRBackup` \ +`Get-VBRBackupRepository` \ +`Get-VBRBackupSession` \ +`Get-VBRBackupServerCertificate` \ +`Get-VBRRestorePoint` \ +`https://veeam-11:9419/swagger/ui/index.html` RAST API