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`