From 7b01fe859eaa170132a51d6d03e68d173de82050 Mon Sep 17 00:00:00 2001 From: Alex Kup <116945542+Lifailon@users.noreply.github.com> Date: Sat, 4 Nov 2023 02:10:29 +0300 Subject: [PATCH] add example rest api and telegram bot --- README.md | 544 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 337 insertions(+), 207 deletions(-) diff --git a/README.md b/README.md index a114132..05a0b0e 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,11 @@ - [DISM](#dism) - [Scheduled](#scheduled) - [Network](#network) +- [Shutdown](#shutdown) - [LocalAccounts](#localaccounts) - [SMB](#smb) - [ActiveDirectory](#activedirectory) +- [GPO](#gpo) - [ServerManager](#servermanager) - [DNS](#dnsserver) - [DHCP](#dhcpserver) @@ -33,6 +35,7 @@ - [TrueNAS](#truenas) - [Veeam](#veeam) - [REST API](#rest-api) +- [Telegram](#telegram) - [Pode](#pode) - [Selenium](#selenium) - [IE](#ie) @@ -153,47 +156,47 @@ `$srv[0] = Name` замена элемента в массиве \ `$srv[0].Length` узнать кол-во символов первого значения в массиве \ `$srv[10..100]` срез -``` +```PowerShell $array = "a","b","c","d" $num = 0 foreach ($a in $array) { $num += 1 -$index = [array]::IndexOf($array, $a)` узнать номер индекса по зачению -$array[$index] = $num` пересобрать исходный массив +$index = [array]::IndexOf($array, $a) # узнать номер индекса по зачению +$array[$index] = $num # пересобрать исходный массив } ``` ### HashTable -``` -$hashtable = @{"User" = "$env:username"; "Server" = "$env:computername"}` создать -$hashtable += @{"User2" = "$env:username"; "Server2" = "$env:computername"}` добавить ключи -$hashtable.Keys` список всех ключей -$hashtable["User"]` получить значение (Values) по ключу -$hashtable["User"] = "Test"` изменить -$hashtable.Remove("User")` удалить ключ +```PowerShell +$hashtable = @{"User" = "$env:username"; "Server" = "$env:computername"} # создать +$hashtable += @{"User2" = "$env:username"; "Server2" = "$env:computername"} # добавить ключи +$hashtable.Keys # список всех ключей +$hashtable["User"] # получить значение (Values) по ключу +$hashtable["User"] = "Test" # изменить +$hashtable.Remove("User") # удалить ключ ``` `$Tag = @{$true = 'dev'; $false = 'prod'}[([System.Net.Dns]::GetHostEntry("localhost").HostName) -match '.*.TestDomain$']` ### Collections/List -``` +```PowerShell $Collections = New-Object System.Collections.Generic.List[System.Object] $Collections.Add([PSCustomObject]@{User = $env:username; Server = $env:computername}) ``` ### PSCustomObject -``` +```PowerShell $CustomObject = [PSCustomObject][ordered]@{User = $env:username; Server = $env:computername} -$CustomObject | Add-Member –MemberType NoteProperty –Name Arr –Value @(1,2,3)` добавить Property (свойство/стобец) -$CustomObject.Arr = @(1,3,5)` изменить содержимое -$CustomObject.PsObject.Properties.Remove('User')` удалить Property +$CustomObject | Add-Member –MemberType NoteProperty –Name Arr –Value @(1,2,3) # добавить Property (свойство/стобец) +$CustomObject.Arr = @(1,3,5) # изменить содержимое +$CustomObject.PsObject.Properties.Remove('User') # удалить Property ``` ### Add-Member -``` +```PowerShell $ScriptBlock = {Get-Service} -$CustomObject | Add-Member -Name "TestMethod" -MemberType ScriptMethod -Value $ScriptBlock` Добавить Method +$CustomObject | Add-Member -Name "TestMethod" -MemberType ScriptMethod -Value $ScriptBlock # Добавить Method $CustomObject | Get-Member $CustomObject.TestMethod() ``` ### Class -``` +```PowerShell Class CustomClass { [string]$User [string]$Server @@ -218,11 +221,11 @@ $Class.Start(1) `(Get-Process | ? Name -match iperf).Modules` список используемых модулей процессом ### Expression -``` -ps | Sort-Object -Descending CPU | select -first 10 ProcessName,` сортировка по CPU, вывести первых 10 значений (-first) -@{Name="ProcessorTime"; Expression={$_.TotalProcessorTime -replace "\.\d+$"}},` затрачено процессорного времени в минутах -@{Name="Memory"; Expression={[string]([int]($_.WS / 1024kb))+"MB"}},` делим байты на КБ -@{Label="RunTime"; Expression={((Get-Date) - $_.StartTime) -replace "\.\d+$"}}` вычесть из текущего времени - время запуска, и удалить milisec +```PowerShell +ps | Sort-Object -Descending CPU | select -first 10 ProcessName, # сортировка по CPU, вывести первых 10 значений (-first) +@{Name="ProcessorTime"; Expression={$_.TotalProcessorTime -replace "\.\d+$"}}, # затрачено процессорного времени в минутах +@{Name="Memory"; Expression={[string]([int]($_.WS / 1024kb))+"MB"}}, # делим байты на КБ +@{Label="RunTime"; Expression={((Get-Date) - $_.StartTime) -replace "\.\d+$"}} # вычесть из текущего времени - время запуска, и удалить milisec ``` ### Select-String `ipconfig /all | Select-String dns` поиск текста @@ -363,10 +366,10 @@ $ # Конец строки `"{0:P0}" -f (220/1000)` посчитать в процентах (P) \ `"{0:P}" -f (512MB/1GB)` сколько % составляет 512Мб от 1Гб \ `"{0:0.0%}" -f 0.123` умножить на 100% -``` +```PowerShell $gp = Get-Process | sort cpu -Descending | select -First 10 foreach ($p in $gp) { -"{0} - {1:N2}" -f $p.processname, $p.cpu` округлить +"{0} - {1:N2}" -f $p.processname, $p.cpu # округлить } ``` ### Условный оператор @@ -477,7 +480,7 @@ foreach ($p in $gp) { `$char = $srv.ToCharArray()` разбить строку [string] на массив [System.Array] из букв \ ### Switch -``` +```PowerShell $MMM = Get-Date -UFormat "%m" switch($MMM) { "01" {$Month = 'Jan'} @@ -495,7 +498,7 @@ switch($MMM) { } ``` ### function switch -``` +```PowerShell Function fun-switch ( [switch]$param ) { @@ -564,7 +567,7 @@ fun-switch -param Результат деления записывается снизу вверх ``` ### Bit Convertor -``` +```PowerShell function ConvertTo-Bit { param ( [Int]$int @@ -589,7 +592,7 @@ function ConvertTo-Bit { } ``` `ConvertTo-Bit 347` -``` +```PowerShell function ConvertFrom-Bit { param ( $bit @@ -634,7 +637,7 @@ function ConvertFrom-Bit { ### DateTime `Get-TimeZone` часовой пояс \ -`[DateTime]::UtcNow` время в формате UTC 0` \ +`[DateTime]::UtcNow` время в формате UTC 0 \ `(Get-Date).AddHours(-3)` \ `$Date = (Get-Date -Format "dd/MM/yyyy hh:mm:ss")` \ `$Date = Get-Date -f "dd/MM/yyyy"` получаем тип данных [string] \ @@ -694,10 +697,10 @@ function ConvertFrom-Bit { `}` ### Try-Catch-Finally -``` +```PowerShell Try {$out = pping 192.168.3.1} -Catch {Write-Warning "$($error[0])"}` выводит в случае ошибки (вместо ошибки) -finally {$out = "End"}` выполняется в конце в любом случае +Catch {Write-Warning "$($error[0])"} # выводит в случае ошибки (вместо ошибки) +finally {$out = "End"} # выполняется в конце в любом случае ``` ### Error `$Error` выводит все ошибки текущего сеанса \ @@ -722,7 +725,7 @@ finally {$out = "End"}` выполняется в конце в любом сл `Get-Content $home/desktop\test.txt -Wait` аналог tail \ `Test-Path $path` проверить доступность пути \ -`Get-ChildItem $path -Filter *.txt -Recurse`` отобразить содержимое каталога (Alias: ls/gci/dir) и дочерних каталогов (-Recurse) и отфильтровать вывод \ +`Get-ChildItem $path -Filter *.txt -Recurse` отобразить содержимое каталога (Alias: ls/gci/dir) и дочерних каталогов (-Recurse) и отфильтровать вывод \ `Get-Location` отобразить текущие месторасположение (Alias: pwd/gl) \ `Set-Location $path` перемещение по каталогам (Alias: cd/sl) \ `Invoke-Item $path` открыть файл (Alias: ii/start) \ @@ -745,7 +748,7 @@ finally {$out = "End"}` выполняется в конце в любом сл `$log = Copy-Item "C:\*.txt" "C:\test\" -PassThru` вывести результат копирования (логирование) в переменную, можно забирать строки с помощью индексов $log[0].FullName ### Clear-env-Temp-14-days -``` +```PowerShell $ls = Get-Item $env:TEMP\*.tmp # считать все файлы с указанным расширением $date = (Get-Date).AddDays(-14) foreach ($l in $ls) { @@ -865,7 +868,7 @@ Get-WinEvent -LogName System -FilterXPath $query 6013` Время работы системы (system uptime) в секундах. ``` ### Logon -``` +```PowerShell $srv = "localhost" $FilterXPath = '' $RDPAuths = Get-WinEvent -ComputerName $srv -LogName "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" -FilterXPath $FilterXPath @@ -887,7 +890,7 @@ $EventData | ft `Get-EventLog -LogName Security -InstanceId 4624` найти логи по ID в журнале Security # Firewall -``` +```PowerShell $days = 5 $obj = @() $fw = Get-WinEvent "Microsoft-Windows-Windows Firewall With Advanced Security/Firewall" @@ -911,7 +914,7 @@ $obj | Where-Object time -gt (Get-Date).AddDays(-$days) `New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol TCP -LocalPort 135` открыть in-порт \ `Get-NetFirewallRule | where DisplayName -match kms | select *` найти правило по имени \ `Get-NetFirewallPortFilter | where LocalPort -like 80` найти действующие правило по номеру порта -``` +```PowerShell Get-NetFirewallRule -Enabled True -Direction Inbound | select -Property DisplayName, @{Name='Protocol';Expression={($_ | Get-NetFirewallPortFilter).Protocol}}, @{Name='LocalPort';Expression={($_ | Get-NetFirewallPortFilter).LocalPort}}, @@ -1041,7 +1044,7 @@ Enabled,Profile `Test-Connection -Count 1 $srv1, $srv2` отправить icmp-пакет двум хостам \ `Test-Connection $srv -ErrorAction SilentlyContinue` не выводить ошибок, если хост не отвечает \ `Test-Connection -Source $srv1 -ComputerName $srv2` пинг с удаленного компьютера -``` +```PowerShell function Test-PingNetwork { param ( [Parameter(Mandatory,ValueFromPipeline)][string[]]$Network, @@ -1124,7 +1127,7 @@ foreach ($n in $net) { ### arp `ipconfig /all | Select-String "физ"` grep \ `Get-NetNeighbor -AddressFamily IPv4` -``` +```PowerShell function Get-ARP { Param ( $proxy, @@ -1169,26 +1172,65 @@ $mac_coll `Get-ARP -search 192.168.3.100` \ `Get-ARP -search 192.168.3.100 -proxy dc-01` -### shutdown +# shutdown + `shutdown /r /o` перезагрузка в безопасный режим \ -`shutdown /s /t 600 /c "Power off after 10 minutes"` \ +`shutdown /s /t 600 /c "Power off after 10 minutes"` выключение \ +`shutdown /s /f` принудительное закрытие приложений \ `shutdown /a` отмена \ `shutdown /r /t 0 /m \\192.168.3.100` \ `Restart-Computer -ComputerName 192.168.3.100 -Protocol WSMan` через WinRM \ `Restart-Computer –ComputerName 192.168.3.100 –Force` через WMI \ `Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\Start\HideShutDown" -Name "value" -Value 1` скрыть кнопку выключения \ `Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\Start\HideRestart" -Name "value" -Value 1` скрыть кнопку перезагрузки - +```PowerShell +function Start-Shutdown { + <# + .SYNOPSIS + Module for shutdown and restart the computer at a specified time + .DESCRIPTION + Example: + # Start-Shutdown -Time "18:00" + # Start-Shutdown -Restart -Time "18:00" + # Start-Shutdown -Cancel + .LINK + https://github.com/Lifailon/PS-Commands + #> + param( + [string]$Time, + [switch]$Restart, + [switch]$Cancel + ) + if ($Time) { + $currentDateTime = Get-Date + $shutdownTime = Get-Date $Time + if ($shutdownTime -lt $currentDateTime) { + $shutdownTime = $shutdownTime.AddDays(1) + } + $timeUntilShutdown = $shutdownTime - $currentDateTime + $secondsUntilShutdown = [math]::Round($timeUntilShutdown.TotalSeconds) + } + if ($Cancel) { + Start-Process -FilePath "shutdown.exe" -ArgumentList "/a" + } elseif ($Restart) { + Write-Host "The computer will restart after $($timeUntilShutdown.Hours) hours and $($timeUntilShutdown.Minutes) minutes." + Start-Process -FilePath "shutdown.exe" -ArgumentList "/r", "/f", "/t", "$secondsUntilShutdown" + } else { + Write-Host "The computer will shutdown after $($timeUntilShutdown.Hours) hours and $($timeUntilShutdown.Minutes) minutes." + Start-Process -FilePath "shutdown.exe" -ArgumentList "/s", "/f", "/t", "$secondsUntilShutdown" + } +} +``` # LocalAccounts -`Get-Command -Module Microsoft.PowerShell.LocalAccounts` +`Get-Command -Module Microsoft.PowerShell.LocalAccounts` \ `Get-LocalUser` список пользователей \ `Get-LocalGroup` список групп \ `New-LocalUser "1C" -Password $Password -FullName "1C Domain"` создать пользователя \ `Set-LocalUser -Password $Password 1C` изменить пароль \ `Add-LocalGroupMember -Group "Administrators" -Member "1C"` добавить в группу Администраторов \ `Get-LocalGroupMember "Administrators"` члены группы -``` +```PowerShell @("vproxy-01","vproxy-02","vproxy-03") | %{ icm $_ {Add-LocalGroupMember -Group "Administrators" -Member "support4"} icm $_ {Get-LocalGroupMember "Administrators"} @@ -1543,7 +1585,8 @@ Error: 1722 - сервер rpc недоступен (ошибка отката `copy C:\Windows\NTDS\TEMP\ntds.dit C:\Windows\NTDS\ntds.dit` заменить оригинальный файл ntds.dit \ `Del C:\Windows\NTDS\*.log` удалить все лог файлы из каталога NTDS -### GPO +# GPO + `Get-Command -Module GroupPolicy` \ `Get-GPO -Domain domain.local -All | ft` \ `Get-GPO -Name LAPS` \ @@ -1575,12 +1618,12 @@ Error: 1722 - сервер rpc недоступен (ошибка отката При создании backup DC через WSB, создается копия состояния системы (System State), куда попадает база AD (NTDS.DIT), объекты групповых политик, содержимое каталога SYSVOL, реестр, метаданные IIS, база AD CS, и другие системные файлы и ресурсы. Резервная копия создается через службу теневого копирования VSS. \ `Get-WindowsFeature Windows-Server-Backup` проверить установлена ли роль \ `Add-Windowsfeature Windows-Server-Backup –Includeallsubfeature` установить роль -``` +```PowerShell $path="\\$srv\bak-dc\dc-03\" [string]$TargetUNC=$path+(get-date -f 'yyyy-MM-dd') -if ((Test-Path -Path $path) -eq $true) {New-Item -Path $TargetUNC -ItemType directory}` если путь доступен, создать новую директорию по дате +if ((Test-Path -Path $path) -eq $true) {New-Item -Path $TargetUNC -ItemType directory} # если путь доступен, создать новую директорию по дате $WBadmin_cmd = "wbadmin.exe START BACKUP -backupTarget:$TargetUNC -systemState -noverify -vssCopy -quiet" -# $WBadmin_cmd = "wbadmin start backup -backuptarget:$path -include:C:\Windows\NTDS\ntds.dit -quiet"` Backup DB NTDS +# $WBadmin_cmd = "wbadmin start backup -backuptarget:$path -include:C:\Windows\NTDS\ntds.dit -quiet" # Backup DB NTDS Invoke-Expression $WBadmin_cmd ``` ### RDS @@ -1602,7 +1645,7 @@ Invoke-Expression $WBadmin_cmd `Clear-DnsServerCache` \ `Get-DnsServerCache` \ `Get-DnsServerDiagnostics` -``` +```PowerShell $zone = icm $srv {Get-DnsServerZone} | select ZoneName,ZoneType,DynamicUpdate,ReplicationScope,SecureSecondaries, DirectoryPartitionName | Out-GridView -Title "DNS Server: $srv" –PassThru $zone_name = $zone.ZoneName @@ -1617,7 +1660,7 @@ Label="IPAddress"; Expression={$_.RecordData.IPv4Address.IPAddressToString}},Tim `Get-DnsServerResourceRecord -ZoneName domain.local -RRType A` вывести все А-записи в указанной зоне \ `Add-DnsServerResourceRecordA -Name new-host-name -IPv4Address 192.168.1.100 -ZoneName domain.local -TimeToLive 01:00:00 -CreatePtr` создать А-запись и PTR для нее \ `Remove-DnsServerResourceRecord -ZoneName domain.local -RRType A -Name new-host-name –Force` удалить А-запись -``` +```PowerShell $DNSServer = "DC-01" $DNSFZone = "domain.com" $DataFile = "C:\Scripts\DNS-Create-A-Records-from-File.csv" @@ -1637,7 +1680,7 @@ $TextA = "$FQDN IN A $IP" # DHCPServer `Get-Command -Module DhcpServer` -``` +```PowerShell $mac = icm $srv -ScriptBlock {Get-DhcpServerv4Scope | Get-DhcpServerv4Lease} | select AddressState, HostName,IPAddress,ClientId,DnsRegistration,DnsRR,ScopeId,ServerIP | Out-GridView -Title "HDCP Server: $srv" –PassThru (New-Object -ComObject Wscript.Shell).Popup($mac.ClientId,0,$mac.HostName,64) @@ -1776,7 +1819,7 @@ HostName,IPAddress,ClientId,DnsRegistration,DnsRR,ScopeId,ServerIP | Out-GridVie `Wait-Job` ожидание вывода команды \ `Receive-Job` получение результатов выполненного процесса \ `Remove-Job` удалить задачу -``` +```PowerShell function Start-PingJob ($Network) { $RNetwork = $Network -replace "\.\d{1,3}$","." foreach ($4 in 1..254) { @@ -1805,7 +1848,7 @@ break # завершаем цикл `Get-Job | Receive-Job -Keep` отобразить и не удалять вывод \ `(Get-Job).HasMoreData` если False, то вывод команы удален \ `(Get-Job)[-1].Output` отобразить вывод последней задачи -``` +```PowerShell function Start-PingThread ($Network) { $RNetwork = $Network -replace "\.\d{1,3}$","." foreach ($4 in 1..254) { @@ -1827,7 +1870,7 @@ break # завершаем цикл `(Measure-Command {Start-PingThread -Network 192.168.3.0}).TotalSeconds` 24 Seconds ### PoshRSJob -``` +```PowerShell function Start-PingRSJob ($Network) { $RNetwork = $Network -replace "\.\d{1,3}$","." foreach ($4 in 1..254) { @@ -1843,7 +1886,7 @@ Get-RSJob | Remove-RSJob `(Measure-Command {Start-PingRSJob -Network 192.168.3.0}).TotalSeconds` 10 Seconds # SMTP -``` +```PowerShell function Send-SMTP { param ( [Parameter(Mandatory = $True)]$mess @@ -1875,12 +1918,12 @@ $smtp.Send($Message) `Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V –All` установить роль на Windows Desktop \ `Get-Command -Module hyper-v` \ `Get-VMHost` -``` -New-VMSwitch -name NAT -SwitchType Internal` создать виртуальный коммутатор и адаптер для него -Get-NetAdapter | where InterfaceDescription -match Hyper-V` список сетевых адаптеров -New-NetNat -Name LocalNat -InternalIPInterfaceAddressPrefix "192.168.3.0/24"` задать сеть -Get-NetAdapter "vEthernet (NAT)" | New-NetIPAddress -IPAddress 192.168.3.200 -AddressFamily IPv4 -PrefixLength 24` присвоить адрес, необходимо на ВМ указать шлюз 192.168.3.200, что бы находиться за NAT, или в настройка ВМ указать соответствующий адаптер -Add-NetNatStaticMapping -NatName LocalNat -Protocol TCP -ExternalIPAddress 0.0.0.0 -ExternalPort 2222 -InternalIPAddress 192.168.3.103 -InternalPort 2121` проброс, вест трафик который приходит на хост Hyper-V TCP/2222, будет перенаправляться на соответствующий порт виртуальной машины за NAT. +```PowerShell +New-VMSwitch -name NAT -SwitchType Internal # создать виртуальный коммутатор и адаптер для него +Get-NetAdapter | where InterfaceDescription -match Hyper-V # список сетевых адаптеров +New-NetNat -Name LocalNat -InternalIPInterfaceAddressPrefix "192.168.3.0/24" # задать сеть +Get-NetAdapter "vEthernet (NAT)" | New-NetIPAddress -IPAddress 192.168.3.200 -AddressFamily IPv4 -PrefixLength 24 # присвоить адрес, необходимо на ВМ указать шлюз 192.168.3.200, что бы находиться за NAT, или в настройка ВМ указать соответствующий адаптер +Add-NetNatStaticMapping -NatName LocalNat -Protocol TCP -ExternalIPAddress 0.0.0.0 -ExternalPort 2222 -InternalIPAddress 192.168.3.103 -InternalPort 2121 # проброс, вест трафик который приходит на хост Hyper-V TCP/2222, будет перенаправляться на соответствующий порт виртуальной машины за NAT. (Get-NetAdapter | where Name -match NAT).Status ``` `Get-NetNatStaticMapping` отобразить пробросы (NAT) \ @@ -1890,7 +1933,7 @@ Add-NetNatStaticMapping -NatName LocalNat -Protocol TCP -ExternalIPAddress 0.0.0 `New-VMSwitch -Name Local -AllowManagementOS $True -NetAdapterName "Ethernet 4" -SwitchType External` создать вшений (External) виртуальный коммутатор \ `$VMName = "hv-dc-01"` -``` +```PowerShell $VM = @{ Name = $VMName MemoryStartupBytes = 4Gb @@ -1916,7 +1959,7 @@ New-VM @VM # VMWare/PowerCLI -`Install-Module -Name VMware.PowerCLI` -AllowClobber` установить модуль (PackageProvider: nuget) \ +`Install-Module -Name VMware.PowerCLI # -AllowClobber` установить модуль (PackageProvider: nuget) \ `Get-Module -ListAvailable VMware* | Select Name,Version` \ `Import-Module VMware.VimAutomation.Core` импортировать в сессию \ `Get-PSProvider | format-list Name,PSSnapIn,ModuleName` список оснасток Windows PowerShell @@ -1991,7 +2034,7 @@ New-VM @VM # Exchange/EMShell `$srv_cas = "exchange-cas"` \ -`$session_exchange = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$srv_cas/PowerShell/` -Credential $Cred -Authentication Kerberos` \ +`$session_exchange = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$srv_cas/PowerShell/` -Credential $Cred -Authentication Kerberos \ `Get-PSSession` \ `Import-PSSession $session_exchange -DisableNameChecking` импортировать в текущую сессию @@ -2227,7 +2270,7 @@ PickupDirectoryMaxMessagesPerMinute — скорость внутренней о `Get-ClientAccessServer | Update-FileDistributionService` ### PST -`New-MailboxExportRequest -Mailbox $name -filepath "\\$srv\pst\$name.PST"` -ContentFilter {(Received -lt "01/01/2021")} -Priority Highest/Lower` -IsArchive` выполнить экспорт из архива пользователя \ +`New-MailboxExportRequest -Mailbox $name -filepath "\\$srv\pst\$name.PST" # -ContentFilter {(Received -lt "01/01/2021")} -Priority Highest/Lower # -IsArchive` выполнить экспорт из архива пользователя \ `New-MailboxExportRequest -Mailbox $name -IncludeFolders "#Inbox#" -FilePath "\\$srv\pst\$name.PST"` только папку входящие \ `New-MailboxImportRequest -Mailbox $name "\\$srv\pst\$name.PST"` импорт из PST \ `Get-MailboxExportRequest` статус запросов \ @@ -2238,7 +2281,7 @@ PickupDirectoryMaxMessagesPerMinute — скорость внутренней о `Get-DistributionGroup` список групп рассылки \ `Get-DistributionGroupMember "!_Офис"` список пользователей в группе \ `Add-DistributionGroupMember -Identity "!_Офис" -Member "$name@$domain"` добавить в группу рассылки \ -`Remove-DistributionGroupMember -Identity "!_Офис" -Member "$name@$domain" \ +`Remove-DistributionGroupMember -Identity "!_Офис" -Member "$name@$domain"` \ `New-DistributionGroup -Name "!_Тест" -Members "$name@$domain"` создать группу \ `Set-DistributionGroup -Identity "support4" -HiddenFromAddressListsEnabled $true (или Set-Mailbox)` скрыть из списка адресов Exchange @@ -2390,34 +2433,59 @@ CopyQueue Length - длина репликационной очереди коп # REST API -`$pars = Invoke-WebRequest -Uri $url` \ -`$pars | Get-Member` \ -`$pars.Content` \ -`$pars.StatusCode -eq 200` \ -`$pars.Headers` \ -`$pars.ParsedHtml | Select lastModified` \ -`$pars.Links | fl title,innerText,href` \ -`$pars.Images.src` links on images \ -`iwr $url -OutFile $path` download -``` -$pars = wget -Uri $url -$pars.Images.src | %{ -$name = $_ -replace ".+(?<=/)" -wget $_ -OutFile "$home\Pictures\$name" +`$iwr = Invoke-WebRequest -Uri $url` \ +`$iwr | Get-Member` \ +`$iwr.Content` \ +`$iwr.StatusCode -eq 200` \ +`$iwr.Headers` \ +`$iwr.ParsedHtml | Select lastModified` \ +`$iwr.Links | fl title,innerText,href` \ +`$iwr.Images.src` + +### Methods + +**GET** - Read \ +**POST** - Create \ +**PATCH** - Partial update/modify \ +**PUT** - Update/replace \ +**DELETE** - Remove + +### Download Image +```PowerShell +function Download-Image { +param ( + [Parameter(Mandatory = $True)]$url +) + $folder = $url -replace "http.+://" -replace "/","-" -replace "-$" + $path = "$home\Pictures\$folder" + if (Test-Path $path) { + Remove-Item $path -Recurse -Force + New-Item -ItemType Directory $path > $null + } else { + New-Item -ItemType Directory $path > $null + } + $irm = Invoke-WebRequest -Uri $url + foreach ($img in $irm.Images.src) { + $name = $img -replace ".+/" + Start-Job { + Invoke-WebRequest $using:img -OutFile "$using:path\$using:name" + } > $null + } + while ($True){ + $status_job = (Get-Job).State[-1] + if ($status_job -like "Completed"){ + Get-Job | Remove-Job -Force + break + }} + $count_all = $irm.Images.src.Count + $count_down = (Get-Item $path\*).count + "Downloaded $count_down of $count_all files to $path" } -$count_all = $pars.Images.src.Count -$count_down = (Get-Item $path\*).count -"Downloaded $count_down of $count_all files to $path" ``` -Methods: \ -GET - Read \ -POST - Create \ -PATCH - Partial update/modify \ -PUT - Update/replace \ -DELETE - Remove +`Download-Image -url https://losst.pro/` ### Token -``` +```PowerShell https://veeam-11:9419/swagger/ui/index.html $Header = @{ "x-api-version" = "1.0-rev2" @@ -2431,7 +2499,7 @@ $vpost = iwr "https://veeam-11:9419/api/oauth2/token" -Method POST -Headers $Hea $vtoken = (($vpost.Content) -split '"')[3] ``` ### GET -``` +```PowerShell $token = $vtoken | ConvertTo-SecureString -AsPlainText –Force $vjob = iwr "https://veeam-11:9419/api/v1/jobs" -Method GET -Headers $Header -Authentication Bearer -Token $token -SkipCertificateCheck @@ -2445,27 +2513,90 @@ $vjob = $vjob.Content | ConvertFrom-Json $vjob = Invoke-RestMethod "https://veeam-11:9419/api/v1/jobs" -Method GET -Headers $Header -SkipCertificateCheck $vjob.data.virtualMachines.includes.inventoryObject ``` -### Telegram -```powershell -function Send-Telegram { +# Telegram + +`@BotFather (https://t.me/BotFather) /newbot` \ +`https://api.telegram.org/bot/` +```PowerShell +function Get-FromTelegram { param ( -[Parameter(Mandatory = $True)]$Text -)$token_bot = "5517149522:AAFop4_darMpTT7VgLpY2hjkDkkV1dzmGNM" -$id_chat = "-609779646" -$payload = @{ -"chat_id" = $id_chat -"text" = $Text -"parse_mode" = "html" -} -Invoke-RestMethod -Uri ("https://api.telegram.org/bot{0}/sendMessage" -f $token_bot) -Method Post -ContentType "application/json;charset=utf-8" -Body ( -ConvertTo-Json -Compress -InputObject $payload + $token = "687...:AAF...", + [switch]$last, + [switch]$date ) +$endpoint = "getUpdates" +$url = "https://api.telegram.org/bot$token/$endpoint" +$result = Invoke-RestMethod -Uri $url +if ($date) { +$Collections = New-Object System.Collections.Generic.List[System.Object] +foreach ($r in $($result.result)) { + $EpochTime = [DateTime]"1/1/1970" + $TimeZone = Get-TimeZone + $UTCTime = $EpochTime.AddSeconds($r.message.date) + $d = $UTCTime.AddMinutes($TimeZone.BaseUtcOffset.TotalMinutes) + #$d + $Collections.Add([PSCustomObject]@{ + Message = $r.message.text; + Date = $d + }) +} +$Collections +} else { +if ($last) { + $result.result.message.text[-1] # прочитать последнее сообщение +} else { + $result.result.message.text +} +#$result.result.message.chat.id[-1] # получить индивидуальный chat_id с ботом +} } ``` -`Send-Telegram -Text Test` +`Get-FromTelegram` \ +`Get-FromTelegram -last` \ +`Get-FromTelegram -date` + +https://core.telegram.org/bots/api#sendmessage +```PowerShell +function Send-ToTelegram { +param ( +[Parameter(Mandatory = $True)]$Text, +$token = "687...:AAF...", +$chat = "125468108" +) +$endpoint = "sendMessage" +$url = "https://api.telegram.org/bot$token/$endpoint" +$Body = @{ +chat_id = $Chat +text = $Text +} +Invoke-RestMethod -Uri $url -Body $Body +} +``` +`Send-ToTelegram -Text "Send test from powershell"` +```PowerShell +$LastDate = (Get-FromTelegram -date)[-1].Date +while ($true) { + $LastMessage = (Get-FromTelegram -date)[-1] + Start-Sleep 1 + $LastDateTest = $LastMessage.Date + if (($LastMessage.Message -match "/Service") -and ($LastDate -ne $LastDateTest)) { + $ServiceName = $($LastMessage.Message -split " ")[-1] + $Result = $(Get-Service $ServiceName -ErrorAction Ignore).Status + if ($Result) { + Send-ToTelegram -Text $Result + } else { + Send-ToTelegram -Text "Service not found" + } + $LastDate = $LastDateTest + } +} +``` +`/Service vpnagent` \ +`/Service WinRM` \ +`/Service test` # Pode -``` +```PowerShell Start-PodeServer { Add-PodeEndpoint -Address localhost -Port "8080" -Protocol "HTTP" ### Get info endpoints @@ -2522,7 +2653,7 @@ Start-PodeServer { # Selenium `Invoke-Expression(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/Deploy-Selenium/rsa/Deploy-Selenium-Drivers.ps1")` установка всех драйверов и Chromium подходящей версии для драйвера -``` +```PowerShell $path = "$home\Documents\Selenium\" $ChromeDriver = "$path\ChromeDriver.exe" $WebDriver = "$path\WebDriver.dll" @@ -2569,7 +2700,7 @@ finally { `$Go_Button = $All_Elements | ? innerText -like "go"` поиск элемента по имени \ `$Go_Button | select ie9_tagName` получить TagName (SPAN) для быстрого дальнейшего поиска \ `$SPAN_Elements = $ie.document.IHTMLDocument3_getElementsByTagName("SPAN")` -``` +```PowerShell $ie = New-Object -ComObject InternetExplorer.Application $ie.navigate("https://yandex.ru") $ie.visible = $true @@ -2624,11 +2755,10 @@ $ie.Quit() `$wshell.SendKeys("{F1}")` \ `$wshell.SendKeys("{F12}")` \ `$wshell.SendKeys("{+}{^}{%}{~}{(}{)}{[}{]}{{}{}}")` -``` +```PowerShell function Get-AltTab { -$wshell = New-Object -ComObject wscript.shell -$wshell.SendKeys("%{Tab}") # ALT+TAB -sleep 120 +(New-Object -ComObject wscript.shell).SendKeys("%{Tab}") +Start-Sleep $(Get-Random -Minimum 30 -Maximum 180) Get-AltTab } Get-AltTab @@ -2639,26 +2769,26 @@ Get-AltTab `if ($output -eq 6) {"yes"} elseif ($output -eq 7) {"no"} else {"no good"}` ``` Type: -0` ОК -1` ОК и Отмена -2` Стоп, Повтор, Пропустить -3` Да, Нет, Отмена -4` Да и Нет -5` Повтор и Отмена -16` Stop -32` Question -48` Exclamation -64` Information +0 ОК +1 ОК и Отмена +2 Стоп, Повтор, Пропустить +3 Да, Нет, Отмена +4 Да и Нет +5 Повтор и Отмена +16 Stop +32 Question +48 Exclamation +64 Information Output: --1` Timeout -1` ОК -2` Отмена -3` Стоп -4` Повтор -5` Пропустить -6` Да -7` Нет +-1 Timeout +1 ОК +2 Отмена +3 Стоп +4 Повтор +5 Пропустить +6 Да +7 Нет ``` ### WScript.Network `$wshell = New-Object -ComObject WScript.Network` \ @@ -2681,7 +2811,7 @@ Output: `$Outlook = New-Object -ComObject Outlook.Application` \ `$Outlook | Get-Member` \ `$Outlook.Version` -``` +```PowerShell $Outlook = New-Object -ComObject Outlook.Application $Namespace = $Outlook.GetNamespace("MAPI") $Folder = $namespace.GetDefaultFolder(4)` исходящие @@ -2721,7 +2851,7 @@ $Outlook.Quit() `[System.Web.Security.Membership]::GeneratePassword(10,2)` ### SoundPlayer -``` +```PowerShell $CriticalSound = New-Object System.Media.SoundPlayer $CriticalSound.SoundLocation = "C:\WINDOWS\Media\Windows Critical Stop.wav" $CriticalSound.Play() @@ -2741,7 +2871,7 @@ $GoodSound.Play() `[System.Diagnostics.Process]::Start('notepad.exe')` ### [Clicker] -``` +```PowerShell $cSource = @' using System; using System.Drawing; @@ -2806,7 +2936,7 @@ public static void LeftClickAtPoint(int x, int y) `[Clicker]::LeftClickAtPoint(1900,1070)` ### [Audio] -``` +```PowerShell Add-Type -Language CsharpVersion3 -TypeDefinition @" using System.Runtime.InteropServices; [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] @@ -2857,7 +2987,7 @@ set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); } ### NetSessionEnum Function: https://learn.microsoft.com/ru-ru/windows/win32/api/lmshare/nf-lmshare-netsessionenum?redirectedfrom=MSDN \ Source: https://fuzzysecurity.com/tutorials/24.html -``` +```PowerShell function Invoke-NetSessionEnum { param ( [Parameter(Mandatory = $True)][string]$HostName @@ -2931,7 +3061,7 @@ echo "`nCalling NetApiBufferFree, no memleaks here!" ### CopyFile Function: https://learn.microsoft.com/ru-ru/windows/win32/api/winbase/nf-winbase-copyfile \ Source: https://devblogs.microsoft.com/scripting/use-powershell-to-interact-with-the-windows-api-part-1/ -``` +```PowerShell $MethodDefinition = @" [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool CopyFile(string lpExistingFileName, string lpNewFileName, bool bFailIfExists); @@ -2941,7 +3071,7 @@ $Kernel32::CopyFile("$($Env:SystemRoot)\System32\calc.exe", "$($Env:USERPROFILE) ``` ### ShowWindowAsync Function: https://learn.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser-showwindowasync -``` +```PowerShell $Signature = @" [DllImport("user32.dll")]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); "@ @@ -2958,7 +3088,7 @@ Function: https://learn.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser `[int][System.Windows.Forms.Keys]::F1` `65..90 | % {"{0} = {1}" -f $_, [System.Windows.Forms.Keys]$_}` -``` +```PowerShell function Get-ControlKey { $key = 112 $Signature = @' @@ -2988,7 +3118,7 @@ Source: https://powershell.one/tricks/input-devices/detect-key-press `[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("windows-1251")` для ps2exe \ `Get-Service | Out-File $home\Desktop\Service.txt -Encoding oem` > \ `Get-Service | Out-File $home\Desktop\Service.txt -Append` >> -``` +```PowerShell do { if ([Console]::KeyAvailable) { $keyInfo = [Console]::ReadKey($true) @@ -3024,7 +3154,7 @@ sleep 1 } while ($true) ``` ### Register-ObjectEvent -``` +```PowerShell $Timer = New-Object System.Timers.Timer $Timer.Interval = 1000 Register-ObjectEvent -InputObject $Timer -EventName Elapsed -SourceIdentifier Timer.Output -Action { @@ -3049,7 +3179,7 @@ $date = Get-Date -f hh:mm:ss ### UDP Socket Source: https://cloudbrothers.info/en/test-udp-connection-powershell/ -``` +```PowerShell function Start-UDPServer { param( $Port = 5201 @@ -3073,7 +3203,7 @@ Message = $ReturnString `Start-UDPServer -Port 5201` ### Test-NetUDPConnection -``` +```PowerShell function Test-NetUDPConnection { param( [string]$ComputerName = "127.0.0.1", @@ -3100,7 +3230,7 @@ $UdpObject.Close() `Test-NetUDPConnection -ComputerName 127.0.0.1 -PortServer 514 -Message "<30>May 31 00:00:00 HostName multipathd[784]: Test message"` ### TCP Socket -``` +```PowerShell function Start-TCPServer { param( $Port = 5201 @@ -3119,7 +3249,7 @@ $ReceiveBytes.Client.RemoteEndPoint | select Address,Port ### WakeOnLan Broadcast package consisting of 6 byte filled "0xFF" and then 96 byte where the mac address is repeated 16 times -``` +```PowerShell function Send-WOL { param ( [Parameter(Mandatory = $True)]$Mac, @@ -3158,7 +3288,7 @@ $UdpClient.Close() `$Image.Save("$home\Desktop\1200x800.jpg")` ### HTTP Listener -``` +```PowerShell $httpListener = New-Object System.Net.HttpListener $httpListener.Prefixes.Add("http://+:8888/") $httpListener.Start() @@ -3181,7 +3311,7 @@ $httpListener.Close() `(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/PowerShell-Commands/rsa/README.md")` ### Certificate -``` +```PowerShell function Get-WebCertificate ($srv) { $iwr = iwr $srv $status_code = $iwr.StatusCode @@ -3207,7 +3337,7 @@ $Collections `Get-WebCertificate https://google.com` # Excel -``` +```PowerShell $path = "$home\Desktop\Services-to-Excel.xlsx" $Excel = New-Object -ComObject Excel.Application $Excel.Visible = $false` отключить открытие GUI @@ -3259,7 +3389,7 @@ $ExcelWorkBook.close($true) $Excel.Quit() ``` ### Excel.Application.Open -``` +```PowerShell $path = "$home\Desktop\Services-to-Excel.xlsx" $Excel = New-Object -ComObject Excel.Application $Excel.Visible = $false @@ -3282,7 +3412,7 @@ $Excel.Quit() `Get-Service | Select Name,DisplayName,Status,StartType | Export-Csv -path "$home\Desktop\Get-Service.csv" -Append -Encoding Default` экспортировать в csv (-Encoding UTF8) \ `Import-Csv "$home\Desktop\Get-Service.csv" -Delimiter ","` импортировать массив -``` +```PowerShell $data = ConvertFrom-Csv @" Region,State,Units,Price West,Texas,927,923.71 @@ -3294,7 +3424,7 @@ $null,Tennessee,466,770.67 `$systeminfo."Доступная физическая память"` ### ConvertFrom-String -``` +```PowerShell ' log = { @@ -3303,14 +3433,14 @@ log = ' | ConvertFrom-String` создает PSCustomObject (разбивает по пробелам, удаляет все пробелы и пустые строки) ``` ### ConvertFrom-StringData -``` +```PowerShell " key1 = value1 key2 = value2 " | ConvertFrom-StringData # создает Hashtable ``` # XML -``` +```PowerShell $xml = [xml](Get-Content $home\desktop\test.rdg)` прочитать содержимое XML-файла $xml.load("$home\desktop\test.rdg")` открыть файл $xml.RDCMan.file.group.properties.name` имена групп @@ -3326,7 +3456,7 @@ $xml.Save($file)` сохранить содержимое объекта в фа `ConvertTo-Xml (Get-Service)` ### Get-CredToXML -``` +```PowerShell function Get-CredToXML { param ( $CredFile = "$home\Documents\cred.xml" @@ -3351,7 +3481,7 @@ function Get-CredToXML { `$PasswordText = $Cred.GetNetworkCredential().password` получить пароль в текстовом виде ### XmlWriter (Extensible Markup Language) -``` +```PowerShell $XmlWriterSettings = New-Object System.Xml.XmlWriterSettings $XmlWriterSettings.Indent = $true` включить отступы $XmlWriterSettings.IndentChars = " "` задать отступ @@ -3376,7 +3506,7 @@ $XmlObjectWriter.Flush() $XmlObjectWriter.Close() ``` ### CreateElement -``` +```PowerShell $xml = [xml](gc $home\desktop\test.xml) $xml.Root.Configuration.Fonts $NewElement = $xml.CreateElement("Fonts")` выбрать элемент куда добавить @@ -3385,7 +3515,7 @@ $xml.Root.Configuration.AppendChild($NewElement)` добавить элемен $xml.Save("$home\desktop\test.xml") ``` # JSON -``` +```PowerShell $log = ' { "log": { @@ -3408,7 +3538,7 @@ $OOKLA = ' $ookla.result ``` # YAML -``` +```PowerShell Import-Module PSYaml` используется в Docker/Ansible $netplan = " network:` словарь по типу - ключ : значение с вложенными словарями @@ -3435,7 +3565,7 @@ bool: !!bool` boolean # HTML ### ConvertFrom-Html -``` +```PowerShell function ConvertFrom-Html { param ( [Parameter(ValueFromPipeline)]$url @@ -3453,7 +3583,7 @@ $apache_status | ConvertFrom-Html ### ConvertTo-Html `Get-Process | select Name, CPU | ConvertTo-Html -As Table > "$home\desktop\proc-table.html"` вывод в формате List (Format-List) или Table (Format-Table) -``` +```PowerShell $servers = "ya.ru","ya.com","google.com" $path = "$home\Desktop\Ping.html" $header = @" @@ -3498,13 +3628,13 @@ $results | ConvertTo-Html -head $header -body $body | foreach { Invoke-Item $path ``` ### PSWriteHTML -``` +```PowerShell Import-Module PSWriteHTML (Get-Module PSWriteHTML).ExportedCommands Get-Service | Out-GridHtml -FilePath ~\Desktop\Get-Service-Out-GridHtml.html ``` ### HtmlReport -``` +```PowerShell Import-Module HtmlReport $topVM = ps | Sort PrivateMemorySize -Descending | Select -First 10 | %{,@(($_.ProcessName + " " + $_.Id), $_.PrivateMemorySize)} $topCPU = ps | Sort CPU -Descending | Select -First 10 | %{,@(($_.ProcessName + " " + $_.Id), $_.CPU)} @@ -3515,7 +3645,7 @@ ps | Select ProcessName, Id, CPU, WorkingSet, *MemorySize | New-Table "All Proce } > ~\Desktop\Get-Process-HtmlReport.html ``` # SQLite -``` +```PowerShell $path = "$home\Documents\Get-Service.db" $Module = Get-Module MySQLite if ($Module -eq $null) { @@ -3536,14 +3666,14 @@ Invoke-MySQLiteQuery -Path $path -Query "INSERT INTO Service (Name, DisplayName, `(Get-MySQLiteDB $path).Tables` список таблиц в базе \ `Invoke-MySQLiteQuery -Path $path -Query "SELECT name FROM sqlite_master WHERE type='table';"` список таблиц в базе \ `Invoke-MySQLiteQuery -Path $path -Query "DROP TABLE Service;"` удалить таблицу -``` +```PowerShell $TableName = "Service" Invoke-MySQLiteQuery -Path $path -Query "SELECT * FROM $TableName" # прочитать содержимое таблицы (в формате объекта) ``` `Get-Service | select Name,DisplayName,Status | ConvertTo-MySQLiteDB -Path $path -TableName Service -force` конвертировать объект в таблицу ### Database password -``` +```PowerShell $Connection = New-SQLiteConnection -DataSource $path $Connection.ChangePassword("password") $Connection.Close() @@ -3723,7 +3853,7 @@ innodb_force_recovery=6 # запуск СУБД в режиме read only ### MySQL Connector NET ### Add-ADUser -``` +```PowerShell $ip = "192.168.1.253" $user = "posh" $pass = "1qaz!QAZ" @@ -3745,7 +3875,7 @@ $Command.ExecuteNonQuery() $Connection.Close() ``` ### Get-ADUser -``` +```PowerShell $ip = "192.168.1.253" $user = "posh" $pass = "1qaz!QAZ" @@ -3796,7 +3926,7 @@ SELECT name FROM master.dbo.sysdatabases go ``` ### System.Data.SqlClient -``` +```PowerShell $user = "itinvent" $pass = "itinvent" $db = "itinvent" @@ -3818,7 +3948,7 @@ $Data = $DataSet.Tables $Data[0] | ft ``` ### SqlClient INSERT -``` +```PowerShell $user = "itinvent" $pass = "itinvent" $db = "db_test" @@ -4283,7 +4413,7 @@ Invoke-RestMethod -Method POST -Uri $url -Body "$table,host=$(hostname) download `$dbs = irm "http://192.168.3.104:8086/query?q=SHOW DATABASES"` \ `$dbs = irm "http://192.168.3.104:8086/query?epoch=ms&u=admin&p=password&q=SHOW DATABASES"` \ `$dbs.results.series.values` -``` +```PowerShell $ip = "192.168.3.104" $port = "8086" $db = "powershell" @@ -4298,14 +4428,14 @@ $data.results.series.values ` данные построчно ``` ### Endpoints https://docs.influxdata.com/influxdb/v1.7/tools/api/ -``` +```PowerShell $stats = irm http://192.168.3.104:8086/debug/vars` статистика сервера $stats."database:powershell".values` кол-во таблиц к БД $stats.queryExecutor.values` количество query-запросов (обращений к endpoint /query) $stats.write.values` количество write-запросов $stats.system.uptime ``` -`http://192.168.3.104:8086/debug/requests` кол-во клиентских HTTP-запросов к конечным точкам /writeи /query` \ +`http://192.168.3.104:8086/debug/requests` кол-во клиентских HTTP-запросов к конечным точкам /writeи /query \ `http://192.168.3.104:8086/debug/pprof` \ `http://192.168.3.104:8086/ping` \ `http://192.168.3.104:8086/query` \ @@ -4316,7 +4446,7 @@ $stats.system.uptime `http://192.168.3.99:8086/api/v2/write` ### PingTo-InfluxDB -``` +```PowerShell while ($true) { $tz = (Get-TimeZone).BaseUtcOffset.TotalMinutes $unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End ((Get-Date).AddMinutes(-$tz))).TotalSeconds` -3h UTC @@ -4331,7 +4461,7 @@ while ($true) { `SELECT * FROM ping WHERE status = false` ### PerformanceTo-InfluxDB -``` +```PowerShell function ConvertTo-Encoding ([string]$From, [string]$To) { Begin { $encFrom = [System.Text.Encoding]::GetEncoding($from) @@ -4361,7 +4491,7 @@ while ($true) { } ``` ### Service -``` +```PowerShell $powershell_Path = (Get-Command powershell).Source $NSSM_Path = "C:\NSSM\NSSM-2.24.exe" $Script_Path = "C:\NSSM\PerformanceTo-InfluxDB.ps1" @@ -4422,7 +4552,7 @@ https://www.cdata.com/kb/tech/elasticsearch-ado-powershell.rst `Install-Module ElasticsearchCmdlets` https://www.powershellgallery.com/packages/ElasticsearchCmdlets/23.0.8565.1 \ `Import-Module ElasticsearchCmdlets` \ `Get-Command -Module ElasticsearchCmdlets` -``` +```PowerShell $elasticsearch = Connect-Elasticsearch -Server "$Server" -Port "$Port" -User "$User" -Password "$Password" $shipcity = "New York" $orders = Select-Elasticsearch -Connection $elasticsearch -Table "Orders" -Where "ShipCity = `'$ShipCity`'"` поиск и получение данных @@ -4432,7 +4562,7 @@ $orders = Invoke-Elasticsearch -Connection $elasticsearch -Query 'SELECT * FROM `Install-Package CData.Elasticsearch` https://www.nuget.org/packages/CData.Elasticsearch \ `[Reflection.Assembly]::LoadFile("C:\Program Files\PackageManagement\NuGet\Packages\CData.Elasticsearch.23.0.8565\lib\net40\System.Data.CData.Elasticsearch.dll")` -``` +```PowerShell $connect = New-Object System.Data.CData.Elasticsearch.ElasticsearchConnection("Server=127.0.0.1;Port=9200;User=admin;Password=123456;") $connect.Open() $sql = "SELECT OrderName, Freight from Orders" @@ -4444,7 +4574,7 @@ Write-Host $_.ordername $_.freight } ``` ### UPDATE -``` +```PowerShell Update-Elasticsearch -Connection $Elasticsearch -Columns @('OrderName','Freight') -Values @('MyOrderName', 'MyFreight') -Table Orders -Id "MyId" $cmd = New-Object System.Data.CData.Elasticsearch.ElasticsearchCommand("UPDATE Orders SET ShipCity='New York' WHERE Id = @myId", $conn) @@ -4452,7 +4582,7 @@ $cmd.Parameters.Add(new System.Data.CData.Elasticsearch.ElasticsearchParameter(" $cmd.ExecuteNonQuery() ``` ### INSERT -``` +```PowerShell Add-Elasticsearch -Connection $Elasticsearch -Table Orders -Columns @("OrderName", "Freight") -Values @("MyOrderName", "MyFreight") $cmd = New-Object System.Data.CData.Elasticsearch.ElasticsearchCommand("INSERT INTO Orders (ShipCity) VALUES (@myShipCity)", $conn) @@ -4460,7 +4590,7 @@ $cmd.Parameters.Add(new System.Data.CData.Elasticsearch.ElasticsearchParameter(" $cmd.ExecuteNonQuery() ``` ### DELETE -``` +```PowerShell Remove-Elasticsearch -Connection $Elasticsearch -Table "Orders" -Id "MyId" $cmd = New-Object System.Data.CData.Elasticsearch.ElasticsearchCommand("DELETE FROM Orders WHERE Id=@myId", $conn) @@ -4473,7 +4603,7 @@ $cmd.ExecuteNonQuery() `Get-OdbcDriver | ft` список установленных драйверов https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-client-apps-ps1.html -``` +```PowerShell $connectstring = "DSN=Local Elasticsearch;" $sql = "SELECT * FROM library" $conn = New-Object System.Data.Odbc.OdbcConnection($connectstring) @@ -4488,7 +4618,7 @@ $dt # PostgreSQL Скачать и установить драйвер: https://www.postgresql.org/ftp/odbc/versions/msi/ -``` +```PowerShell $dbServer = "192.168.3.101" $port = "5432" $dbName = "test" @@ -4540,7 +4670,7 @@ foreach ($row in $dsDB[0].Tables[0].Rows) { `gwmi Win32_OperatingSystem | Get-Member -MemberType Method` методы reboot и shutdown \ `(gwmi Win32_OperatingSystem -EnableAllPrivileges).Reboot()` используется с ключем повышения привелегий \ `(gwmi Win32_OperatingSystem -EnableAllPrivileges).Win32Shutdown(0)` завершение сеанса пользователя -``` +```PowerShell $system = Get-WmiObject -Class Win32_OperatingSystem $InstallDate = [Management.ManagementDateTimeconverter]::ToDateTime($system.installdate)` Получаем дату установки ОС $AfterInstallDays = ((Get-Date) — $Installdate).Days` Вычисляем время, прошедшее с момента установки @@ -4611,7 +4741,7 @@ Windows Registry Editor Version 5.00 `(Get-Counter -ListSet *интерфейс*).Counter` найти все счетчики \ `Get-Counter "\Сетевой интерфейс(*)\Всего байт/с"` отобразить все адаптеры (выбрать действующий по трафику) -``` +```PowerShell $WARNING = 25 $CRITICAL = 50 $TransferRate = ((Get-Counter "\\huawei-mb-x-pro\сетевой интерфейс(intel[r] wi-fi 6e ax211 160mhz)\всего байт/с" @@ -4680,7 +4810,7 @@ Security: \ https://api.nuget.org/v3-flatcontainer/lextm.sharpsnmplib/12.5.2/lextm.sharpsnmplib.12.5.2.nupkg \ `Add-Type -LiteralPath "$home\Desktop\lextm.sharpsnmplib-12.5.2\net471\SharpSnmpLib.dll"` -``` +```PowerShell $port = 161 $OID = "1.3.6.1.2.1.1.4.0" $variableList = New-Object Collections.Generic.List[Lextm.SharpSnmpLib.Variable] @@ -4701,9 +4831,9 @@ $TimeOut $message.Data.ToString() ``` ### Walk -``` -[Lextm.SharpSnmpLib.ObjectIdentifier]$OID = "1.3.6.1.2.1.1"` дерево или конечный OID -$WalkMode = [Lextm.SharpSnmpLib.Messaging.WalkMode]::WithinSubtree` режим обхода по дереву +```PowerShell +[Lextm.SharpSnmpLib.ObjectIdentifier]$OID = "1.3.6.1.2.1.1" # дерево или конечный OID +$WalkMode = [Lextm.SharpSnmpLib.Messaging.WalkMode]::WithinSubtree # режим обхода по дереву $results = New-Object Collections.Generic.List[Lextm.SharpSnmpLib.Variable] $message = [Lextm.SharpSnmpLib.Messaging.Messenger]::Walk( $Version, @@ -4718,14 +4848,14 @@ $results $results2 = @() foreach ($d in $results) { -$results2 +=[PSCustomObject]@{'ID'=$d.id.ToString();'Data'=$d.Data.ToString()}` перекодировать вывод построчно в строку +$results2 +=[PSCustomObject]@{'ID'=$d.id.ToString();'Data'=$d.Data.ToString()} # перекодировать вывод построчно в строку } $results2 ``` # Zabbix ### Zabbix Agent Deploy -``` +```PowerShell $url = "https://cdn.zabbix.com/zabbix/binaries/stable/6.4/6.4.5/zabbix_agent2-6.4.5-windows-amd64-static.zip" $path = "$home\Downloads\zabbix-agent2-6.4.5.zip" $WebClient = New-Object System.Net.WebClient @@ -4754,7 +4884,7 @@ Name: Service Count \ Type: Zabbix trapper \ Key: service.count \ Type of Information: Numeric -``` +```PowerShell $path = "C:\zabbix-agent2-6.4.5\bin" $scount = (Get-Service).Count .$path\zabbix_sender.exe -z 192.168.3.102 -s "powershell-host" -k service.count -o $scount @@ -4794,7 +4924,7 @@ key: `process.vm[zabbix_agent2]` `'UserParameter=Get-Query-Param[*],powershell.exe -noprofile -executionpolicy bypass -File C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\scripts\User-Sessions\Get-Query-Param.ps1 $1' > C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\plugins.d\User-Sessions.conf` - Поместить скрипт Get-Query-Param.ps1 в каталог, путь к которому указан в User-Sessions.conf. Скрипт содержим пользовательские параметры, которые он принимает от Zabbix сервера для передачи их в функции скрипта. -``` +```PowerShell Param([string]$select) if ($select -eq "ACTIVEUSER") { (Get-Query | where status -match "Active").User @@ -4868,7 +4998,7 @@ https://www.zabbix.com/documentation/current/en/manual/api/reference `$ip = "192.168.3.102"` \ `$url = "http://$ip/zabbix/api_jsonrpc.php"` -``` +```PowerShell $data = @{ "jsonrpc"="2.0"; "method"="user.login"; @@ -4883,7 +5013,7 @@ $token = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json `$token = "2eefd25fdf1590ebcdb7978b5bcea1fff755c65b255da8cbd723181b639bb789"` сгенерировать токен в UI (http://192.168.3.102/zabbix/zabbix.php?action=token.list) ### user.get -``` +```PowerShell $data = @{ "jsonrpc"="2.0"; "method"="user.get"; @@ -4895,7 +5025,7 @@ $data = @{ $users = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result ``` ### problem.get -``` +```PowerShell $data = @{ "jsonrpc"="2.0"; "method"="problem.get"; @@ -4919,7 +5049,7 @@ host.massadd - adding related objects to hosts \ host.massremove - removing related objects from hosts \ host.massupdate - replacing or removing related objects from hosts \ host.update - updating hosts -``` +```PowerShell $data = @{ "jsonrpc"="2.0"; "method"="host.get"; @@ -4938,7 +5068,7 @@ $host_id = $hosts[3].hostid` забрать id хоста по индексу ### item.get Получить id элементов данных по наименованию ключа для конкретного хоста -``` +```PowerShell $data = @{ "jsonrpc"="2.0"; "method"="item.get"; @@ -4954,7 +5084,7 @@ $items_id = ($items | where key_ -match system.uptime).itemid` забрать id ### history.get Получить всю историю элемента данных по его id -``` +```PowerShell $data = @{ "jsonrpc"="2.0"; "method"="history.get"; @@ -4970,7 +5100,7 @@ $items_data_uptime = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | Co ### Convert Secconds To TimeSpan and DateTime `$sec = $items_data_uptime.value` -``` +```PowerShell function ConvertSecondsTo-TimeSpan { param ( $insec @@ -4984,7 +5114,7 @@ function ConvertSecondsTo-TimeSpan { ### Convert From Unix Time `$time = $items_data_uptime.clock` -``` +```PowerShell function ConvertFrom-UnixTime { param ( $intime @@ -5027,7 +5157,7 @@ function ConvertFrom-UnixTime { `Import-PfxCertificate -Exportable -Password $pass -CertStoreLocation Cert:\CurrentUser\My -FilePath $home\Desktop\certificate.pfx` # OpenSSL -``` +```PowerShell Invoke-WebRequest -Uri https://slproweb.com/download/Win64OpenSSL_Light-3_1_1.msi -OutFile $home\Downloads\OpenSSL-Light-3.1.1.msi Start-Process $home\Downloads\OpenSSL-Light-3.1.1.msi -ArgumentList '/quiet' -Wait` установить msi пакет в тихом режиме (запуск от имени Администратора) rm $home\Downloads\OpenSSL-Light-3.1.1.msi @@ -5396,11 +5526,11 @@ New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_se `Get-DscLocalConfigurationManager` `Get-DscResource` \ -`Get-DscResource -Name File -Syntax`` https://learn.microsoft.com/ru-ru/powershell/dsc/reference/resources/windows/fileresource?view=dsc-1.1 +`Get-DscResource -Name File -Syntax` https://learn.microsoft.com/ru-ru/powershell/dsc/reference/resources/windows/fileresource?view=dsc-1.1 `Ensure = Present` настройка должна быть включена (каталог должен присутствовать, процесс должен быть запущен, если нет – создать, запустить) \ `Ensure = Absent` настройка должна быть выключена (каталога быть не должно, процесс не должен быть запущен, если нет – удалить, остановить) -``` +```PowerShell Configuration TestConfiguraion { Ctrl+Space @@ -5448,8 +5578,8 @@ Configuration DSConfigurationProxy `Start-DscConfiguration -Path $Path` \ `Get-Job` \ `$srv = "vproxy-01"` \ -`Get-Service -ComputerName $srv | ? name -match w32time` Start-Service` \ -`icm $srv {Get-Process | ? ProcessName -match calc} | ft` Stop-Process -Force` \ +`Get-Service -ComputerName $srv | ? name -match w32time # Start-Service` \ +`icm $srv {Get-Process | ? ProcessName -match calc} | ft # Stop-Process -Force` \ `icm $srv {ls C:\ | ? name -match Temp} | ft` rm` # Git @@ -5496,8 +5626,8 @@ Configuration DSConfigurationProxy # Ansible `apt -y update && apt -y upgrade` \ -`apt -y install ansible` v2.10.8` \ -`apt -y install ansible-core` v2.12.0` \ +`apt -y install ansible` v2.10.8 \ +`apt -y install ansible-core` v2.12.0 \ `apt -y install sshpass` `ansible-galaxy collection install ansible.windows` установить коллекцию модулей \