diff --git a/posh.txt b/posh.txt index c26fb5e..d58e008 100644 --- a/posh.txt +++ b/posh.txt @@ -1,49 +1,54 @@ PowerShell Commands -- Object -- Regex -- Files -- Credential -- WinEvent -- Firewall -- Defender -- Performance -- Regedit -- Scheduled -- Network -- SMB -- WinRM -- WMI -- ActiveDirectory -- ServerManager -- DNS -- DHCP -- DFS -- PackageManagement -- Jobs -- PowerCLI -- EMShell -- TrueNAS -- Veeam -- REST API -- IE -- Selenium -- COM -- dotNET -- Console API -- Socket -- Excel -- XML -- JSON -- YAML -- HTML -- Git -- SQLite -- MySQL -- MSSQL -- SNMP -- DSC -- Ansible +# Object +# Regex +# Files +# Credential +# WinEvent +# Firewall +# Defender +# Scheduled +# Network +# LocalAccounts +# SMB +# ActiveDirectory +# ServerManager +# DNS +# DHCP +# DFS +# PackageManagement +# Jobs +# PowerCLI +# EMShell +# TrueNAS +# Veeam +# REST API +# IE +# Selenium +# COM +# dotNET +# Console API +# Sockets +# Excel +# CSV +# XML +# JSON +# YAML +# HTML +# Git +# SQLite +# MySQL +# MSSQL +# InfluxDB +# WMI +# Regedit +# Performance +# SNMP +# Zabbix +# Grafana +# WinRM +# DSC +# Ansible ### Help Get-Verb # действия/глаголы, утвержденные для использования в командлетах @@ -134,7 +139,7 @@ $hashtable.Remove("User") # удалить ключ $Tag = @{$true = 'dev'; $false = 'prod'}[([System.Net.Dns]::GetHostEntry("localhost").HostName) -match '.*.TestDomain$'] -### List +### Collections/List $Collections = New-Object System.Collections.Generic.List[System.Object] $Collections.Add([PSCustomObject]@{User = $env:username; Server = $env:computername}) @@ -305,6 +310,10 @@ $ или \Z # обозначают конец строки. $ip -replace "\d{1,3 (?!text) # не совпадает со словом слева (? ~\Desktop\Get-Process-HtmlReport.html -### CSV (Comma-Separated Values) -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 "," # импортировать массив - -$data = ConvertFrom-Csv @" -Region,State,Units,Price -West,Texas,927,923.71 -$null,Tennessee,466,770.67 -"@ - # Git git --version @@ -3612,6 +3521,231 @@ exec sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN' DBCC FREEPROCCACHE +# InfluxDB + +https://community.influxdata.com/t/influxdb-1-7-11-download-links/18898 # InfluxDB1 +wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.7.1-windows-amd64.zip -UseBasicParsing -OutFile influxdb2-2.7.1-windows-amd64.zip # скачать InfluxDB2 +Expand-Archive .\influxdb2-2.7.1-windows-amd64.zip -DestinationPath 'C:\Program Files\InfluxData\influxdb\' # разархивировать +cd "C:\Program Files\InfluxData\influxdb\influxdb2_windows_amd64" +.\influxd.exe +.\influxd -h +http://localhost:8086/ # базовая настройка +API Token: wqsqOIR3d-PYmiJQYir4sX_NjtKKyh8ZWbfX1ZlfEEpAH3Z2ylcHx3XZzUA36XO3HIosiCFkhi4EoWfHxwIlAA== + +### CLI Client +wget https://dl.influxdata.com/influxdb/releases/influxdb2-client-2.7.3-windows-amd64.zip?_gl=1*76m6hu*_ga*MTg0OTc4MzkzNC4xNjg4MTM5NzQ4*_ga_CNWQ54SDD8*MTY4ODE2MjA0My41LjEuMTY4ODE2MzI5Ni4yMi4wLjA. -UseBasicParsing -OutFile influxdb2-client-2.7.3-windows-amd64.zip +Expand-Archive .\influxdb2-client-2.7.3-windows-amd64.zip -DestinationPath 'C:\Program Files\InfluxData\influx' +cd "C:\Program Files\InfluxData\influx" + +.\influx org list # отобразить список пользователей организаций +.\influx auth list # отобразить список пользователей и токенов +.\influx v1 shell # консоль +.\influx v1 dbrp list # список БД + +.\influx config create --config-name main ` +--host-url "http://localhost:8086" ` +--org "test" ` +--token "wqsqOIR3d-PYmiJQYir4sX_NjtKKyh8ZWbfX1ZlfEEpAH3Z2ylcHx3XZzUA36XO3HIosiCFkhi4EoWfHxwIlAA==" ` +--active # создать и активировать конфигурацию, что бы не передавать свой хост InfluxDB, токен API и организацию с каждой командой + +.\influx config list # список конфигураций +.\influx config list --json | ConvertFrom-Json # отобразить конфигурацию с выводом токена +.\influx server-config | ConvertFrom-Json # текущая конфигурация сервера + +### bucket +.\influx bucket create --name test-bucket -c main # создать корзину +.\influx write --bucket test-bucket --url https://influx-testdata.s3.amazonaws.com/air-sensor-data-annotated.csv # записать данные из CSV в созданную корзину (Flux scripting language) +.\influx query 'from(bucket:\"test-bucket\") |> range(start:-30m) |> mean()' # получить записанные данные + +### user +.\influx user create -n root -o test # создать пользователя (-o ) +.\influx user password -n admin -p "password" # изменить/задать пароль +.\influx user list # список пользователей +influx user delete -i + +### deb + +wget https://repos.influxdata.com/debian/packages/influxdb2-2.7.1-amd64.deb +dpkg -i influxdb2-2.7.1-amd64.deb +systemctl start influxd.service +systemctl status influxd.service +netstat -natpl | grep 80[8-9][3-9] +ps aux | grep influxdb | grep -Ev "grep" + +nano /etc/influxdb/config.toml # v2 +http-bind-address = "192.168.3.101:8086" + +nano /etc/influxdb/influxdb.conf # v1 + +[http] + enabled = true # включить API + bind-address = "192.168.3.104:8086" + auth-enabled = true # включить аудентификацию + +apt install influxdb-client +influx +influx --host 192.168.3.104 --username admin --password password + +### USERS +SHOW USERS # отобразить пользователей и их права доступа +CREATE USER admin WITH PASSWORD 'password' WITH ALL PRIVILEGES # создать пользователя +GRANT ALL PRIVILEGES TO "admin" # предоставить права доступа +GRANT READ ON "database" TO "admin" # доступ на чтение для БД или запись (WRITE) +REVOKE ALL PRIVILEGES FROM "admin" # отозвать права доступа +SHOW GRANTS FOR "admin" # БД и привелегии доступа для указанного пользователя +SET PASSWORD FOR "admin" = 'new_password' # изменить пароль +DROP USER "admin" # удалить пользователя + +### DATABASE +CREATE DATABASE win_performance # создать БД +SHOW DATABASES # отобразить список БД +USE win_performance +SHOW measurements # отобразить все таблицы +INSERT counters,host=console,counter=CPU value=0.88 # записать данные в таблицу counters +SELECT * FROM counters # отобразить все данные в таблице +SELECT * FROM counters limit 10 # отобразить 10 единиц данных +SELECT * FROM counters WHERE time > now() -2h # отобразить данные за последние 2 часа + +SELECT/DELETE/SHOW/CREATE/DROP/EXPLAIN/GRANT/REVOKE/ALTER/SET/KILL + +### API POST + +$url = "http://192.168.3.104:8086/write?db=win_performance" +$PerformanceStat = "\Процессор(_Total)\% загруженности процессора" +$Value = ((Get-Counter $PerformanceStat).CounterSamples).CookedValue +Invoke-RestMethod -Method POST -Uri $url -Body "counters,host=$ENV:COMPUTERNAME,counter=CPU value=$value" + +### API GET + +curl http://192.168.3.104:8086/query --data-urlencode "q=SHOW DATABASES" # | ConvertFrom-Json + +$db = irm "http://192.168.3.104:8086/query?q=SHOW DATABASES" +$db = irm "http://192.168.3.104:8086/query?epoch=ms&u=admin&p=password&q=SHOW DATABASES" +$db.results.series.values + +$ip_port = "192.168.3.104:8086" +$db = "win_performance" +$query = 'SELECT * FROM counters' +$url = "http://$ip_port/query?db=$db&q=$query" +#$cred = Get-Credential +#$user = "admin" +#$pass = "password" | ConvertTo-SecureString -AsPlainText -Force +#$cred = [System.Management.Automation.PSCredential]::new($user,$pass) +$rest = Invoke-RestMethod -Method GET -Uri $url # -Credential $cred +$name = $rest.results.series.name # имя таблицы +$col = $rest.results.series.columns # столбцы/ключи +$val = $rest.results.series.values # данные построчно + +$mass = @() +$mass += [string]$col -replace "\s"," | " +foreach ($v in $val) { + $mass += [string]$v -replace "\s"," " +} +$mass + +irm http://localhost:8086/api/v2/setup +irm http://localhost:8086/api/v2/config + +# WMI + +### WMI/CIM (Windows Management Instrumentation/Common Information Model) +Get-WmiObjec -ComputerName localhost -Namespace root -class "__NAMESPACE" | select name,__namespace # отобразить дочернии Namespace (логические иерархические группы) +Get-WmiObject -List # отобразить все классы пространства имен "root\cimv2" (по умолчанию), свойства (описывают конфигурацию и текущее состояние управляемого ресурса) и их методы (какие действия позволяет выполнить над этим ресурсом) +Get-WmiObject -List | Where-Object {$_.name -match "video"} # поиск класса по имени, его свойств и методов +Get-WmiObject -ComputerName localhost -Class Win32_VideoController # отобразить содержимое свойств класса + +gwmi -List | where name -match "service" | ft -auto # если в таблице присутствуют Methods, то можно взаимодействовать {StartService, StopService} +gwmi -Class win32_service | select * # отобразить список всех служб и всех их свойств +Get-CimInstance Win32_service # обращается на прямую к "root\cimv2" +Get-CimInstance -ComputerName $srv Win32_OperatingSystem | select LastBootUpTime # время последнего включения +gwmi -ComputerName $srv -Class Win32_OperatingSystem | select LocalDateTime,LastBootUpTime # текущее время и время последнего включения +gwmi win32_service -Filter "name='Zabbix Agent'" # отфильтровать вывод по имени +(gwmi win32_service -Filter "name='Zabbix Agent'").State # отобразить конкретное свойство +gwmi win32_service -Filter "State = 'Running'" # отфильтровать запущенные службы +gwmi win32_service -Filter "StartMode = 'Auto'" # отфильтровать службы по методу запуска +gwmi -Query 'select * from win32_service where startmode="Auto"' # WQL-запрос (WMI Query Language) +gwmi win32_service | Get-Member -MemberType Method # отобразить все методы взаимодействия с описание применения (Delete, StartService) +(gwmi win32_service -Filter 'name="Zabbix Agent"').Delete() # удалить службу +(gwmi win32_service -Filter 'name="MSSQL$MSSQLE"').StartService() # запустить службу +gwmi Win32_OperatingSystem | Get-Member -MemberType Method # методы reboot и shutdown +(gwmi Win32_OperatingSystem -EnableAllPrivileges).Reboot() # используется с ключем повышения привелегий +(gwmi Win32_OperatingSystem -EnableAllPrivileges).Win32Shutdown(0) # завершение сеанса пользователя +gwmi -list -Namespace root\CIMV2\Terminalservices +(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).AllowTSConnections +(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).SetAllowTSConnections(1) # включить RDP +(Get-WmiObject win32_battery).estimatedChargeRemaining # заряд батареи в процентах +gwmi Win32_UserAccount # доменные пользователи +(gwmi Win32_SystemUsers).PartComponent +Get-CimInstance -ClassName Win32_LogonSession +Get-CimInstance -ClassName Win32_BIOS + +$srv = "localhost" +gwmi Win32_logicalDisk -ComputerName $srv | where {$_.Size -ne $null} | select @{ +Label="Value"; Expression={$_.DeviceID}}, @{Label="AllSize"; Expression={ +[string]([int]($_.Size/1Gb))+" GB"}},@{Label="FreeSize"; Expression={ +[string]([int]($_.FreeSpace/1Gb))+" GB"}}, @{Label="Free%"; Expression={ +[string]([int]($_.FreeSpace/$_.Size*100))+" %"}} + +### NLA (Network Level Authentication) +(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").UserAuthenticationRequired +(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").SetUserAuthenticationRequired(1) # включить NLA +Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer # отобразить значение (2) +Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication # отобразить значение (1) +Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer -Value 0 # изменить значение +Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication -Value 0 +REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters /v AllowEncryptionOracle /t REG_DWORD /d 2 # отключить на клиентском компьютере проверку версии CredSSP, если на целевом комьютере-сервере не установлены обновления KB4512509 от мая 2018 года + +# Regedit + +Get-PSDrive # список всех доступных дисков и веток реестра +cd HKLM:\ # HKEY_LOCAL_MACHINE +cd HKCU:\ # HKEY_CURRENT_USER +Get-Item # получить информацию о ветке реестра +New-Item # создать новый раздел реестра +Remove-Item # удалить ветку реестра +Get-ItemProperty # получить значение ключей/параметров реестра (это свойства ветки реестра, аналогично свойствам файла) +Set-ItemProperty # изменить название или значение параметра реестра +New-ItemProperty # создать параметр реестра +Remove-ItemProperty # удалить параметр + +Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select DisplayName # список установленных программ +Get-Item HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002 # посмотреть содержимое Items +(Get-ItemProperty HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002)."New Signature" # отобразить значение (Value) свойства (Property) Items +$reg_path = "HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002" +$sig_name = "auto" +Set-ItemProperty -Path $reg_path -Name "New Signature" -Value $sig_name # изменить или добавить в корне ветки (Path) свойство (Name) со значением (Value) +Set-ItemProperty -Path $reg_path -Name "Reply-Forward Signature" -Value $sig_name + +# 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 + +(Get-Counter -ListSet *интерфейс*).Counter # найти все счетчики +Get-Counter "\Сетевой интерфейс(*)\Всего байт/с" # отобразить все адаптеры (выбрать действующий по трафику) + +$WARNING = 25 +$CRITICAL = 50 +$TransferRate = ((Get-Counter "\\huawei-mb-x-pro\сетевой интерфейс(intel[r] wi-fi 6e ax211 160mhz)\всего байт/с" +).countersamples | select -ExpandProperty CookedValue)*8 +$NetworkUtilisation = [math]::round($TransferRate/1000000000*100,2) +if ($NetworkUtilisation -gt $CRITICAL){ +Write-Output "CRITICAL: $($NetworkUtilisation) % Network utilisation, $($TransferRate.ToString('N0')) b/s" +# exit 2 +} +if ($NetworkUtilisation -gt $WARNING){ +Write-Output "WARNING: $($NetworkUtilisation) % Network utilisation, $($TransferRate.ToString('N0')) b/s" +# exit 1 +} +Write-Output "OK: $($NetworkUtilisation) % Network utilisation, $($TransferRate.ToString('N0')) b/s" +# exit 0 + # SNMP ### Setup SNMP Service @@ -3706,6 +3840,33 @@ $results2 +=[PSCustomObject]@{'ID'=$d.id.ToString();'Data'=$d.Data.ToString()} # } $results2 +# WinRM + +Get-Service -Name winrm -RequiredServices # статус зависимых служб +Enter-PSSession -ComputerName $srv # подключиться к PowerShell сессии через PSRemoting. Подключение возможно только по FQDN-имени +Invoke-Command $srv -ScriptBlock {Get-ComputerInfo} # выполнение команды через PSRemoting +$session = New-PSSession $srv # открыть сессию +Get-PSSession # отобразить активные сессии +icm -Session $session {$srv = $using:srv} # передать переменную текущей сессии ($using) в удаленную +Disconnect-PSSession $session # закрыть сессию +Remove-PSSession $session # удалить сессию + +### Windows Remote Management Configuration +winrm quickconfig -quiet # изменит запуск службы WinRM на автоматический, задаст стандартные настройки WinRM и добавить исключения для портов в fw +Enable-PSRemoting –Force +Test-WSMan $srv -ErrorAction Ignore # проверить работу WinRM на удаленном компьютере (игнорировать вывыод ошибок) +New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "WinRM HTTPS Certificate" -NotAfter (Get-Date).AddYears(5) # создать самоподписанный сертификат и скопировать отпечаток (thumbprint) +New-Item -Path WSMan:\Localhost\Listener -Transport HTTPS -Address * -CertificateThumbprint "CACA491A66D1706AC2FEB5E53D0E111C1C73DD65" # создать прослушиватель +New-NetFirewallRule -DisplayName 'WinRM HTTPS Management' -Profile Domain,Private -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5986 # открыть порт в fw +winrm enumerate winrm/config/listener # текущая конфигурация прослушивателей WinRM (отображает отпечаток cert SSL для HTTPS 5986) +dir WSMan:\localhost\client # отобразить конфигурацию +winrm get winrm/config/service/auth # список всех конфигураций аутентификации WinRM (WSMan:\localhost\client\auth) +Set-Item -path wsman:\localhost\service\auth\basic -value $true # разрешить локальную аутентификацию +Set-PSSessionConfiguration -ShowSecurityDescriptorUI -Name Microsoft.PowerShell # добавить права доступа через дескриптор безопасности +Set-Item WSMan:\localhost\client\allowunencrypted $true # работать без шифрования +Set-Item WSMan:\localhost\client\TrustedHosts -Value "*" -force # добавить новый доверенный хост (для всех) в конфигурацию +net localgroup "Remote Management Users" "winrm" /add # добавить пользователя winrm (удалить /del) в локальную группу доступа "пользователи удаленного управления" (Local Groups - Remote Management Users) + # DSC Import-Module PSDesiredStateConfiguration