From edcc0c1ab8921bf11040afdce2d67a7a73e7e554 Mon Sep 17 00:00:00 2001
From: Alex Kup <116945542+Lifailon@users.noreply.github.com>
Date: Thu, 27 Jul 2023 18:51:26 +0300
Subject: [PATCH] added ansible, winrm config, bit convertor, openssh, hyper-v,
pki
---
README.md | 1133 +++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 889 insertions(+), 244 deletions(-)
diff --git a/README.md b/README.md
index 8024833..6b4a1ce 100644
--- a/README.md
+++ b/README.md
@@ -2,11 +2,14 @@
- [Object](#Object)
- [Regex](#Regex)
+- [DataType](#DataType)
+- [Bit](#Bit)
- [Files](#Files)
- [Credential](#Credential)
- [WinEvent](#WinEvent)
- [Firewall](#Firewall)
- [Defender](#Defender)
+- [DISM](#DISM)
- [Scheduled](#Scheduled)
- [Network](#Network)
- [LocalAccounts](#LocalAccounts)
@@ -18,8 +21,9 @@
- [DFS](#DFS)
- [Package](#Package)
- [Jobs](#Jobs)
-- [PowerCLI](#PowerCLI)
-- [EMShell](#EMShell)
+- [Hyper-V](#Hyper-V)
+- [VMWare/PowerCLI](#VMWare/PowerCLI)
+- [Exchange/EMShell](#Exchange/EMShell)
- [TrueNAS](#TrueNAS)
- [Veeam](#Veeam)
- [REST API](#REST-API)
@@ -35,11 +39,11 @@
- [JSON](#JSON)
- [YAML](#YAML)
- [HTML](#HTML)
-- [Git](#Git)
- [SQLite](#SQLite)
- [MySQL](#MySQL)
- [MSSQL](#MSSQL)
- [InfluxDB](#InfluxDB)
+- [Telegraf](#Telegraf)
- [Elasticsearch](#Elasticsearch)
- [CData](#CData)
- [ODBC](#ODBC)
@@ -49,9 +53,13 @@
- [Performance](#Performance)
- [SNMP](#SNMP)
- [Zabbix](#Zabbix)
+- [OpenSSH](#OpenSSH)
- [WinRM](#WinRM)
-- [Ansible](#Ansible)
+- [pki](#pki)
- [DSC](#DSC)
+- [Git](#Git)
+- [Ansible](#Ansible)
+- [Jenkins](#Jenkins)
### Help
`Get-Verb` действия/глаголы, утвержденные для использования в командлетах \
@@ -126,7 +134,15 @@
`$srv[0] = Name` замена элемента в массиве \
`$srv[0].Length` узнать кол-во символов первого значения в массиве \
`$srv[10..100]` срез
-
+```
+$array = "a","b","c","d"
+$num = 0
+foreach ($a in $array) {
+$num += 1
+$index = [array]::IndexOf($array, $a) # узнать номер индекса по зачению
+$array[$index] = $num # пересобрать исходный массив
+}
+```
### HashTable
```
$hashtable = @{"User" = "$env:username"; "Server" = "$env:computername"} # создать
@@ -230,6 +246,33 @@ ps | Sort-Object -Descending CPU | select -first 10 ProcessName, # сортир
# NPP
`pwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File "$(FULL_CURRENT_PATH)"`
+
+%AppData%\Notepad++ # themes/shortcuts.xml
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ pwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File "$(FULL_CURRENT_PATH)"
+
+
+
+
+```
+`Parsing text to Markdown:` \
+`Macros: Fn<+`+Fn>+Fn>+`+>` \
+`Replace: "# " -> "`"`
```
. # Обозначает любой символ
\ # Экранирующий символ. Символы которые экранируются: ^, [, ., $, {, *, (, ), \, +, |, ?, <, >
@@ -259,19 +302,34 @@ $ # Конец строки
\d{2} # Найти две цифры
\d{2,4} # Найти две или четыре
{4,} # Найти четыре и более
+
+^\s{0,}#.+
```
# Regex
`-replace "1","2"` замена элементов в индексах массива (везде где присутствует 1, заменить на 2), для удаления используется только первое значение \
`-split " "` преобразовать строку в массив, разделителем указан пробел, которой удаляется ($url.Split("/")[-1]) \
`-join " "` преобразовать массив (коллекцию) в единую строку (string), добавить разделителем пробел \
-`$iplist -contains "192.168.1.1"` проверить, что в массиве есть целое значение, выводит True или False \
-`"192.168.1.1" -in $iplist` проверить на наличие указанного значения в массиве \
+
`-like *txt*` поиск по маскам wildcard, выводит значение на экран \
`-match txt` поиска по шаблонам, проверка на соответствие содержимого текста \
`-match "zabbix|rpc"` условия, для поиска по нескольким словам \
`-NotMatch` проверка на отсутствие вхождения \
+### Форматирование (.NET method format)
+`[string]::Format("{1} {0}","Index0","Index1")` \
+`"{1} {0}" -f "Index0","Index1"` \
+`"{0:###-##-##}" -f 1234567` записать число в другом формате (#) \
+`"{0:0000}" -f 123` вывести число в формате не меньше 4 знаков (0123) \
+`"{0:P0}" -f (220/1000)` посчитать в процентах (P) \
+`"{0:P}" -f (512MB/1GB)` сколько % составляет 512Мб от 1Гб \
+`"{0:0.0%}" -f 0.123` умножить на 100%
+```
+$gp = Get-Process | sort cpu -Descending | select -First 10
+foreach ($p in $gp) {
+"{0} - {1:N2}" -f $p.processname, $p.cpu # округлить
+}
+```
### Matches
`$ip = "192.168.10.1"` \
`$ip -match "(\.\d{1,3})\.\d{1,2}"` True \
@@ -283,11 +341,42 @@ $ # Конец строки
`$string.Substring($string.IndexOf(".txt")-4, 4) # 2-й вариант (IndexOf)`
-### Группировка
-`if ((($1 -eq 1) -and ($2 -eq 2)) -or ($1 -ne 3)) {"$true"} else {"$false"}` два условия: (если $1 = 1 и $2 = 2) или $1 не равно 3. Если хотя бы одно из выражений равно True, то все условие относится к True и наоборот \
+### Условный оператор
+`$rh = Read-Host` \
+`if ($rh -eq 1) {ipconfig} elseif ($rh -eq 2) {getmac} else {hostname}` \
+Если условие if () является истенным ($True), выполнить действие в {} \
+Если условие if () является ложным ($False), выполнить действие не обязательного оператора else \
+Условие Elseif идёт после условия if для проверки дополнительных условий перед выполнение оператора else. Оператор, который первый вернет $True, отменит выполнение следующих дополнительных условий \
+Если передать переменную в условие без оператора, то будет проверяться наличие значения у переменной на $True/$False \
+`if ((tnc $srv -Port 80).TcpTestSucceeded) {"Opened port"} else {"Closed port"}`
+
+### Операторы
+`-eq` равно (equal) \
+`-ceq` учитывать регистр \
+`-ne` не равно (not equal) \
+`-gt` больше (greater) \
+`-ge` больше или равно \
+`-lt` меньше (less) \
+`-le` меньше или равно \
+`-in` проверить на наличие (5 -in @(1,2,3,4,5)) \
+`-NOT` логическое НЕТ !(Test-Path $path) \
`-and` логическое И \
`-or` логическое ИЛИ \
-`!(Test-Path $path)` логическое НЕТ (-not), если путь недоступен, вернет True
+`if ((($1 -eq 1) -and ($2 -eq 2)) -or ($1 -ne 3)) {"$true"} else {"$false"}` два условия: (если $1 = 1 и $2 = 2) или $1 не равно 3
+
+### Pipeline Operators
+`Write-Output "First" && Write-Output "Second"` две успешные команды выполняются \
+`Write-Error "Bad" && Write-Output "Second"` первая команда завершается ошибкой, из-за чего вторая команда не выполняется \
+`Write-Error "Bad" || Write-Output "Second"` первая команда завершается ошибкой, поэтому выполняется вторая команда \
+`Write-Output "First" || Write-Output "Second"` первая команда выполнена успешно, поэтому вторая команда не выполняется
+
+### Invocation Operator
+`$addr = "8.8.8.8"` \
+`$ping = "ping"` \
+`& $ping $addr` запускает текст как команду
+
+`& $ping $addr &` запустить команду в фоне \
+`(Get-Job)[-1] | Receive-Job -Keep`
### Специальные символы
`\d` число от 0 до 9 (20-07-2022 эквивалент: "\d\d-\d\d-\d\d\d\d") \
@@ -312,7 +401,6 @@ $ # Конец строки
`$test = "string"` \
`$test -replace ".{1}$"` удалить любое кол-во символов в конце строки \
`$test -replace "^.{1}"` удалить любое кол-во символов в начале строки \
-`(4164539/1MB).ToString(".00")` округлить до 3,97
### Группы захвата
`$date = '12.31.2021'` \
@@ -320,24 +408,182 @@ $ # Конец строки
`$1` содержимое первой группы в скобках \
`$2` содержимое второй группы
-### GetType
+# DataType
+
`$srv.GetType()` узнать тип данных \
`$srv -is [string]` проверка на соответствие типа данных \
`$srv -isnot [System.Object]` проверка на несоответствие \
-`$char = $srv.ToCharArray()` разбить строку [string] на массив [System.Array] из букв \
-`$char.GetType()` тип данных: Char[] \
`[Object]` массив (BaseType:System.Array) \
`[DateTime]` формат времени (BaseType:System.ValueType) \
-`[Boolean]` логическое значение ($True/$False) \
+`[Bool]/[Boolean]` логическое значение ($True/$False) или 1/0 (1 бит) наличие/отсуствие напряжения \
+`[Byte]` 8-битное (1 байт) целое число без знака (0..255) \
+`[Int16]` 16-битное знаковое целое число от -32767 до 32767 (тип данных WORD 0..65535) \
+`[Int]` 32-битное (4 байта) знаковое целое число от –2147483648 до 2147483647 (DWORD) \
+`[Int64]` 64-битное от -9223372036854775808 до 9223372036854775808 (LWORD) \
+`[Decimal]` 128-битное десятичное значение от –79228162514264337593543950335 до 79228162514264337593543950335 \
`[Single]` число с плавающей запятой (32-разрядное) \
`[Double]` число с плавающей запятой с двойной точностью (64-разрядное) \
-`[Char]` cимвол Юникода (16-разрядный) \
-`[Decimal]` десятичное значение (128-битовое) \
-`[Byte]` 8-разрядное целое число без знака \
-`[int16]` 16-разрядное знаковое целое число \
-`[int]` 32-разрядное знаковое целое число. (BaseType:System.ValueType) \
`[String]` неизменяемая строка символов Юникода фиксированной длины (BaseType:System.Object)
+### Math
+`[math] | Get-Member -Static` \
+`[math]::Pow(2,4)` 2 в 4 степени \
+`[math]::Truncate(1.8)` грубое округление, удаляет дробную часть \
+`[math]::Ceiling(1.8)` округляет число в большую сторону до ближайшего целого значения \
+`[math]::Floor(-1.8)` округляет число в меньшую сторону \
+`[math]::Min(33,22)` возвращает наименьшее значение двух значений \
+`[math]::Max(33,22)` возвращает наибольшее значение двух значений
+
+### Round
+`[double]::Round(87.5, 0)` 88 (нечетное), в .NET по умолчанию используется округление в средней точке ToEven, где *.5 значения округляются до ближайшего четного целого числа. \
+`[double]::Round(88.5, 0)` 88 (четное) \
+`[double]::Round(88.5, 0, 1)` 89 (округлять в большую сторону) \
+`[double]::Round(1234.56789, 2)` округлить до 2 символов после запятой
+
+### ToString
+`(4164539/1MB).ToString("0.00")` разделить на дважды на 1024/1024 и округлить до 3,97
+
+### Char
+`[Char]` cимвол Юникода (16-разрядный) \
+`$char = $srv.ToCharArray()` разбить строку [string] на массив [System.Array] из букв \
+
+### Switch
+```
+$MMM = Get-Date -UFormat "%m"
+switch($MMM) {
+"01" {$Month = 'Jan'}
+"02" {$Month = 'Feb'}
+"03" {$Month = 'Mar'}
+"04" {$Month = 'Apr'}
+"05" {$Month = 'May'}
+"06" {$Month = 'Jun'}
+"07" {$Month = 'Jul'}
+"08" {$Month = 'Aug'}
+"09" {$Month = 'Sep'}
+"10" {$Month = 'Oct'}
+"11" {$Month = 'Nov'}
+"12" {$Month = 'Dec'}
+}
+```
+### function switch
+```
+Function fun-switch (
+[switch]$param
+) {
+If ($param) {"yes"} else {"no"}
+}
+fun-switch -param
+```
+# Bit
+```
+Двоичная Десятичная
+1 1
+10 2
+11 3
+100 4
+101 5
+110 6
+111 7
+1000 8
+1001 9
+1010 10
+1011 11
+1100 12
+1101 13
+1110 14
+1111 15
+1 0000 16
+
+Двоичное Десятичное Номер разряда
+1 1 0
+10 2 1
+100 4 2
+1000 8 3
+1 0000 16 4
+10 0000 32 5
+100 0000 64 6
+1000 0000 128 7
+1 0000 0000 256 8
+
+Из двоичного => десятичное (1-й вариант по таблице)
+1001 0011 = 1000 0000 + 1 0000 + 10 + 1 = 128 + 16 + 2 + 1 = 147
+
+2-й вариант
+7654 3210 (разряды двоичного выражения) = (1*2^7)+(0*2^6)+(0*2^5)+(1*2^4)+(0*2^3)+(0*2^2)+(1*2^1)+(1*2^0) = 147
+[math]::Pow(2,7) + [math]::Pow(2,4) + [math]::Pow(2,1) + [math]::Pow(2,0) = 147 # исключить 0 и сложить степень
+
+Из десятичного => двоичное (1-й вариант по таблице)
+347 вычесть ближайшие 256 = 91 (+ 1 0000 0000 забрать двоичный остаток)
+91 - 64 = 27 ближайшее 16 (+ 100 0000)
+27 - 16 = 11 ближайшее 8 (+ 1 0000)
+11 - 8 = 3 ближайшее 2 (+ 1000)
+3 - 2 = 1 (+ 10)
+1 - 1 = 0 (+ 1)
+1 0101 1011
+
+2-й вариант
+Последовательное деления числа на 2, предворительно забирая остаток для получения четного числа в меньшую сторону
+347 - 346 = остаток 1, (347-1)/2 = 173
+173 - 172 = остаток 1, (172-1)/2 = 86
+86 - 86 = остаток 0, 86/2 = 43
+43 - 42 = остаток 1, (43-1)/2 = 21
+21 - 20 = остаток 1, (21-1)/2 = 10
+10 - 10 = остаток 0, 10/2 = 5
+5 - 4 = остаток 1, (5-1)/2 = 2
+2 - 2 = остаток 0, 2/2 = 1
+1 - 2 = остаток 1, (1-1)/2 = 0
+Результат деления записывается снизу вверх
+```
+### Bit Convertor
+```
+function ConvertTo-Bit {
+ param (
+ [Int]$int
+ )
+ [array]$bits = @()
+ $test = $true
+ while ($test -eq $true) {
+ if (($int/2).GetType() -match [double]) {
+ $int = ($int-1)/2
+ [array]$bits += 1
+ }
+ elseif (($int/2).GetType() -match [int]) {
+ $int = $int/2
+ [array]$bits += 0
+ }
+ if ($int -eq 0) {
+ $test = $false
+ }
+ }
+ $bits = $bits[-1..-999]
+ ([string]($bits)) -replace "\s"
+}
+```
+`ConvertTo-Bit 347`
+```
+function ConvertFrom-Bit {
+ param (
+ $bit
+ )
+ [int]$int = 0
+ $bits = $bit.ToString().ToCharArray()
+ $index = ($bits.Count)-1
+ foreach ($b in $bits) {
+ if ($b -notlike 0) {
+ $int += [math]::Pow(2,$index)
+ }
+ $index -= 1
+ }
+ $int
+}
+```
+`ConvertFrom-Bit 10010011`
+
+`Get-Process pwsh | fl ProcessorAffinity` привязка процесса к ядрам, представляет из себя битовую маску (bitmask), где каждому биту соответствует ядро процессора. Если для ядра отмечено сходство (affinity), то бит выставляется в 1, если нет — то в 0. Например, если выбраны все 16 ядер, то это 1111 1111 1111 1111 или 65535. \
+`(Get-Process pwsh).ProcessorAffinity = 15` 0000000000001111 присвоить 4 первых ядра \
+`(Get-Process pwsh).ProcessorAffinity = 61440` 1111000000000000 присвоить 4 последних ядра \
+`(Get-Process pwsh).ProcessorAffinity = (ConvertFrom-Bit 1111000000000000)`
+
### Property
`$srv.Count` кол-во элементов в массиве \
`$srv.Length` содержит количество символом строки переменной [string] или количество значений (строк) объекта \
@@ -357,7 +603,9 @@ $ # Конец строки
`[string]::IsNullOrEmpty($text)` проверяет наличие строки, если строка пуста $true, если нет $false \
`[string]::IsNullOrWhiteSpace($text2)` проверяет на наличие только символов пробел, табуляция или символ новой строки
-### Date
+### DateTime
+`Get-TimeZone` часовой пояс \
+`[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] \
@@ -366,9 +614,11 @@ $ # Конец строки
`"5/7/07" -as [DateTime]` преобразовать входные данные в тип данных [DateTime] \
`New-TimeSpan -Start $VBRRP.CreationTimeUTC -End $VBRRP.CompletionTimeUTC` получить разницу во времени
-### Time
+### Measure-Command
`(Measure-Command {ping ya.ru}).TotalSeconds` узнать только время выполнения \
-`(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine` посчитать время работы последней [-1] (select -Last 1) выполненной команды и узнать ее статус \
+`(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine` посчитать время работы последней [-1] (select -Last 1) выполненной команды и узнать ее статус
+
+### Timer
`$start_time = Get-Date` зафиксировать время до выполнения команды \
`$end_time = Get-Date` зафиксировать время по завершению \
`$time = $end_time - $start_time` высчитать время работы скрипта \
@@ -380,24 +630,6 @@ $ # Конец строки
`$timer.Elapsed.TotalSeconds` отобразить время с момента запуска (в секундах) \
`$timer.Stop()` остановить таймер
-### Условный оператор
-`$rh = Read-Host` \
-`if ($rh -eq 1) {ipconfig} elseif ($rh -eq 2) {getmac} else {hostname}` \
-Если условие if () является истенным ($True), выполнить действие в {} \
-Если условие if () является ложным ($False), выполнить действие не обязательного оператора else \
-Условие Elseif идёт после условия if для проверки дополнительных условий перед выполнение оператора else. Оператор, который первый вернет $True, отменит выполнение следующих дополнительных условий \
-Если передать переменную в условие без оператора, то будет проверяться наличие значения у переменной на $True/$False \
-`if ((tnc $srv -Port 80).TcpTestSucceeded) {"Opened port"} else {"Closed port"}`
-
-### Операторы
-`-eq` равно (equal) \
-`-ceq` учитывать регистр \
-`-ne` не равно (not equal) \
-`-gt` больше (greater) \
-`-ge` больше или равно \
-`-lt` меньше (less) \
-`-le` меньше или равно
-
### Foreach
`$list = 100..110` создать массив из цифр от 100 до 110 \
`foreach ($srv in $list) {ping 192.168.3.$srv -n 1 -w 50}` $srv хранит текущий элемент из $list и повторяет команду до последнего элемента в массиве \
@@ -432,7 +664,7 @@ $ # Конец строки
`} else {Write-Host "Сайт недоступен"; sleep 1}` \
`}`
-### Try
+### Try-Catch-Finally
```
Try {$out = pping 192.168.3.1}
Catch {Write-Warning "$($error[0])"} # выводит в случае ошибки (вместо ошибки)
@@ -450,8 +682,14 @@ finally {$out = "End"} # выполняется в конце в любом сл
`$file = [System.IO.File]::Create("$home\desktop\test.txt")` создать файл \
`$file.Close()` закрыть файл \
`[System.IO.File]::ReadAllLines("$home\desktop\test.txt")` прочитать файл \
-`$file = New-Object System.IO.StreamReader("$home\desktop\test.txt")` \
-`$file.ReadToEnd()`
+`$file = New-Object System.IO.StreamReader("$home\desktop\test.txt")` фафйл будет занят процессом PowerShell \
+`$file | gm` \
+`$file.ReadLine()` построчный вывод \
+`$file.ReadToEnd()` прочитать файл целиком
+
+### Read/Write Bytes
+`$file = [io.file]::ReadAllBytes("$home\desktop\tloztotk.jpg")` метод открывает двоичный файл, считывает его в массив байт и закрывает файл \
+`[io.file]::WriteAllBytes("$home\desktop\tloztotk-2.jpg",$file)` сохранить байты в файл (можно использовать для выгрузки двоичных файлов из БД)
`Get-Content $home/desktop\test.txt -Wait` аналог tail \
`Test-Path $path` проверить доступность пути \
@@ -693,6 +931,23 @@ $obj
`.\MpCmdRun.exe -restore -name $ThreatName` восстановить файл из карантина \
`.\MpCmdRun.exe -restore -filepath $path_file`
+# DISM
+
+`Get-Command -Module Dism -Name *Driver*` \
+`Export-WindowsDriver -Online -Destination C:\Users\Lifailon\Documents\Drivers\` извлечение драйверов из текущей системы (C:\Windows\System32\DriverStore\FileRepository\), выгружает список файлов, которые необходимы для установки драйвера (dll,sys,exe) в соответствии со списком файлов, указанных в секции [CopyFiles] inf-файла драйвера. \
+`Export-WindowsDriver -Path C:\win_image -Destination C:\drivers` извлечь драйвера из офлайн образа Windows, смонтированного в каталог c:\win_image \
+`$BackupDrivers = Export-WindowsDriver -Online -Destination C:\Drivers` \
+`$BackupDrivers | ft Driver,ClassName,ProviderName,Date,Version,ClassDescription` список драйверов в объектном представлении \
+`$BackupDrivers | where classname -match printer` \
+`pnputil.exe /add-driver C:\drivers\*.inf /subdirs /install` установить все (параметр subdirs) драйвера из указанной папки (включая вложенные)
+
+`sfc /scannow` проверить целостность системных файлов с помощью утилиты SFC (System File Checker), в случае поиска ошибок, попробует восстановить их оригинальные копии из хранилища системных компонентов Windows (каталог C:\Windows\WinSxS). Вывод работы логируется в C:\Windows\Logs\CBS с тегом SR \
+`Get-ComputerInfo | select *` подробная информация о системе (WindowsVersion,WindowsEditionId,*Bios*) \
+`Get-WindowsImage -ImagePath E:\sources\install.wim` список доступных версий в образе \
+`Repair-WindowsImage -Online –ScanHealth` \
+`Repair-WindowsImage -Online -RestoreHealth` восстановление хранилища системных компонентов \
+`Repair-WindowsImage -Online -RestoreHealth -Source E:\sources\install.wim:3 –LimitAccess` восстановление в оффлайн режиме из образа по номеру индекса
+
# Scheduled
`$Trigger = New-ScheduledTaskTrigger -At 01:00am -Daily` 1:00 ночи \
@@ -728,12 +983,14 @@ $ping = New-Object System.Net.Networkinformation.Ping
`tnc ya.ru -DiagnoseRouting` маршрутизация до хоста, куда (DestinationPrefix: 0.0.0.0/0) через (NextHop: 192.168.1.254)
### nslookup
-`nslookup ya.ru 8.8.8.8` \
-`nslookup -type=any ya.ru` \
-`Resolve-DnsName ya.ru -Type MX # ALL,ANY,A,NS,SRV,CNAME,PTR,TXT(spf)`
+`nslookup ya.ru 1.1.1.1` с указанием DNS сервера \
+`nslookup -type=any ya.ru` указать тип записи \
+`Resolve-DnsName ya.ru -Type MX` ALL,ANY,A,NS,SRV,CNAME,PTR,TXT(spf) \
+`[System.Net.Dns]::GetHostEntry("ya.ru")`
### route
-`Get-NetRoute`
+`Get-NetRoute` \
+`New-NetRoute -DestinationPrefix "0.0.0.0/0" -NextHop "192.168.3.1" -InterfaceIndex 8`
### ipconfig
`Get-NetIPConfiguration` \
@@ -937,11 +1194,6 @@ icm $_ {Get-LocalGroupMember "Administrators"}
`Add-WindowsCapability -Online -Name Rsat.RemoteDesktop.Services.Tools~~~~0.0.1.0` \
`Get-WindowsCapability -Name RSAT* -Online | Select-Object -Property DisplayName, State` отобразить список установленных компанентов
-### SSH
-`Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'` \
-`Add-WindowsCapability -Online -Name OpenSSH.Client*` \
-`dism /Online /Add-Capability /CapabilityName:OpenSSH.Client~~~~0.0.1.0`
-
### Import-Module ActiveDirectory
`$Session = New-PSSession -ComputerName $srv # -Credential $cred` \
`Export-PSsession -Session $Session -Module ActiveDirectory -OutputModule ActiveDirectory` экспортировать модуль из удаленной сесси (например, с DC) \
@@ -1485,7 +1737,52 @@ Get-RSJob | Remove-RSJob
Start-MTPing -Network 192.168.3.0
(Measure-Command {Start-MTPing -Network 192.168.3.0}).TotalSeconds # 10 Seconds
```
-# PowerCLI
+# Hyper-V
+
+`Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart` установить роль на Windows Server \
+`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.
+(Get-NetAdapter | where Name -match NAT).Status
+```
+`Get-NetNatStaticMapping` отобразить пробросы \
+`Get-NetNat` список сетей \
+`Remove-NetNatStaticMapping -StaticMappingID 0` удалить проброс \
+`Remove-NetNat -Name LocalNat` удалить сеть
+
+`New-VMSwitch -Name Local -AllowManagementOS $True -NetAdapterName "Ethernet 4" -SwitchType External # создать вшений (External) виртуальный коммутатор \
+`$VMName = "hv-dc-01"
+```
+$VM = @{
+Name = $VMName
+MemoryStartupBytes = 4Gb
+Generation = 2
+NewVHDPath = "D:\VM\$VMName\$VMName.vhdx"
+NewVHDSizeBytes = 50Gb
+BootDevice = "VHD"
+Path = "D:\VM\$VMName"
+SwitchName = "NAT"
+}
+New-VM @VM
+```
+`Set-VMDvdDrive -VMName $VMName -Path "C:\Users\Lifailon\Documents\WS-2016.iso" \
+`New-VHD -Path "D:\VM\$VMName\disk_d.vhdx" -SizeBytes 10GB` создать VHDX диск \
+`Add-VMHardDiskDrive -VMName $VMName -Path "D:\VM\$VMName\disk_d.vhdx"` примонтировать диск \
+`Get-VM –VMname $VMName | Set-VM –AutomaticStartAction Start` автозапуск \
+`Get-VM -Name $VMName | Set-VMMemory -StartupBytes 8Gb \
+`Set-VMProcessor $VMName -Count 2 \
+`Get-VM -Name $VMName | Checkpoint-VM -SnapshotName "Snapshot-1" \
+`Restore-VMCheckpoint -Name Snapshot-1" -VMName $VMName -Confirm:$false \
+`Get-VM | Select -ExpandProperty NetworkAdapters | Select VMName,IPAddresses,Status` получить IP адрес всех ВМ \
+`vmconnect.exe localhost $VMHost
+
+# VMWare/PowerCLI
`Install-Module -Name VMware.PowerCLI # -AllowClobber` установить модуль (PackageProvider: nuget) \
`Get-Module -ListAvailable VMware* | Select Name,Version` \
@@ -1559,7 +1856,7 @@ Start-MTPing -Network 192.168.3.0
`Set-VMHostSysLogServer -VMHost esxi-05 -SysLogServer "tcp://192.168.3.100" -SysLogServerPort 3515` \
`Get-VMHostSysLogServer -VMHost esxi-05`
-# EMShell
+# Exchange/EMShell
`$srv_cas = "exchange-cas"` \
`$session_exchange = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$srv_cas/PowerShell/ # -Credential $Cred -Authentication Kerberos` \
@@ -2776,6 +3073,26 @@ West,Texas,927,923.71
$null,Tennessee,466,770.67
"@
```
+`systeminfo /FO csv | ConvertFrom-Csv` вывод работы программы в CSV и конвертация в объект \
+`$systeminfo."Полный объем физической памяти"` \
+`$systeminfo."Доступная физическая память"`
+
+### ConvertFrom-String
+```
+'
+log =
+{
+ level = 4;
+};
+' | ConvertFrom-String # создает PSCustomObject (разбивает по пробелам, удаляет все пробелы и пустые строки)
+```
+### ConvertFrom-StringData
+```
+"
+key1 = value1
+key2 = value2
+" | ConvertFrom-StringData
+```
# XML
```
$xml = [xml](Get-Content $home\desktop\test.rdg) # прочитать содержимое XML-файла
@@ -2839,16 +3156,6 @@ $xml.Save("$home\desktop\test.xml")
```
# JSON
```
-log =
-{
- level = 7;
-};
-
-$log = [xml]"
-
- 7
-"
-
$log = '
{
"log": {
@@ -2857,7 +3164,7 @@ $log = '
}
' | ConvertFrom-Json
-Invoke-RestMethod https://www.speedtest.net/result/14708271987
+Get-Service | ConvertTo-Json
$OOKLA = '
{
@@ -2868,12 +3175,11 @@ $OOKLA = '
}
}
' | ConvertFrom-Json
+$ookla.result
```
-`Get-Service | ConvertTo-Json`
-
# YAML
```
-Import-Module PSYaml # используется в Docker-compose и Ansible playbooks
+Import-Module PSYaml # используется в Docker/Ansible
$netplan = "
network: # словарь по типу - ключ : значение с вложенными словарями
ethernets:
@@ -2917,47 +3223,6 @@ New-Chart Column "Top CPU Overall" -input $topCPU
ps | Select ProcessName, Id, CPU, WorkingSet, *MemorySize | New-Table "All Processes"
} > ~\Desktop\Get-Process-HtmlReport.html
```
-# Git
-
-`git --version` \
-`git config --global user.name "Lifailon"` добавить имя для коммитов \
-`git config --global user.email "lifailon@yandex.ru"` \
-`git config --global --edit` \
-`ssh-keygen -t rsa -b 4096` \
-`Get-Service | where name -match "ssh-agent" | Set-Service -StartupType Automatic` \
-`Get-Service | where name -match "ssh-agent" | Start-Service` \
-`Get-Service | where name -match "ssh-agent" | select Name,Status,StartType` \
-`ssh-agent` \
-`ssh-add C:\Users\Lifailon\.ssh\id_rsa` \
-`cat ~\.ssh\id_rsa.pub | Set-Clipboard` copy to https://github.com/settings/keys \
-`cd $home\Documents\Git` \
-`git clone git@github.com:Lifailon/PowerShell-Commands` \
-`cd PowerShell-Commands` \
-`git grep powershell` поиск текста в файлах \
-`git pull` синхронизировать изменения из хранилища \
-`git status` отобразить статус изменений по файлам \
-`git diff` отобразить изменения построчно \
-`git add .` добавить (проиндексировать) изменения во всех файлах \
-`git commit -m "added file and changed file"` сохранить изменения с комментарием \
-`git push` синхронизировать локальные изменения с репозиторием \
-`git branch dev` создать новую ветку \
-`git switch dev` переключиться на другую ветку \
-`git push --set-upstream origin dev` добавить ветку \
-`git branch -d dev` удалить ветку \
-`git diff rsa` сравнить файлы текущей ветки с файлами в указанной ветки rsa \
-`git merge dev` слияние текущей ветки (rsa/master) с указанной (dev) \
-`git log --oneline --all` лог коммитов \
-`git log --graph` коммиты и следование веток \
-`git show d01f09dead3a6a8d75dda848162831c58ca0ee13` отобразить подробный лог по номеру коммита \
-`git checkout filename` откатить изменения, если не было команды add \
-`git checkout d01f09dead3a6a8d75dda848162831c58ca0ee13` переключить локальные файлы рабочей копии на указанный коммит (изменить HEAD на указанный коммит) \
-`git reset HEAD filename` откатить изменения последнего индекса, если был add но не было commit, тем самым вернуться до последней зафиксированный версии (коммита) и потом выполнить checkout \
-`git reset --mixed HEAD filename` изменения, содержащиеся в отменяемом коммите, не должны исчезнуть, они будут сохранены в виде локальных изменений в рабочей копии \
-`git restore filename` отменить все локальные изменения в рабочей копии \
-`git restore --source d01f09dead3a6a8d75dda848162831c58ca0ee13 filename` восстановить файл на указанную версию по хэшу индентификатора коммита \
-`git revert HEAD --no-edit` отменить последний коммит, без указания комментария (события записываются в git log) \
-`git reset --hard d01f09dead3a6a8d75dda848162831c58ca0ee13` удалить все коммиты до указанного (и откатиться до него)
-
# SQLite
`Install-Module MySQLite -Repository PSGallery` \
@@ -3601,10 +3866,6 @@ API Token: `wqsqOIR3d-PYmiJQYir4sX_NjtKKyh8ZWbfX1ZlfEEpAH3Z2ylcHx3XZzUA36XO3HIos
### DATABASE
`CREATE DATABASE powershell` создать БД \
-`CREATE DATABASE powershell WITH DURATION 48h REPLICATION 1 NAME "del2d"` создать БД с политикой хранения 2 дня \
-`CREATE RETENTION POLICY del2h ON powershell DURATION 2h REPLICATION 1` создать новую политику хранения для БД \
-`ALTER RETENTION POLICY del2h ON powershell DURATION 2h REPLICATION 1 DEFAULT` изменить (ALTER) политику хранения для БД на DEFAULT \
-`DROP RETENTION POLICY del2d ON powershell` удаление политики хранения приводит к безвозвратному удалению всех измерений (таблиц) и данных, хранящихся в политике хранения \
`SHOW DATABASES` отобразить список БД \
`DROP DATABASE powershell` удалить БД \
`USE powershell` \
@@ -3613,14 +3874,21 @@ API Token: `wqsqOIR3d-PYmiJQYir4sX_NjtKKyh8ZWbfX1ZlfEEpAH3Z2ylcHx3XZzUA36XO3HIos
`SELECT * FROM performance` отобразить все данные в таблице \
`SELECT value FROM performance` отфильтровать по столбцу value (только Field Keys) \
`SELECT * FROM performance limit 10` отобразить 10 единиц данных \
-`SELECT * FROM performance WHERE time > now() -1d` отобразить данные за последние 1/4 дня \
-`SELECT * FROM performance WHERE time > now() +3h -5m` данные за последние 5 минут (+3 часа от текущего времени -5 минут) \
+`SELECT * FROM performance WHERE time > now() -2d` отобразить данные за последние 2 дня \
+`SELECT * FROM performance WHERE time > now() +3h -5m` данные за последние 5 минут (+3 часа от текущего времени по UTC 0 -5 минут) \
`SELECT * FROM performance WHERE counter = 'CPU'` выборка по тэгу \
+`SELECT upload/1000 FROM speedtest WHERE upload/1000 <= 250` выборка по столбцу upload и разделить вывод на 1000, вывести upload меньше 250 \
`DELETE FROM performance WHERE time > now() -1h` удалить данные за последние 1/4 часа \
`DELETE FROM performance WHERE time < now() -24h` удалить данные старше 24 часов
-`SELECT/DELETE/SHOW/CREATE/DROP/EXPLAIN/GRANT/REVOKE/ALTER/SET/KILL` \
-`SELECT upload/1000 FROM speedtest WHERE upload/1000 <= 250` отфильтровать по столбцу upload и разделить вывод на 1000, вывести upload меньше 250
+`SELECT/DELETE/SHOW/CREATE/DROP/EXPLAIN/GRANT/REVOKE/ALTER/SET/KILL`
+
+### POLICY
+`CREATE DATABASE powershell WITH DURATION 48h REPLICATION 1 NAME "del2d"` создать БД с политикой хранения 2 дня \
+`CREATE RETENTION POLICY del2h ON powershell DURATION 2h REPLICATION 1` создать новую политику хранения для БД \
+`CREATE RETENTION POLICY del6h ON powershell DURATION 6h REPLICATION 1 SHARD DURATION 2h` указать период хранения 6 часов + 2 часа до очистки (по умолчанию 1ч или больше) \
+`ALTER RETENTION POLICY del6h ON powershell DEFAULT` изменить (ALTER) политику хранения для БД на del6h (DEFAULT) \
+`DROP RETENTION POLICY del2d ON powershell` удаление политики хранения приводит к безвозвратному удалению всех измерений (таблиц) и данных, хранящихся в политике хранения
### API POST
@@ -3665,15 +3933,29 @@ $data.results.series.columns # столбцы/ключи
$data.results.series.values # данные построчно
```
### Endpoint
+https://docs.influxdata.com/influxdb/v1.7/tools/api/
+```
+$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/pprof` \
+`http://192.168.3.104:8086/ping` \
+`http://192.168.3.104:8086/query` \
+`http://192.168.3.104:8086/write`
-`irm http://localhost:8086/api/v2/setup` \
-`irm http://localhost:8086/api/v2/config` \
-`irm http://localhost:8086/api/v2/write`
+`http://192.168.3.99:8086/api/v2/setup` \
+`http://192.168.3.99:8086/api/v2/config` \
+`http://192.168.3.99:8086/api/v2/write`
### PingTo-InfluxDB
```
while ($true) {
- $unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End (Get-Date)).TotalSeconds
+ $tz = (Get-TimeZone).BaseUtcOffset.TotalMinutes
+ $unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End ((Get-Date).AddMinutes(-$tz))).TotalSeconds # -3h UTC
$timestamp = ([string]$unixtime -replace "\..+") + "000000000"
$tnc = tnc 8.8.8.8
$Status = $tnc.PingSucceeded
@@ -3705,8 +3987,9 @@ if ($localization -eq 1049) {
$performance = "\Processor(_Total)\% Processor Time"
}
+$tz = (Get-TimeZone).BaseUtcOffset.TotalMinutes
while ($true) {
- $unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End (Get-Date)).TotalSeconds
+ $unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End ((Get-Date).AddMinutes(-$tz))).TotalSeconds # -3h UTC
$timestamp = ([string]$unixtime -replace "\..+") + "000000000"
[double]$value = (Get-Counter $performance).CounterSamples.CookedValue.ToString("0.00").replace(",",".") # округлить в тип данных Double
Invoke-RestMethod -Method POST -Uri "http://192.168.3.104:8086/write?db=powershell" -Body "performance,host=$(hostname),counter=CPU value=$value $timestamp"
@@ -3723,23 +4006,22 @@ $Service_Name = "PerformanceTo-InfluxDB"
Get-Service $Service_Name | Start-Service
Get-Service $Service_Name | Set-Service -StartupType Automatic
```
-### Telegraf
+# Telegraf
Plugins: https://docs.influxdata.com/telegraf/v1.27/plugins/#input-plugins
`iwr https://dl.influxdata.com/telegraf/releases/telegraf-1.27.1_windows_amd64.zip -UseBasicParsing -OutFile telegraf-1.27.1_windows_amd64.zip` \
-`Expand-Archive .\telegraf-1.27.1_windows_amd64.zip -DestinationPath "C:\Program Files\InfluxData\telegraf"` \
-`cd "C:\Program Files\InfluxData\telegraf\telegraf-1.27.1"` \
-`.\telegraf.exe --service install --config "C:\Program Files\InfluxData\telegraf\telegraf-1.27.1\telegraf.conf"` \
-`.\telegraf.exe --service uninstall` \
-`.\telegraf.exe -sample-config --input-filter cpu:mem:dns_query --output-filter influxdb > telegraf.conf` создать конфигурацию с выбарнными плагинами для сбора метрик \
-`.\telegraf.exe --test` тест конфигурации \
-`ii "C:\Program Files\InfluxData\telegraf\telegraf-1.27.1\telegraf.conf"`
+`Expand-Archive .\telegraf-1.27.1_windows_amd64.zip -DestinationPath "C:\Telegraf"` \
+`rm telegraf-1.27.1_windows_amd64.zip` \
+`cd C:\Telegraf` \
+`.\telegraf.exe -sample-config --input-filter cpu:mem:dns_query --output-filter influxdb > telegraf_nt.conf` создать конфигурацию с выбарнными плагинами для сбора метрик \
+`Start-Process notepad++ C:\Telegraf\telegraf_nt.conf`
```
[[outputs.influxdb]]
urls = ["http://192.168.3.104:8086"]
- username = "username"
- password = "userpass"
+ database = "telegraf_nt"
+ username = "user"
+ password = "pass"
[[inputs.cpu]]
percpu = false
totalcpu = true
@@ -3747,12 +4029,15 @@ Plugins: https://docs.influxdata.com/telegraf/v1.27/plugins/#input-plugins
servers = ["8.8.8.8"]
network = "udp"
domains = ["."]
- ## Possible values: A, AAAA, CNAME, MX, NS, PTR, TXT, SOA, SPF, SRV.
record_type = "A"
port = 53
timeout = "2s"
```
-`Get-Service telegraf | Start-Service`
+`.\telegraf.exe --test -config C:\Telegraf\telegraf_nt.conf` тест конфигурации (получения метрик с выводом в консоль) \
+`C:\Telegraf\telegraf.exe -config C:\Telegraf\telegraf_nt.conf` запустить telegraf (тест отправки данных) \
+`.\telegraf.exe --config "C:\Telegraf\telegraf_nt.conf" --service install` создать службу \
+`Get-Service telegraf | Start-Service` \
+`.\telegraf.exe --service uninstall`
`USE telegraf` \
`SELECT usage_idle,usage_system,usage_user FROM cpu`
@@ -3877,8 +4162,6 @@ foreach ($row in $dsDB[0].Tables[0].Rows) {
`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'"` отфильтровать запущенные службы \
@@ -3886,18 +4169,29 @@ foreach ($row in $dsDB[0].Tables[0].Rows) {
`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_service -Filter 'name="MSSQL$MSSQLE"').StartService()` запустить службу
+
+`Get-CimInstance -ComputerName $srv Win32_OperatingSystem | select LastBootUpTime` время последнего включения \
+`gwmi -ComputerName $srv -Class Win32_OperatingSystem | select LocalDateTime,LastBootUpTime` текущее время и время последнего включения \
`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 \
+`(gwmi Win32_OperatingSystem -EnableAllPrivileges).Win32Shutdown(0)` завершение сеанса пользователя
+```
+$system = Get-WmiObject -Class Win32_OperatingSystem
+$InstallDate = [Management.ManagementDateTimeconverter]::ToDateTime($system.installdate) # Получаем дату установки ОС
+$AfterInstallDays = ((Get-Date) — $Installdate).Days # Вычисляем время, прошедшее с момента установки
+$ShortInstallDate = "{0:yyyy-MM-dd HH:MM}" -f ($InstallDate)
+"Система установлена: $ShortInstallDate (Прошло $AfterInstalldays дней)"
+```
`(Get-WmiObject win32_battery).estimatedChargeRemaining` заряд батареи в процентах \
`gwmi Win32_UserAccount` доменные пользователи \
`(gwmi Win32_SystemUsers).PartComponent` \
`Get-CimInstance -ClassName Win32_LogonSession` \
`Get-CimInstance -ClassName Win32_BIOS`
+
+`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
```
$srv = "localhost"
gwmi Win32_logicalDisk -ComputerName $srv | where {$_.Size -ne $null} | select @{
@@ -3917,7 +4211,7 @@ Label="Value"; Expression={$_.DeviceID}}, @{Label="AllSize"; Expression={
# Regedit
-`Get-PSDrive` список всех доступных дисков и веток реестра \
+`Get-PSDrive` список всех доступных дисков/разделов, их размер и веток реестра \
`cd HKLM:\` HKEY_LOCAL_MACHINE \
`cd HKCU:\` HKEY_CURRENT_USER \
`Get-Item` получить информацию о ветке реестра \
@@ -4064,128 +4358,134 @@ $results2 +=[PSCustomObject]@{'ID'=$d.id.ToString();'Data'=$d.Data.ToString()} #
}
$results2
```
+# OpenSSH
+
+`Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'` \
+`Add-WindowsCapability -Online -Name OpenSSH.Client*` \
+`dism /Online /Add-Capability /CapabilityName:OpenSSH.Client~~~~0.0.1.0` \
+`iwr https://github.com/PowerShell/Win32-OpenSSH/releases/download/v9.2.2.0p1-Beta/OpenSSH-Win64-v9.2.2.0.msi -OutFile $home\Downloads\OpenSSH-Win64-v9.2.2.0.msi` скачать \
+`msiexec /i $home\Downloads\OpenSSH-Win64-v9.2.2.0.msi` установить msi пакет \
+`Set-Service sshd -StartupType Automatic` \
+`Get-NetTCPConnection | where LocalPort -eq 22` \
+`New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22` \
+`Get-NetFirewallRule -Name *ssh*` \
+`Start-Process notepad++ C:\Programdata\ssh\sshd_config` конфигурационный файл \
+`GSSAPIAuthentication yes` включить Kerberos аутентификацию (через AD) \
+`SyslogFacility LOCAL0` включить локальное ведение журнала в файл (C:\ProgramData\ssh\logs\sshd.log) \
+`LogLevel INFO` \
+`Restart-Service sshd` \
+`ssh -K $srv` выполнить Kerberos аутентификацию \
+`ssh Lifailon@192.168.3.99 -p 22` \
+`pwsh -command Get-Service` \
+`ssh -L 3101:192.168.3.101:22 -R 3101:192.168.3.101:22 lifailon@192.168.3.101 -p 22` SSH Tunnel lifailon@localhost:3101 -> 192.168.3.101:3101
+
# 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` удалить сессию
+`Remove-PSSession $session` удалить сессию \
+`Import-Module -Name ActiveDirectory -PSSession $srv` импортировать модуль с удаленного компьютера в локальную сессию
### 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)
+`Enable-PSRemoting –Force` включить PowerShell Remoting, работает только для доменного и частного сетевых профилей Windows \
+`Enable-PSRemoting -SkipNetworkProfileCheck -Force` для настройки компьютера в общей (public) сети (работает с версии powershell 6)
-# Ansible
+`$NetProfiles = Get-NetConnectionProfile` отобразить профили сетевых подключений \
+`Set-NetConnectionProfile -InterfaceIndex $NetProfiles[1].InterfaceIndex -NetworkCategory Private` изменить тип сети для профиля (DomainAuthenticated/Public) \
+`(Get-CimInstance -ClassName Win32_ComputerSystem).PartOfDomain` проверить, что компьютер добавлен в домен AD \
+`Get-Service WinRM | Set-Service -StartupType AutomaticDelayedStart` отложенный запуск \
+`Get-Service -Name winrm -RequiredServices` статус зависимых служб \
+`New-NetFirewallRule -Profile Any -DisplayName "WinRM HTTP" -Direction Inbound -Protocol TCP -LocalPort 5985,5986` \
+`Test-NetConnection $srv -port 5895` проверить порт \
+`Test-WSMan $srv -ErrorAction Ignore` проверить работу WinRM на удаленном компьютере (игнорировать вывод ошибок для скрипта) или локально (localhost)
-`apt-get update && apt-get upgrade` \
-`apt-get install ansible`
+`$Cert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "WinRM HTTPS Certificate" -NotAfter (Get-Date).AddYears(5)` создать самоподписанный сертификат \
+`$Thumbprint = $Cert.Thumbprint` забрать отпечаток \
+`New-Item -Path WSMan:\Localhost\Listener -Transport HTTPS -Address * -CertificateThumbprint $Thumbprint -Name WinRM_HTTPS_Listener -Force` создать прослушиватель \
+`New-NetFirewallRule -DisplayName 'WinRM HTTPS' -Profile Domain,Private -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5986` открыть порт в fw
+```
+$selector_set = @{
+ Address = "*"
+ Transport = "HTTPS"
+}
+$value_set = @{
+ CertificateThumbprint = "66ABFDA044D8C85135048186E2FDC0DBE6125163"
+}
+New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_set
+```
+`winrm get winrm/config` отобразить всю конфигурацию (Client/Service) \
+`winrm get winrm/config/service/auth` конфигурация авторизации на сервере \
+`winrm enumerate winrm/config/listener` текущая конфигурация прослушивателей WinRM (отображает отпечаток сертификата для HTTPS 5986) \
+`Get-ChildItem -Path Cert:\LocalMachine\My\ | where Thumbprint -eq D9356FB774EE0E6206B7D5B59B99102CA5B17BDA | select *` информация о сертификате
-`nano /etc/ansible/ansible.cfg` \
-`#inventory = /etc/ansible/hosts`
+`ls WSMan:\localhost\Client` конфигурацию клиента \
+`ls WSMan:\localhost\Service` конфигурация сервера \
+`ls WSMan:\localhost\Service\auth` список всех конфигураций аутентификации WinRM сервера \
+`Set-Item -path WSMan:\localhost\Service\auth\basic -value $true` разрешить локальную аутентификацию к текущему серверу \
+`ls HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN` настройки в реестре (например, для включения аудентификации в \Service\auth_basic = 1) \
+`Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.* -Force` добавить доверенные хосты в конфигурацию на клиенте, чтобы работала Negotiate аутентификация через NTLM \
+`Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.3.100 -Concatenate -Force` добавить второй компьютер \
+`ls WSMan:\localhost\Client\TrustedHosts` \
+`Set-Item WSMan:\localhost\Client\AllowUnencrypted $true` включить передача незашифрованных данных конфигурации клиента \
+`Set-Item WSMan:\localhost\Service\AllowUnencrypted $true` включить передача незашифрованных данных конфигурации сервера (необходимо быть в private сети)
-`nano /etc/ansible/hosts`
-```
-[elk]
-devlog-01.domain.local ansible_host=192.168.11.230
-netbox-01.domain.local ansible_host=192.168.11.245
+`Get-PSSessionConfiguration` проверить, включен ли PSremoting и вывести список пользователей и групп, которым разрешено подключаться через WinRM \
+`Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI` назначить права доступа через дескриптор безопасности текущей сессии (до перезагруки) \
+`(Get-PSSessionConfiguration -Name "Microsoft.PowerShell").SecurityDescriptorSDDL` получить настройки дескриптора в формате SDDL \
+`Set-PSSessionConfiguration -Name Microsoft.PowerShell -SecurityDescriptorSDDL $SDDL` применить настройки дескриптора на другом компьютере без использования GUI \
-[all:vars]
-path_user=/home/us
-ansible_user=us
-ansible_ssh_port=22
+`New-LocalUser "WinRM-Writer" -Password (ConvertTo-SecureString -AsPlainText "123098")` создать пользователя \
+`Add-LocalGroupMember -Group "Remote Management Users" -Member "WinRM-Writer"` добавить пользователя WinRM-Writer в локальную группу доступа "Пользователи удаленного управления" \
+`cmdkey /add:192.168.3.99 /user:WinRM-Writer /pass:123098` сохранить пароль в CredentialManager
+`cmdkey /list` \
+`Import-Module CredentialManager` \
+`Add-Type -AssemblyName System.Web` \
+`New-StoredCredential -Target 192.168.3.99 -UserName WinRM-Writer -Password 123098 -Comment WinRM` сохранить пароль в CredentialManager (из PS5) \
+`Get-StoredCredential -AsCredentialObject` \
+`$cred = Get-StoredCredential -Target 192.168.3.99` \
+`Enter-PSSession -ComputerName 192.168.3.99 -Credential $cred -Authentication Negotiate` \
+`Enter-PSSession -ComputerName 192.168.3.99 -Credential $cred -Authentication Basic -Port 5985` работает при отключении allowunencrypted на стороне сервера и клиента \
+`winrs -r:http://192.168.3.100:5985/wsman -u:WinRM-Writer -p:123098 ipconfig` передать команду через winrs (-?) \
+`winrs -r:https://192.168.3.100:5985/wsman -u:WinRM-Writer -p:123098 -ssl ipconfig` через https \
+`pwsh -Command "Install-Module -Name PSWSMan"` установить модуль для использования в Linux системе
-[ws_vproxy]
-vproxy-01 ansible_host=192.168.11.196
-vproxy-03 ansible_host=192.168.11.188
-vproxy-04 ansible_host=192.168.11.64
+### Kerberos
-[ws_vproxy:vars]
-ansible_user=winrm
-#ansible_user=support4@DOMAIN.LOCAL
-ansible_password=123098
-ansible_port=5986
-ansible_connection=winrm
-ansible_winrm_transport=basic
-#ansible_winrm_transport=kerberos
-ansible_winrm_server_cert_validation=ignore
-validate_certs=false
-```
-`ansible-inventory --list -y`
+`.\CheckMaxTokenSize.ps1 -Principals login -OSEmulation $true -Details $true` узнать размер токена пользователя в домене \
+`Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters | select maxtokensize` максимальный размер токена на сервере \
+`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters` изменить размера, если заголовок пакета аутентификации превышает 16 Кб (из за большого кол-ва групп) \
+`MaxFieldLength увеличить до 0000ffff (65535)` \
+`MaxRequestBytes увеличить до 0000ffff (65535)`
-### Modules
-```
-ansible-doc -l | grep windows # оф. документация модулей
-ansible elk -m ping
-#ansible all -m ping -u us
-ansible all -m shell -a "lsblk " -vvvvv # debug выполнения команды, чем больше "v" тем больше отображение
-ansible elk -m setup | grep -iP "mem|proc" # информация о железе
-ansible elk -m apt -a "name=mc"
-ansible elk -m service -a "name=ssh state=restarted enabled=yes" -b # перезапустить службу
-# -b - повысить привилегии (sudo)
-```
-### Copy
-```
-echo "21" > test.txt
-ansible elk -m copy -a "src=test.txt dest=/root mode=777" -b
-ansible elk -a "ls /root" -b
-ansible elk -a "cat /root/test.txt" -b
-```
-### Args
-```
-ansible elk -m shell -a "uptime"
-ansible elk -a "mkdir /home/us/test"
-ansible elk -a "ls $path_user"
-```
-### Windows Modules
-```
-ansible ws_vproxy -m win_ping
-ansible ws_vproxy -m raw -a "ipconfig"
-ansible ws_vproxy -m win_shell -a "Get-Service | select name,status"
-ansible ws_vproxy -m win_service -a "name=Spooler state=started"
-```
-### Playbook
+# pki
-`nano /etc/ansible/elk.yml`
-```
-- hosts: elk
- become: yes
- tasks:
- - name: Create group tester
- action: group name=tester state=present
- - name: Add user to system
- user: name=tester shell=/bin/bash groups=tester append=yes
-```
-`ansible-playbook /etc/ansible/elk.yml # -i /etc/ansible/hosts`
+`Get-ChildItem -Path Cert:\CurrentUser\Root\` список всех установленных сертификатов в хранилище Доверенные корневые ЦС Текущего пользователя \
+`Get-ChildItem -Path Cert:\CurrentUser\My\` список самозаверяющих сертификатов в Личное хранилище Текущего пользователя \
+`Get-ChildItem -Path Cert:\LocalMachine\My\` список самозаверяющих сертификатов в Личное хранилище Локального компьютера \
+`Get-ChildItem -Path Cert:\LocalMachine\My\ | select NotBefore,NotAfter,Thumbprint,Subject` срок действия сертификата \
+`Get-ChildItem -Path Cert:\LocalMachine\My\ | where Thumbprint -eq D9356FB774EE0E6206B7D5B59B99102CA5B17BDA` поиск сертификат по отпечатку
+
+`Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Certificates\` сертификаты в файловой системе, каждый файл соответствует сертификату, установленному в личном хранилище текущего пользователя \
+`Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Keys\` ссылки на объекты закрытых ключей, созданных поставщиком хранилища ключей (KSP) \
+`Get-ChildItem -Path HKCU:\Software\Microsoft\SystemCertificates\CA\Certificates | ft -AutoSize` список сертификатов в реестре вошедшего в систему пользователя
+
+`$cert = (Get-ChildItem -Path Cert:\CurrentUser\My\)[1]` выбрать сертификат \
+`$cert | Remove-Item` удалить сертификат
+
+`Export-Certificate -FilePath $home\Desktop\certificate.cer -Cert $cert` экспортировать сертификат \
+`$cert.HasPrivateKey` проверить наличие закрытого ключа \
+`$pass = "password" | ConvertTo-SecureString -AsPlainText -Force` создать пароль для шифрования закрытого ключа \
+`Export-PfxCertificate -FilePath $home\Desktop\certificate.pfx -Password $pass -Cert $certificate` экспортировать сертификат с закрытым ключем
+
+`Import-Certificate -FilePath $home\Desktop\certificate.cer -CertStoreLocation Cert:\CurrentUser\My` импортировать сертификат \
+`Import-PfxCertificate -Exportable -Password $pass -CertStoreLocation Cert:\CurrentUser\My -FilePath $home\Desktop\certificate.pfx
-### Обновить и установить пакет
-```
-- hosts: all
- become: yes
- tasks:
- - name: Run apt-get update
- apt:
- update_cache: yes
- - name: Install latest version nmap
- apt:
- name: nmap
- state: latest
-```
# DSC
`Import-Module PSDesiredStateConfiguration` \
@@ -4248,3 +4548,348 @@ Configuration DSConfigurationProxy
`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
+
+`git --version` \
+`git config --global user.name "Lifailon"` добавить имя для коммитов \
+`git config --global user.email "lifailon@yandex.ru"` \
+`git config --global --edit` \
+`ssh-keygen -t rsa -b 4096` \
+`Get-Service | where name -match "ssh-agent" | Set-Service -StartupType Automatic` \
+`Get-Service | where name -match "ssh-agent" | Start-Service` \
+`Get-Service | where name -match "ssh-agent" | select Name,Status,StartType` \
+`ssh-agent` \
+`ssh-add C:\Users\Lifailon\.ssh\id_rsa` \
+`cat ~\.ssh\id_rsa.pub | Set-Clipboard` copy to https://github.com/settings/keys \
+`cd $home\Documents\Git` \
+`git clone git@github.com:Lifailon/PowerShell-Commands` \
+`cd PowerShell-Commands` \
+`git grep powershell` поиск текста в файлах \
+`git pull` синхронизировать изменения из хранилища \
+`git status` отобразить статус изменений по файлам \
+`git diff` отобразить изменения построчно \
+`git add .` добавить (проиндексировать) изменения во всех файлах \
+`git commit -m "added file and changed file"` сохранить изменения с комментарием \
+`git push` синхронизировать локальные изменения с репозиторием \
+`git branch dev` создать новую ветку \
+`git switch dev` переключиться на другую ветку \
+`git push --set-upstream origin dev` добавить ветку \
+`git branch -d dev` удалить ветку \
+`git diff rsa` сравнить файлы текущей ветки с файлами в указанной ветки rsa \
+`git merge dev` слияние текущей ветки (rsa/master) с указанной (dev) \
+`git log --oneline --all` лог коммитов \
+`git log --graph` коммиты и следование веток \
+`git show d01f09dead3a6a8d75dda848162831c58ca0ee13` отобразить подробный лог по номеру коммита \
+`git checkout filename` откатить изменения, если не было команды add \
+`git checkout d01f09dead3a6a8d75dda848162831c58ca0ee13` переключить локальные файлы рабочей копии на указанный коммит (изменить HEAD на указанный коммит) \
+`git reset HEAD filename` откатить изменения последнего индекса, если был add но не было commit, тем самым вернуться до последней зафиксированный версии (коммита) и потом выполнить checkout \
+`git reset --mixed HEAD filename` изменения, содержащиеся в отменяемом коммите, не должны исчезнуть, они будут сохранены в виде локальных изменений в рабочей копии \
+`git restore filename` отменить все локальные изменения в рабочей копии \
+`git restore --source d01f09dead3a6a8d75dda848162831c58ca0ee13 filename` восстановить файл на указанную версию по хэшу индентификатора коммита \
+`git revert HEAD --no-edit` отменить последний коммит, без указания комментария (события записываются в git log) \
+`git reset --hard d01f09dead3a6a8d75dda848162831c58ca0ee13` удалить все коммиты до указанного (и откатиться до него)
+
+# 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 sshpass`
+
+`ansible-galaxy collection install ansible.windows` установить коллекцию модулей \
+`ansible-galaxy collection install community.windows` \
+`ansible-galaxy collection list | grep windows` \
+`ansible-config dump | grep DEFAULT_MODULE_PATH` путь хранения модулей
+
+`apt-get -y install python-dev libkrb5-dev krb5-user` пакеты для Kerberos аутентификации \
+`apt install python3-pip` \
+`pip3 install requests-kerberos` \
+`nano /etc/krb5.conf` настроить [realms] и [domain_realm] \
+`kinit -C support4@domail.local` \
+`klist`
+
+`ansible --version` \
+`config file = None` \
+`nano /etc/ansible/ansible.cfg` файл конфигурации
+```
+[defaults]
+inventory = /etc/ansible/hosts
+# uncomment this to disable SSH key host checking
+# Отключить проверку ключа ssh (для подключения используя пароль)
+host_key_checking = False
+```
+`nano /etc/ansible/hosts`
+```
+[us]
+pi-hole-01 ansible_host=192.168.3.101
+zabbix-01 ansible_host=192.168.3.102
+grafana-01 ansible_host=192.168.3.103
+netbox-01 ansible_host=192.168.3.104
+
+[all:vars]
+ansible_ssh_port=2121
+ansible_user=lifailon
+ansible_password=123098
+path_user=/home/lifailon
+ansible_python_interpreter=/usr/bin/python3
+
+[ws]
+huawei-01 ansible_host=192.168.3.99
+plex-01 ansible_host=192.168.3.100
+
+[ws:vars]
+ansible_port=5985
+#ansible_port=5986
+ansible_user=Lifailon
+#ansible_user=support4@DOMAIN.LOCAL
+ansible_password=123098
+ansible_connection=winrm
+ansible_winrm_scheme=http
+ansible_winrm_transport=basic
+#ansible_winrm_transport=kerberos
+ansible_winrm_server_cert_validation=ignore
+validate_certs=false
+
+[win_ssh]
+huawei-01 ansible_host=192.168.3.99
+plex-01 ansible_host=192.168.3.100
+
+[win_ssh:vars]
+ansible_python_interpreter=C:\Users\Lifailon\AppData\Local\Programs\Python\Python311\ # добавить переменную среды интерпритатора Python в Windows
+ansible_connection=ssh
+#ansible_shell_type=cmd
+ansible_shell_type=powershell
+```
+`ansible-inventory --list` проверить конфигурацию (читает в формате JSON) или YAML (-y) с просмотром все применяемых переменных
+
+# Modules
+
+`ansible us -m ping` \
+`ansible win_ssh -m ping` \
+`ansible us -m shell -a "uptime && df -h | grep lv"` \
+`ansible us -m setup | grep -iP "mem|proc"` информация о железе \
+`ansible us -m apt -a "name=mc" -b` повысить привилегии sudo (-b) \
+`ansible us -m service -a "name=ssh state=restarted enabled=yes" -b` перезапустить службу \
+`echo "echo test" > test.sh` \
+`ansible us -m copy -a "src=test.sh dest=/root mode=777" -b` \
+`ansible us -a "ls /root" -b` \
+`ansible us -a "cat /root/test.sh" -b`
+
+`ansible-doc -l | grep win_` список всех модулей Windows (https://docs.ansible.com/ansible/latest/collections/ansible/windows/) \
+`ansible ws -m win_ping` windows модуль \
+`ansible ws -m win_ping -u WinRM-Writer` указать логин \
+`ansible ws -m win_shell -a '$PSVersionTable'` \
+`ansible ws -m win_shell -a 'Get-Service | where name -match "ssh|winrm"'` \
+`ansible ws -m win_service -a "name=sshd state=stopped"` \
+`ansible ws -m win_service -a "name=sshd state=started"`
+
+### win_shell
+
+`nano /etc/ansible/Get-PowerShell.yml`
+```
+- hosts: ws
+ # Указать коллекцию модулей
+ collections:
+ - ansible.windows
+ tasks:
+ - name: Get port ssh
+ win_shell: |
+ Get-Content "C:\Programdata\ssh\sshd_config" | Select-String "port\s"
+ # Зарегистрировать вывод в переменную
+ register: command_output
+ - name: Output port ssh
+ # Вывести переменную на экран
+ debug:
+ var: command_output.stdout_lines
+```
+`ansible-playbook /etc/ansible/Get-PowerShell.yml`
+
+### win_powershell
+
+`nano /etc/ansible/powershell-param.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Run PowerShell script with parameters
+ ansible.windows.win_powershell:
+ parameters:
+ Path: C:\Temp
+ Force: true
+ script: |
+ [CmdletBinding()]
+ param (
+ [String]$Path,
+ [Switch]$Force
+ )
+ New-Item -Path $Path -ItemType Directory -Force:$Force
+```
+`ansible-playbook /etc/ansible/powershell-param.yml`
+
+### win_chocolatey
+
+`nano /etc/ansible/setup-chocolatey.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Install Acrobat Reader
+ win_chocolatey:
+ name: adobereader
+ state: present
+```
+`ansible-playbook /etc/ansible/setup-chocolatey.yml`
+
+`nano /etc/ansible/setup-chocolatey.yml`
+```
+- hosts: ws
+ tasks:
+ - name: install the Win32-OpenSSH service
+ win_chocolatey:
+ name: openssh
+ package_params: /SSHServerFeature
+ state: present
+```
+`ansible-playbook /etc/ansible/setup-chocolatey.yml`
+
+### win_regedit
+
+`nano /etc/ansible/win-set-shell-ssh-ps7.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Set the default shell to PowerShell 7 for Windows OpenSSH
+ win_regedit:
+ path: HKLM:\SOFTWARE\OpenSSH
+ name: DefaultShell
+ # data: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
+ data: 'C:\Program Files\PowerShell\7\pwsh.exe'
+ type: string
+ state: present
+```
+`ansible-playbook /etc/ansible/win-set-shell-ssh-ps7.yml -i /etc/ansible/hosts`
+
+### win_copy
+
+`echo "Get-Service | where name -eq vss | Start-Service" > /home/lifailon/Start-Service-VSS.ps1` \
+`nano /etc/ansible/copy-file-to-win.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Copy file to win hosts
+ win_copy:
+ src: /home/lifailon/Start-Service-VSS.ps1
+ dest: C:\Users\Lifailon\Desktop\Start-Service-VSS.ps1
+```
+`ansible-playbook /etc/ansible/copy-file-to-win.yml`
+
+`curl -OL https://github.com/PowerShell/PowerShell/releases/download/v7.3.6/PowerShell-7.3.6-win-x64.msi` \
+`nano /etc/ansible/copy-file-to-win.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Copy file to win hosts
+ win_copy:
+ src: /home/lifailon/PowerShell-7.3.6-win-x64.msi
+ dest: C:\Install\PowerShell-7.3.6.msi
+```
+`ansible-playbook /etc/ansible/copy-file-to-win.yml`
+
+### win_command
+
+`nano /etc/ansible/run-script-ps1.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Run PowerShell Script
+ win_command: powershell -ExecutionPolicy ByPass -File C:\Users\Lifailon\Desktop\Start-Service-VSS.ps1
+```
+`ansible-playbook /etc/ansible/run-script-ps1.yml`
+
+### win_package
+
+`nano /etc/ansible/setup-msi-package.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Install MSI Package
+ win_package:
+# path: C:\Install\7z-23.01.msi
+ path: C:\Install\PowerShell-7.3.6.msi
+ arguments:
+ - /quiet
+ - /passive
+ - /norestart
+```
+`ansible-playbook /etc/ansible/setup-msi-package.yml`
+
+### win_firewall_rule
+
+`nano /etc/ansible/win-fw-open.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Open RDP port
+ win_firewall_rule:
+ name: Open RDP port
+ localport: 3389
+ action: allow
+ direction: in
+ protocol: tcp
+ state: present
+ enabled: yes
+```
+`ansible-playbook /etc/ansible/win-fw-open.yml`
+
+### win_group
+
+`nano /etc/ansible/win-creat-group.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Create a new group
+ win_group:
+ name: deploy
+ description: Deploy Group
+ state: present
+```
+`ansible-playbook /etc/ansible/win-creat-group.yml`
+
+### win_group_membership
+
+`nano /etc/ansible/add-user-to-group.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Add a local and domain user to a local group
+ win_group_membership:
+ name: deploy
+ members:
+ - WinRM-Writer
+ state: present
+```
+`ansible-playbook /etc/ansible/add-user-to-group.yml`
+
+### win_feature
+
+`nano /etc/ansible/install-feature.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Install Windows Feature
+ win_feature:
+ name: SNMP-Service
+ state: present
+```
+`ansible-playbook /etc/ansible/install-feature.yml`
+
+### win_reboot
+
+`nano /etc/ansible/win-reboot.yml`
+```
+- hosts: ws
+ tasks:
+ - name: Reboot a slow machine that might have lots of updates to apply
+ win_reboot:
+ reboot_timeout: 3600
+```
+`ansible-playbook /etc/ansible/win-reboot.yml`