From 3c21adec96f9b7ddaea116fc713590285d8b860f Mon Sep 17 00:00:00 2001 From: Alex Kup <116945542+Lifailon@users.noreply.github.com> Date: Fri, 1 Mar 2024 18:12:38 +0300 Subject: [PATCH] Delete index.html --- index.html | 8106 ---------------------------------------------------- 1 file changed, 8106 deletions(-) delete mode 100644 index.html diff --git a/index.html b/index.html deleted file mode 100644 index 3090948..0000000 --- a/index.html +++ /dev/null @@ -1,8106 +0,0 @@ - - -
- - - -
?? Habr: PowerShell и -его возможности
-Get-Verb действия/глаголы, утвержденные для
-использования в командлетах
-Get-Command *Language* поиск команды по имени
-(Get-Command Get-Language).Module узнать к какому модулю
-принадлежит команда
-Get-Command Get-Content | fl Module,DLL узнать
-принадлежность команды к модулю и dll
-Get-Command -Module LanguagePackManagement отобразить
-список команд указанного модуля
-(Get-Module LanguagePackManagement).ExportedCommands.Values
-отобразить список команд указанного модуля
-Get-Language | Get-Member отобразить список методов команды
-(действия), объекты вывода и Event (события объектов: Click)
-(Get-Help Get-Service).Aliases узнать псевдонимом
-команды
-Get-Alias gsv узнать имя команды по псевдониму
-Get-Help Get-Service синтаксис
-Get-Help Get-Service -Parameter * описание всех
-параметров
-Get-Help Get-Service -Online
-Get-Help Get-Service -ShowWindow описание параметров в GUI
-с фильтрацией
-Show-Command вывести список команд в GUI
-Show-Command Get-Service список параметров команды в
-GUI
-Invoke-Expression iex принимает текст для выполнения в
-консоли как команды
-$PSVersionTable версия PowerShell
-Set-ExecutionPolicy Unrestricted
-Get-ExecutionPolicy
-$Metadata = New-Object System.Management.Automation.CommandMetaData (Get-Command Get-Service)
-получить информацию о командлете
-[System.Management.Automation.ProxyCommand]::Create($Metadata)
-исходный код функции
$var = Read-Host "Enter" ручной ввод
-$pass = Read-Host "Enter Password" -AsSecureString скрывать
-набор
-$global:path = "\\path" задать глобальную переменную,
-например в функции
-$using:srv использовать переменную текущей сесси в
-Invoke-сессии
-Get-Variable отобразить все переменные
-ls variable:/ отобразить все переменные
-Get-Variable *srv* найти переменную по имени
-Get-Variable -Scope Global отобразить все глобальные
-переменные
-Get-Variable Error последняя команда с ошибкой
-Remove-Variable -Name * очистить все переменные
-$LASTEXITCODE содержит код вывода последней запущенной
-программы, например ping. Если код возврата положительный (True), то
-$LastExitCode = 0
Get-ChildItem Env: отобразить все переменные
-окружения
-$env:PSModulePath директории импорта модулей
-$env:userprofile
-$env:computername
-$env:username
-$env:userdnsdomain
-$env:logonserver
-([DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Name
-[Environment]::GetFolderPath('ApplicationData')
Get-History история команд текущей сессии
-(Get-History)[-1].Duration.TotalSeconds время выполнения
-последней команды
-(Get-PSReadLineOption).HistorySavePath путь к сохраненному
-файлу с 4096 последних команд (из модуля PSReadLine)
-Get-Content (Get-PSReadlineOption).HistorySavePath | Select-String Get
-поиск по содержимому файла (GREP)
-Set-PSReadlineOption -MaximumHistoryCount 10000 изменить
-количество сохраняемых команд в файл
-Get-PSReadLineOption | select MaximumHistoryCount
-Set-PSReadlineOption -HistorySaveStyle SaveNothing
-отключить ведение журнала
-F2 переключиться с InlineView на ListView
Set-Clipboard $srv скопировать в буфер обмена
-Get-Clipboard вставить
Write-Host -ForegroundColor Black -BackgroundColor Green "Test" -NoNewline
-Write-Error Test
-Foreach ($n in 1..100) {Write-Progress -Activity "Test Progress" -PercentComplete $n}
$srv = @("server-01", "server-02") создать массив
-$srv += @("server-03") добавить в массив новый
-элемент
-$srv.Count отобразить кол-во элементов в массиве
-Out-String построчный вывод
$srv[0] вывести первое значение элемента массива
-$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 = @{"User" = "$env:username"; "Server" = "$env:computername"} # создать
-$hashtable += @{"User2" = "$env:username"; "Server2" = "$env:computername"} # добавить ключи
-$hashtable.Keys # список всех ключей
-$hashtable["User"] # получить значение (Values) по ключу
-$hashtable["User"] = "Test" # изменить
-$hashtable.Remove("User") # удалить ключ$Tag = @{$true = 'dev'; $false = 'prod'}[([System.Net.Dns]::GetHostEntry("localhost").HostName) -match '.*.TestDomain$']
$Collections = New-Object System.Collections.Generic.List[System.Object]
-$Collections.Add([PSCustomObject]@{User = $env:username; Server = $env:computername})$CustomObject = [PSCustomObject][ordered]@{User = $env:username; Server = $env:computername}
-$CustomObject | Add-Member –MemberType NoteProperty –Name Arr –Value @(1,2,3) # добавить Property (свойство/стобец)
-$CustomObject.Arr = @(1,3,5) # изменить содержимое
-$CustomObject.PsObject.Properties.Remove('User') # удалить Property$ScriptBlock = {Get-Service}
-$CustomObject | Add-Member -Name "TestMethod" -MemberType ScriptMethod -Value $ScriptBlock # Добавить Method
-$CustomObject | Get-Member
-$CustomObject.TestMethod()Class CustomClass {
-[string]$User
-[string]$Server
-Start([bool]$Param1) {
-If ($Param1) {Write-Host "Start Function"}}
-}
-
-$Class = New-Object -TypeName CustomClass
-$Class.User = $env:username
-$Class.Server = $env:computername
-$Class.Start(1)$obj | Add-Member -MemberType NoteProperty -Name "Type" -Value "user" -Force
-добавление объкта вывода NoteProperty
-$obj | Add-Member -MemberType NoteProperty -Name "User" -Value "admin" -Force
-изменеие содержимого для сущности объекта User
-ping $srv | Out-Null перенаправить результат вывода в
-Out-Null
Get-Process | Select-Object -Property * отобразить все
-доступные объекты вывода
-Get-Process | select -Unique "Name" удалить повторяющиеся
-значения в массиве
-Get-Process | select -ExpandProperty ProcessName
-преобразовать из объекта-коллекции в массив (вывести содержимое без
-наименовая столбца)
-(Get-Process | ? Name -match iperf).Modules список
-используемых модулей процессом
ps | Sort-Object -Descending CPU | select -first 10 ProcessName, # сортировка по CPU, вывести первых 10 значений (-first)
-@{Name="ProcessorTime"; Expression={$_.TotalProcessorTime -replace "\.\d+$"}}, # затрачено процессорного времени в минутах
-@{Name="Memory"; Expression={[string]([int]($_.WS / 1024kb))+"MB"}}, # делим байты на КБ
-@{Label="RunTime"; Expression={((Get-Date) - $_.StartTime) -replace "\.\d+$"}} # вычесть из текущего времени - время запуска, и удалить milisec$(ipconfig | Select-String IPv4) -replace ".+: " | Where-Object {$_ -match "^172."}
-узнать только IP
-$Current_IP = Get-Content $RDCMan_RDG_PATH | Select-String $RDCMan_Display_Name -Context 0,1
-получить две строки
-$Current_IP = $Current_IP.Context.DisplayPostContext[0] -replace ".+<name>|<\/name>"
-забрать только вторую строку и удалить тэги
Get-Process | ft ProcessName, StartTime -Autosize
-автоматическая группировка размера столбцов
Get-Process | Measure | select Count кол-во
-объектов
-Get-Process | Measure -Line -Word -Character кол-во строк,
-слов и Char объектов
-Get-Process | Measure-Object PM -sum | Select-Object Count,@{Name="MEM_MB"; Expression={[int]($_.Sum/1mb)}}
-кол-во процессов и общий объем занятой памяти в МБайт
Compare-Object -ReferenceObject (Get-Content -Path .\file1.txt) -DifferenceObject (Get-Content -Path .\file2.txt)
-сравнение двух файлов
-$group1 = Get-ADGroupMember -Identity "Domain Admins"
-$group2 = Get-ADGroupMember -Identity "Enterprise Admins"
-Compare-Object -ReferenceObject $group1 -DifferenceObject $group2 -IncludeEqual
-== нет изменений
-<= есть изменения в $group1
-=> есть изменения в $group2
Get-Process | Where-Object {$_.ProcessName -match "zabbix"}
-фильтрация/поиск процессов по имени свойства объекта
-Get-Process | where CPU -gt 10 | Sort-Object -Descending CPU
-вывести объекты, где значения CPU больше 10
-Get-Process | where WS -gt 200MB отобразить процессы где WS
-выше 200МБ
-Get-Service | where Name -match "zabbix" поиск службы
-Get-Service -ComputerName $srv | Where {$_.Name -match "WinRM"} | Restart-Service
-перезапустить службу на удаленном компьютере
-(Get-Service).DisplayName вывести значения свойства
-массива
-netstat -an | where {$_ -match 443}
-netstat -an | ?{$_ -match 443}
-(netstat -an) -match 443
Get-Process | Sort-Object -Descending CPU | ft обратная
-(-Descending) сортировка по CPU
-$path[-1..-10] обратная сборка массива без сортировки
Get-Process | Sort-Object -Descending CPU | select -First 10
-вывести первых 10 объектов
-Get-Process | Sort-Object -Descending CPU | select -Last 10
-вывести последних 10 объектов
$Groups = Get-CimInstance -Class Win32_PnPSignedDriver |
-Select-Object DriverProviderName, FriendlyName, Description, DriverVersion, DriverDate |
-Group-Object DriverProviderName, FriendlyName, Description, DriverVersion, DriverDate
-$(foreach ($Group in $Groups) {
- $Group.Group[0]
-}) | Format-Tablepwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File "$(FULL_CURRENT_PATH)"
%AppData%\Notepad++ themes/shortcuts.xml
<?xml version="1.0" encoding="UTF-8" ?>
-<NotepadPlus>
- <InternalCommands />
- <Macros>
- <Macro name="`+\+>" Ctrl="yes" Alt="no" Shift="no" Key="190">
- <Action type="0" message="2453" wParam="0" lParam="0" sParam="" />
- <Action type="1" message="2170" wParam="0" lParam="0" sParam="`" />
- <Action type="0" message="2451" wParam="0" lParam="0" sParam="" />
- <Action type="0" message="2451" wParam="0" lParam="0" sParam="" />
- <Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
- <Action type="1" message="2170" wParam="0" lParam="0" sParam="\" />
- <Action type="0" message="2300" wParam="0" lParam="0" sParam="" />
- </Macro>
- </Macros>
- <UserDefinedCommands>
- <Command name="PowerShell7" Ctrl="no" Alt="yes" Shift="no" Key="116">pwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File "$(FULL_CURRENT_PATH)"</Command>
- </UserDefinedCommands>
- <PluginCommands />
- <ScintillaKeys />
-</NotepadPlus>
-Parsing text to Markdown:
-Macros: FnLeft+'+FnRight+FnRight+\s\\+Down
-Replace: "# ","'"
. # Обозначает любой символ
-\ # Экранирующий символ. Символы которые экранируются: ^, [, ., $, {, *, (, ), \, +, |, ?, <, >
-^ # Начало строки
-$ # Конец строки
-\n # Новая строка
-\d # Любая цифра
-\D # Не цифра
-\w # Любая буква латиницы, цифра, или знак подчёркивания
-\W # Не латиница, не цифра, не подчёркивание
-\s # Пробел, табуляция, перенос строки
-\S # Не пробел
-\b # Граница слова. Применяется когда нужно выделить, что искомые символы являются словом, а не частью другого слова
-\B # Не граница слова
-\< # Начало слова
-\> # Конец слова
-\A # Начало текста
-\Z # Конец текста
-* # Повторитель. Означает что предшествующий символ может работать 0 и более раз
-+ # Количество предшествующего не менее 1-го.
-? # Ограничитель. Не более одного раза
-| # Или. Соединяет несколько вариантов
-() # В круглые скобки заключаются все комбинации с "или" и поиск начала и конца строк
-[ ] # В квадратных скобках задаются символы к поиску, например [a-яА-Я], или [0-9]
-[^ ] # Исключает из поиска символы указанные в квадратных скобках
-{ } # В фигурных скобках указывается точное количество вхождений
-\d{2} # Найти две цифры
-\d{2,4} # Найти две или четыре
-{4,} # Найти четыре и более
-
-^\s{1,}#.+` поиск вначале строки комментария и пробел после него 1 или больше и любое кол-во символов
--replace "1","2" замена элементов в индексах массива
-(везде где присутствует 1, заменить на 2), для удаления используется
-только первое значение
--split " " преобразовать строку в массив, разделителем
-указан пробел, которой удаляется ($url.Split(“/”)[-1])
--join " " преобразовать массив (коллекцию) в единую строку
-(string), добавить разделителем пробел
-
-like *txt* поиск по маскам wildcard, выводит значение
-на экран
--match txt поиска по шаблонам, проверка на соответствие
-содержимого текста
--match "zabbix|rpc" условия, для поиска по нескольким
-словам
--NotMatch проверка на отсутствие вхождения
-
$ip = "192.168.10.1"
-$ip -match "(\.\d{1,3})\.\d{1,2}" True
-$Matches отобразить все подходящие переменные последнего
-поиска, которые входят и не входят в группы ()
$String = "09/14/2017 12:00:27 - mtbill_post_201709141058.txt 7577_Delivered: OK"
-$String -Match ".*(?=\.txt)" | Out-Null
-$Matches[0][-4..-1] -Join ""
$string.Substring($string.IndexOf(".txt")-4, 4) 2-й
-вариант (IndexOf)`
[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 # округлить
-}$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 логическое ИЛИ
-if ((($1 -eq 1) -and ($2 -eq 2)) -or ($1 -ne 3)) {"$true"} else {"$false"}
-два условия: (если $1 = 1 и $2 = 2) или $1 не равно 3
Write-Output "First" && Write-Output "Second"
-две успешные команды выполняются
-Write-Error "Bad" && Write-Output "Second" первая
-команда завершается ошибкой, из-за чего вторая команда не
-выполняется
-Write-Error "Bad" || Write-Output "Second" первая команда
-завершается ошибкой, поэтому выполняется вторая команда
-Write-Output "First" || Write-Output "Second" первая
-команда выполнена успешно, поэтому вторая команда не выполняется
$addr = "8.8.8.8"
-$ping = "ping"
-& $ping $addr запускает текст как команду
& $ping $addr & запустить команду в фоне
-(Get-Job)[-1] | Receive-Job -Keep
\d число от 0 до 9 (20-07-2022 эквивалент: “)
-\D обозначает любой символ, кроме цифры. Удаления всех
-символов, кроме цифр: [int]$(”123 test” -replace “”)
-\w буква от “a” до “z” и от “A” до “Z” или число от 0 до
-9
-\s пробел, эквивалент: ” ”
-\n новая строка
-\b маска, определяет начало и конец целого словосочетания
-для поиска
-. обозначает любой символ, кроме новой строки
-\ экранирует любой специальны символ (метасимвол).
-Используется, если нужно указать конкретный символ, вместо специального
-({ } [ ] / + * . $ ^ | ?)
-+ повторяется 1 и более раз (+)
-{1,25} квантификатор, указывает количество повторений
-символа слева на право (от 1 до 25 раз)
-[] поиск совпадения любой буквы, например, [A-z0-9] от A до
-z и цифры от 0 до 9 (“192.168.1.1” -match “192.1[6-7][0-9]”)
^ или \A определяет начало строки. $url -replace '^','https:'` добавить в начало; \
-`$илиобозначают конец строки. $ip -replace "\d{1,3}$","0" \(?=text)поиск слова слева. Пишем слева на право от искомого (ищет только целые словосочетания) "Server:\s(.{1,30})\s(?=$username)" \(?<=text)поиск слова справа. $in_time -replace ".+(?<=Last)"
-удалить все до слова Last
-(?!text) не совпадает со словом слева
-(?<!text) не совпадает со словом справа
$test = "string"
-$test -replace ".{1}$" удалить любое кол-во символов в
-конце строки
-$test -replace "^.{1}" удалить любое кол-во символов в
-начале строки
-
$date = '12.31.2021'
-$date -replace '^(\d{2}).(\d{2})','$2.$1' поменять
-местами
-$1 содержимое первой группы в скобках
-$2 содержимое второй группы
$srv.GetType() узнать тип данных
-$srv -is [string] проверка на соответствие типа
-данных
-$srv -isnot [System.Object] проверка на
-несоответствие
-[Object] массив (BaseType:System.Array)
-[DateTime] формат времени (BaseType:System.ValueType)
-[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-разрядное)
-[String] неизменяемая строка символов Юникода фиксированной
-длины (BaseType:System.Object)
[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) возвращает наибольшее значение двух
-значений
[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 символов
-после запятой
(4164539/1MB).ToString("0.00") разделить на дважды на
-1024/1024 и округлить до 3,97
[Char] cимвол Юникода (16-разрядный)
-$char = $srv.ToCharArray() разбить строку [string] на
-массив [System.Array] из букв
-
$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 fun-switch (
-[switch]$param
-) {
-If ($param) {"yes"} else {"no"}
-}
-fun-switch -paramДвоичное Десятичное
-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
-Результат деления записывается снизу вверх
-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)
$srv.Count кол-во элементов в массиве
-$srv.Length содержит количество символом строки переменной
-[string] или количество значений (строк) объекта
-$srv.Chars(2) отобразить 3-й символ в строке
-$srv[2] отобразить 3-ю строку в массиве
$srv.Insert(0,"https://") добавить значение перед первым
-символом
-$srv.Substring(4) удалить (из всего массива) первые 4
-символа
-$srv.Remove(3) удалить из всего массива все после 3
-символа
-$string = "123" создать строку
-$int = [convert]::ToInt32($string) преобразовать строку в
-тип данных число
-[string]::Concat($text,$num) объеденить переменные в одну
-строку
-[string]::Join(":",$text,$num) объеденить используя
-разделитель
-[string]::Compare($text,$num,$true) выдает 0 при совпадении
-или 1/-1 при несовпадении, $true (без учета регистра) или $false (с учетом регистра) \
-`[string]::Equals($text,$num)производит сравнение двух строк и выдает $true при их совпадении или $false при несовпадении \[string]::IsNullOrEmpty($text)проверяет наличие строки, если строка пуста $true, если нет $false \[string]::IsNullOrWhiteSpace($text2)`
-проверяет на наличие только символов пробел, табуляция или символ новой
-строки
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]
-[DateTime]$gDate = Get-Date "$Date" преобразовать в тип DateTime
-[int32]$days=($fDate-$gDate).Days получить разницу в
-днях
-"5/7/07" -as [DateTime] преобразовать входные данные в тип
-данных DateTime
-New-TimeSpan -Start $VBRRP.CreationTimeUTC -End $VBRRP.CompletionTimeUTC
-получить разницу во времени
(Measure-Command {ping ya.ru}).TotalSeconds узнать
-только время выполнения
-(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine
-посчитать время работы последней [-1] (select -Last 1) выполненной
-команды и узнать ее статус
$start_time = Get-Date зафиксировать время до выполнения
-команды
-$end_time = Get-Date зафиксировать время по
-завершению
-$time = $end_time - $start_time высчитать время работы
-скрипта
-$min = $time.minutes
-$sec = $time.seconds
-Write-Host "$min минут $sec секунд"
-$timer = [System.Diagnostics.Stopwatch]::StartNew()
-запустить таймер
-$timer.IsRunning статус работы таймера
-$timer.Elapsed.TotalSeconds отобразить время с момента
-запуска (в секундах)
-$timer.Stop() остановить таймер
$list = 100..110 создать массив из цифр от 100 до
-110
-foreach ($srv in $list) {ping 192.168.3.$srv -n 1 -w 50}
-$srv хранит текущий элемент из $list и
-повторяет команду до последнего элемента в массиве \
-`$foreach.Currentтекущий элемент в цикле \$foreach.Reset()` обнуляет итерацию, перебор
-начнется заново, что приводит к бесконечному циклу \
-`$foreach.MoveNext()` переход к следующему элементу в цикле
100..110 | %{ping -n 1 -w 50 192.168.3.$_ > $null
-if ($LastExitCode -eq 0) {Write-Host "192.168.3.$_" -ForegroundColor green
-} else {
-Write-Host "192.168.3.$_"-ForegroundColor Red}}
-% передать цикл через конвеер (ForEach-Object)
-$_ переменная цикла и конвеера ($PSItem) \
-`gwmi Win32_QuickFixEngineering | where
-{$.InstalledOn.ToString() -match “2022”} |
-%{($.HotFixID.Substring(2))}` gwmi создает массив, вывод команды
-передается where для поиска подходящих под критерии объектов. По
-конвееру передается в цикл для удаления первых (2) символов методом
-Substring из всех объектов HotFixID.
$srv = "yandex.ru"
-$out2 = "Есть пинг"
-$out3 = "Нет пинга"
-$out = $false`` предварительно сбросить переменную, While проверяет условие до запуска цикла \While
-($out -eq
-$false){`пока условие является $true, цикл будет повторяться \$out
-= ping -n 1 -w 50 $srv` \
-`if ($out -match “ttl”) {$out = $true; $out2} else {$out = $false; $out3; sleep
-1}\}`
while ($True){`` запустить бесконечный цикл \$result = ping yandex.ru -n 1 -w 50` \
-`if ($result -match
-“TTL”){условие, при котором будет выполнен break \ `Write-Host "Сайт доступен"` \ `break
-остановит цикл
-} else {Write-Host "Сайт недоступен"; sleep 1}
-}
Try {$out = pping 192.168.3.1}
-Catch {Write-Warning "$($error[0])"} # выводит в случае ошибки (вместо ошибки)
-finally {$out = "End"} # выполняется в конце в любом случае$Error выводит все ошибки текущего сеанса
-$Error[0].InvocationInfo развернутый отчет об ошибке
-$Error.clear()
-$LASTEXITCODE результат выполнения последней команды (0 -
-успех)
-exit 1 код завершения, который возвращается
-$LASTEXITCODE
$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")
-файл будет занят процессом PowerShell
-$file | gm
-$file.ReadLine() построчный вывод
-$file.ReadToEnd() прочитать файл целиком
$file = [io.file]::ReadAllBytes("$home\desktop\powershell.jpg")
-метод открывает двоичный файл, считывает его в массив байт и закрывает
-файл
-[io.file]::WriteAllBytes("$home\desktop\tloztotk-2.jpg",$file)
-сохранить байты в файл (можно использовать для выгрузки двоичных файлов
-из БД)
Get-Content $home/desktop\test.txt -Wait аналог
-tail
-Test-Path $path проверить доступность пути
-Get-ChildItem $path -Filter *.txt -Recurse отобразить
-содержимое каталога (Alias: ls/gci/dir) и дочерних каталогов (-Recurse)
-и отфильтровать вывод
-Get-Location отобразить текущие месторасположение (Alias:
-pwd/gl)
-Set-Location $path перемещение по каталогам (Alias:
-cd/sl)
-Invoke-Item $path открыть файл (Alias: ii/start)
-Get-ItemProperty $env:userprofile\Documents\dns-list.txt | select FullName,Directory,Name,BaseName,Extension
-свойтсва файла
-Get-ItemProperty -Path $path\* | select FullName,CreationTime,LastWriteTime
-свойства файлов содержимого директории, дата их создания и последнего
-изменения
-New-Item -Path "C:\test\" -ItemType "Directory" создать
-директорию (Alias: mkdir/md)
-New-Item -Path "C:\test\file.txt" -ItemType "File" -Value "Добавить текст в файл"
-создать файл
-"test" > "C:\test\file.txt" заменить содержимое
-"test" >> "C:\test\file.txt" добавить строку в
-файл
-New-Item -Path "C:\test\test\file.txt" -Force ключ
-используется для создания отсутствующих в пути директорий или перезаписи
-файла если он уже существует
-Move-Item перемещение объектов (Alias: mv/move)
-Remove-Item "$path\" -Recurse удаление всех файлов внутри
-каталога, без запроса подверждения (Alias: rm/del)
-Remove-Item $path -Recurse -Include "*.txt","*.temp" -Exclude "log.txt"
-удалить все файлы с расширением txt и temp (Array),
-кроме log.txt
-Rename-Item "C:\test\*.*" "*.jpg" переименовать файлы по
-маске (Alias: ren)
-Copy-Item копирование файлов и каталогов (Alias:
-cp/copy)
-Copy-Item -Path "\\server-01\test" -Destination "C:\" -Recurse
-копировать директорию с ее содержимым (-Recurse)
-Copy-Item -Path "C:\*.txt" -Destination "C:\test\" знак ’'
-в конце Destination используется для переноса папки внутрь указанной,
-отсутствие, что это новое имя директории
-Copy-Item -Path "C:\*" -Destination "C:\test\" -Include '*.txt','*.jpg'
-копировать объекты с указанным расширением (Include)
-Copy-Item -Path "C:\*" -Destination "C:\test\" -Exclude '*.jpeg'
-копировать объекты, за исключением файлов с расширением (Exclude)
-$log = Copy-Item "C:\*.txt" "C:\test\" -PassThru вывести
-результат копирования (логирование) в переменную, можно забирать строки
-с помощью индексов $log[0].FullName
$ls = Get-Item $env:TEMP\*.tmp # считать все файлы с указанным расширением
-$date = (Get-Date).AddDays(-14)
-foreach ($l in $ls) {
- if ($l.LastWriteTime -le $date) {
- $l.FullName
- Remove-Item $l.FullName -Recurse
- }
-}Get-Filehash -Algorithm SHA256 "$env:USERPROFILE\Documents\RSA.conf.txt"
Compress-Archive -Path $sourcepath -DestinationPath $dstpath -CompressionLevel Optimal
-архивировать
-Expand-Archive .\powerlinefonts.zip разархивировать
$Cred = Get-Credential сохраняет креды в переменные
-$Cred.Username и $Cred.Password \
-`$Cred.GetNetworkCredential().passwordизвлечь пароль \cmdkey
-/generic:“TERMSRV/$srv"
-/user:"$username” /pass:“$password"`
-добавить указанные креды аудентификации на на терминальный сервер для
-подключения без пароля \
-`mstsc /admin /v:$srvавторизоваться \cmdkey
-/delete:”TERMSRV/$srv"` удалить добавленные
-креды аудентификации из системы \
-`rundll32.exe keymgr.dll,KRShowKeyMgr` хранилище Stored User Names and
-Password \
-`Get-Service VaultSvc` служба для работы Credential Manager \
-`Install-Module CredentialManager` установить модуль управления
-Credential Manager к хранилищу PasswordVault из PowerShell \
-`[System.Net.ServicePointManager]::SecurityProtocol =
-[System.Net.SecurityProtocolType]'Tls11,Tls12'` для устаноки модуля \
-`Get-StoredCredential` получить учетные данные из хранилища Windows
-Vault \
-`Get-StrongPassword` генератор пароля \
-`New-StoredCredential -UserName test -Password "123456"` добавить
-учетную запись \
-`Remove-StoredCredential` удалить учетную запись \
-`$Cred = Get-StoredCredential | where {$_.username -match "admin"}` \
-`$pass = $cred.password` \
-`$BSTR =
-[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)` \
-`[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)`
Get-Service -cn $srv | Out-GridView -Title "Service $srv" -OutputMode Single –PassThru | Restart-Service
-перезапустить выбранную службу
Read-Host –AsSecureString | ConvertFrom-SecureString | Out-File "$env:userprofile\desktop\password.txt"
-писать в файл. Преобразовать пароль в формат SecureString с
-использованием шифрования Windows Data Protection API (DPAPI)
$password = gc "$env:userprofile\desktop\password.txt" | ConvertTo-SecureString
-читать хэш пароля из файла с помощью ключей, хранящихся в профиле
-текущего пользователя, который невозможно прочитать на другом
-копьютере
$AESKey = New-Object Byte[] 32
-[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey)
-$AESKey | Out-File "C:\password.key"
-$Cred.Password | ConvertFrom-SecureString -Key (Get-Content "C:\password.key") | Set-Content "C:\password.txt"
-сохранить пароль в файл используя внешний ключ
-$pass = Get-Content "C:\password.txt" | ConvertTo-SecureString -Key (Get-Content "\\Server\Share\password.key")
-расшифровать пароль на втором компьютере
Get-WinEvent -ListLog * отобразить все доступные журналы
-логов
-Get-WinEvent -ListLog * | where RecordCount -ne 0 | where RecordCount -ne $null | sort -Descending RecordCount
-отобразить не пустые журналы с сортировкой по кол-ву записей
-Get-WinEvent -ListProvider * | ft отобразить всех
-провайдеров приложений
-Get-WinEvent -ListProvider GroupPolicy найти в какой журнал
-LogLinks {Application} пишутся логи приложения
-Get-WinEvent -ListProvider *smb*
-Get-WinEvent -ListLog * | where logname -match SMB | sort -Descending RecordCount
-найти все журналы по имени
-Get-WinEvent -LogName "Microsoft-Windows-SmbClient/Connectivity"
-Get-WinEvent -ListProvider *firewall*
Get-WinEvent -FilterHashtable @{LogName="Security";ID=4624}
-найти логи по ID в журнале Security
-Get-WinEvent -FilterHashtable @{LogName="System";Level=2}
-найти все записи ошибки (1 - критический, 3 - предупреждение, 4 -
-сведения)
-Get-WinEvent -FilterHashtable @{LogName="System";Level=2;ProviderName="Service Control Manager"}
-отфильтровать по имени провайдера
([xml](Get-WinEvent -FilterHashtable @{LogName="Security";ID=4688} -MaxEvents 1).ToXml()).Event.EventData.Data
-отобразить все свойства, хранимые в EventData (Message)
-Get-WinEvent -FilterHashtable @{logname="security";ID=4688} -MaxEvents 1 | select timecreated,{$_.Properties[5].value}
-отфильтровать время события и имя запущенного процесса
$query = '
-<QueryList>
- <Query Id="0" Path="Security">
- <Select Path="Security">
- *[System[EventID=4688]] and
- *[EventData[Data[@Name="NewProcessName"]="C:\Windows\System32\autochk.exe" or Data[@Name="NewProcessName"]="C:\Windows\System32\services.exe"]]
- </Select>
- </Query>
-</QueryList>
-'
-
-Get-WinEvent -LogName Security -FilterXPath $query
-$query = '
-<QueryList>
- <Query Id="0" Path="System">
- <Select Path="System">
- *[
- System[
- EventID=41 or
- EventID=1074 or
- EventID=1076 or
- EventID=6005 or
- EventID=6006 or
- EventID=6008 or
- EventID=6009 or
- EventID=6013
- ]
- ]
- </Select>
- </Query>
-</QueryList>
-'
-Get-WinEvent -LogName System -FilterXPath $query
-
-41 ` Система была перезагружена без корректного завершения работы.
-1074` Система была корректного выключена пользователем или процессом.
-1076` Следует за Event ID 6008 и означает, что первый пользователь (с правом выключения системы) подключившийся к серверу после неожиданной перезагрузки или выключения, указал причину этого события.
-6005` Запуск "Журнала событий Windows" (Event Log). Указывает на включение системы.
-6006` Остановка «Журнала событий Windows». Указывает на выключение системы.
-6008` Предыдущее выключение системы было неожиданным.
-6009` Версия операционной системы, зафиксированная при загрузке системы.
-6013` Время работы системы (system uptime) в секундах.
-$srv = "localhost"
-$FilterXPath = '<QueryList><Query Id="0"><Select>*[System[EventID=21]]</Select></Query></QueryList>'
-$RDPAuths = Get-WinEvent -ComputerName $srv -LogName "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" -FilterXPath $FilterXPath
-[xml[]]$xml = $RDPAuths | Foreach {$_.ToXml()}
-$EventData = Foreach ($event in $xml.Event) {
-New-Object PSObject -Property @{
-"Connection Time" = (Get-Date ($event.System.TimeCreated.SystemTime) -Format 'yyyy-MM-dd hh:mm K')
-"User Name" = $event.UserData.EventXML.User
-"User ID" = $event.UserData.EventXML.SessionID
-"User Address" = $event.UserData.EventXML.Address
-"Event ID" = $event.System.EventID
-}}
-$EventData | ftGet-EventLog -List отобразить все корневые журналы логов
-и их размер
-Clear-EventLog Application очистить логи указанного
-журнала
-Get-EventLog -LogName Security -InstanceId 4624 найти логи
-по ID в журнале Security
$days = 5
-$obj = @()
-$fw = Get-WinEvent "Microsoft-Windows-Windows Firewall With Advanced Security/Firewall"
-foreach ($temp_fw in $fw) {
-if ($temp_fw.id -eq 2097) { # 2004
- $type = "Added Rule"
-}
-elseif ($temp_fw.id -eq 2006) {
- $type = "Deleted Rule"
-}
-$port = $temp_fw.Properties[7] | select -ExpandProperty value
-$name = $temp_fw.Properties[1] | select -ExpandProperty value
-$obj += [PSCustomObject]@{
- Time = $temp_fw.TimeCreated;
- Type = $type;
- Port = $port;
- Name = $name}
-}
-$obj | Where-Object time -gt (Get-Date).AddDays(-$days)New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol TCP -LocalPort 135
-открыть in-порт
-Get-NetFirewallRule | where DisplayName -match kms | select *
-найти правило по имени
-Get-NetFirewallPortFilter | where LocalPort -like 80 найти
-действующие правило по номеру порта
Get-NetFirewallRule -Enabled True -Direction Inbound | select -Property DisplayName,
-@{Name='Protocol';Expression={($_ | Get-NetFirewallPortFilter).Protocol}},
-@{Name='LocalPort';Expression={($_ | Get-NetFirewallPortFilter).LocalPort}},
-@{Name='RemotePort';Expression={($_ | Get-NetFirewallPortFilter).RemotePort}},
-@{Name='RemoteAddress';Expression={($_ | Get-NetFirewallAddressFilter).RemoteAddress}},
-Enabled,ProfileInstall-Module Firewall-Manager
-Export-FirewallRules -Name * -CSVFile $home\documents\fw.csv
--Inbound -Outbound -Enabled -Disabled -Allow -Block (фильтр правил для
-экспорта)
-Import-FirewallRules -CSVFile $home\documents\fw.csv
Import-Module Defender
-Get-Command -Module Defender
-Get-MpComputerStatus
-(Get-MpComputerStatus).AntivirusEnabled статус работы
-антивируса
$session = NewCimSession -ComputerName hostname
-подключиться к удаленному компьютеру, используется WinRM
-Get-MpComputerStatus -CimSession $session | fl fullscan*
-узнать дату последнего сканирования на удаленном компьютере
Get-MpPreference настройки
-(Get-MpPreference).ScanPurgeItemsAfterDelay время хранения
-записей журнала защитника в днях
-Set-MpPreference -ScanPurgeItemsAfterDelay 30 изменить
-время хранения
-ls "C:\ProgramData\Microsoft\Windows Defender\Scans\History"
-Get-MpPreference | select disable* отобразить статус всех
-видов проверок/сканирований
-Set-MpPreference -DisableRealtimeMonitoring $true отключить
-защиту Defender в реальном времени (использовать только ручное
-сканирование)
-Set-MpPreference -DisableRemovableDriveScanning $false
-включить сканирование USB накопителей
-Get-MpPreference | select excl* отобразить список всех
-исключений
-(Get-MpPreference).ExclusionPath
-Add-MpPreference -ExclusionPath C:\install добавить
-директорию в исключение
-Remove-MpPreference -ExclusionPath C:\install удалить из
-исключения
-New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name DisableAntiSpyware -Value 1 -PropertyType DWORD -Force
-полностью отключить Windows Defender
Set-MpPreference -SignatureDefinitionUpdateFileSharesSources \\FileShare1\Updates
-для обновления из сетевой папки нужно предварительно скачать файлы с
-сигнатурами баз с сайта
-https://www.microsoft.com/security/portal/definitions/adl.aspx и
-поместить в сетевой каталог
-Update-MpSignature -UpdateSource FileShares изменить
-источник обновлений (MicrosoftUpdateServer – сервера обновлений MS в
-интернете, InternalDefinitionUpdateServer — внутренний WSUS
-сервер)
-Update-MpSignature обновить сигнатуры
Start-MpScan -ScanType QuickScan быстрая проверка или
-FullScan
-Start-MpScan -ScanType FullScan -AsJob
-Set-MpPreference -RemediationScheduleDay 1-7 выбрать дни,
-начиная с воскресенья или 0 каждый день, 8 - сбросить
-Set-MpPreference -ScanScheduleQuickScanTime 14:00:00
-Start-MpScan -ScanType CustomScan -ScanPath "C:\Program Files"
-сканировать выбранную директорию
Get-MpThreat история угроз и тип угрозы (ThreatName:
-HackTool/Trojan)
-Get-MpThreatCatalog список известных видов угроз
-Get-MpThreatDetection история защиты (активных и прошлые) и
-ID угрозы
-Get-MpThreat -ThreatID 2147760253
ls "C:\ProgramData\Microsoft\Windows Defender\Quarantine\"
-директория хранения файлов в карантине
-cd "C:\Program Files\Windows Defender\"
-.\MpCmdRun.exe -restore -name $ThreatName восстановить файл
-из карантина
-.\MpCmdRun.exe -restore -filepath $path_file
Get-Hotfix | Sort-Object -Descending InstalledOn список
-установленных обновлений (информация из cimv2)
-Get-Hotfix -Description "Security update"
-Get-CimInstance Win32_QuickFixEngineering
-Get-Command -Module WindowsUpdate
-Get-WindowsUpdateLog
-Get-Service uhssvc служба Microsoft Health Update Tools,
-которая отвечает за предоставление обновлений
Install-Module -Name PSWindowsUpdate -Scope CurrentUser
-Import-Module PSWindowsUpdate
-Get-Command -Module PSWindowsUpdate
-Get-WindowsUpdate список обновлений для скачать и
-установить с сервера WSUS или Microsoft Update
-Get-WindowsUpdate -Download загрузить все обновления
-Get-WindowsUpdate –Install установить все обновления
-Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -IgnoreReboot
-установить все обновления без перезагрузки
-Get-WindowsUpdate -KBArticleID KB2267602, KB4533002 -Install
-Get-WindowsUpdate -KBArticleID KB2538243 -Hide скрыть
-обновления, что бы они никогда не устанавливались
-Get-WindowsUpdate –IsHidden отобразить скрытые обновления
-(Hide-WindowsUpdate)
-Remove-WindowsUpdate -KBArticleID KB4011634 -NoRestart
-удалить обновление
-Uninstall-WindowsUpdate удалить обновление
-Add-WUServiceManager регистрация сервера обновления
-(Windows Update Service Manager)
-Enable-WURemoting включить правила Windows Defender,
-разрешающие удаленное использование командлета PSWindowsUpdate
-Get-WUApiVersion версия Windows Update Agent
-Get-WUHistory список всех установленных обновлений (история
-обновлений)
-Get-WUHistory | Where-Object {$_.Title -match "KB4517389"}
-поиск обновления
-Get-WULastResults даты последнего поиска и установки
-обновлений
-Get-WURebootStatus проверить, нужна ли перезагрузка для
-применения конкретного обновления
-Get-WUServiceManager выводит источники обновлений
-Get-WUInstallerStatus статус службы Windows Installer
-Remove-WUServiceManager отключить Windows Update Service
-Manager
Get-Command -Module Dism -Name *Driver*
-Export-WindowsDriver -Online -Destination C:\Users\Lifailon\Documents\Drivers\
-извлечение драйверов из текущей системы (C:), выгружает список файлов,
-которые необходимы для установки драйвера (dll,sys,exe) в соответствии
-со списком файлов, указанных в секции [CopyFiles] inf-файла
-драйвера.
-Export-WindowsDriver -Path C:\win_image -Destination C:\drivers
-извлечь драйвера из офлайн образа Windows, смонтированного в каталог
-c:_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:). Вывод работы логируется в C:с тегом
-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
-восстановление в оффлайн режиме из образа по номеру индекса
$Trigger = New-ScheduledTaskTrigger -At 01:00am -Daily
-1:00 ночи
-$Trigger = New-ScheduledTaskTrigger –AtLogon запуск при
-входе пользователя в систему
-$Trigger = New-ScheduledTaskTrigger -AtStartup при запуске
-системы
-$User = "NT AUTHORITY\SYSTEM"
-$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "$home\Documents\DNS-Change-Tray-1.3.ps1"
-$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -WindowStyle Hidden -File $home\Documents\DNS-Change-Tray-1.3.ps1"
-Register-ScheduledTask -TaskName "DNS-Change-Tray-Startup" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force
Get-ScheduledTask | ? state -ne Disabled список всех
-активных заданий
-Start-ScheduledTask DNS-Change-Tray-Startup запустить
-задание немедленно
-Get-ScheduledTask DNS-Change-Tray-Startup | Disable-ScheduledTask
-отключить задание
-Get-ScheduledTask DNS-Change-Tray-Startup | Enable-ScheduledTask
-включить задание
-Unregister-ScheduledTask DNS-Change-Tray-Startup удалить
-задание
-Export-ScheduledTask DNS-Change-Tray-Startup | Out-File $home\Desktop\Task-Export-Startup.xml
-экспортировать задание в xml
-Register-ScheduledTask -Xml (Get-Content $home\Desktop\Task-Export-Startup.xml | Out-String) -TaskName "DNS-Change-Tray-Startup"
Test-Connection -Count 1 $srv1, $srv2 отправить
-icmp-пакет двум хостам
-Test-Connection $srv -ErrorAction SilentlyContinue не
-выводить ошибок, если хост не отвечает
-Test-Connection -Source $srv1 -ComputerName $srv2 пинг с
-удаленного компьютера
function Test-PingNetwork {
-param (
- [Parameter(Mandatory,ValueFromPipeline)][string[]]$Network,
- [ValidateRange(100,10000)][int]$Timeout = 100
-)
-$ping = New-Object System.Net.NetworkInformation.Ping
-$Network = $Network -replace "0$"
-$net = @()
-foreach ($r in @(1..254)) {
- $net += "$network$r"
-}
-foreach ($n in $net) {
- $ping.Send($n, $timeout) | select @{Name="Address"; Expression={$n -replace ".+\."}}, Status
-}
-}Test-PingNetwork -Network 192.168.3.0
-Test-PingNetwork -Network 192.168.3.0 -Timeout 1000
Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'"
-Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'" | Format-Table -Property Address,ResponseTime,StatusCode -Autosize
-0 - успех
-'127.0.0.1','8.8.8.8' | ForEach-Object -Process {Get-CimInstance -Class Win32_PingStatus -Filter ("Address='$_'") | Select-Object -Property Address,ResponseTime,StatusCode}
-$ips = 1..254 | ForEach-Object -Process {'192.168.1.' + $_}
-сформировать массив из ip-адресов подсети
Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=$true"
-отобразить адаптеры с включенным DHCP
-$wql = 'SELECT * from Win32_NetworkAdapterConfiguration WHERE IPEnabled=True and DHCPEnabled=False'
-Invoke-CimMethod -MethodName ReleaseDHCPLease -Query $wql
-включение DHCP на всех адаптерах
-Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName ReleaseDHCPLeaseAll
-отменить аренду адресов DHCP на всех адаптерах
-Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName RenewDHCPLeaseAll
-обновить аренду адресов DHCP на всех адаптерах
tnc $srv -p 5985
-tnc $srv -CommonTCPPort WINRM HTTP,RDP,SMB
-tnc ya.ru –TraceRoute -Hops 2 TTL=2
-tnc ya.ru -DiagnoseRouting маршрутизация до хоста, куда
-(DestinationPrefix: 0.0.0.0/0) через (NextHop: 192.168.1.254)
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")
Get-NetIPConfiguration
-Get-NetIPConfiguration -InterfaceIndex 14 -Detailed
Get-NetAdapter
-Set-NetIPInterface -InterfaceIndex 14 -Dhcp Disabled
-отключить DHCP
-Get-NetAdapter -InterfaceIndex 14 | New-NetIPAddress –IPAddress 192.168.3.99 -DefaultGateway 192.168.3.1 -PrefixLength 24
-задать/добавить статический IP-адрес
-Set-NetIPAddress -InterfaceIndex 14 -IPAddress 192.168.3.98
-изменить IP-адреас на адаптере
-Remove-NetIPAddress -InterfaceIndex 14 -IPAddress 192.168.3.99
-удалить IP-адрес на адаптере
-Set-NetIPInterface -InterfaceIndex 14 -Dhcp Enabled
-включить DHCP
Get-DNSClientServerAddress
-Set-DNSClientServerAddress -InterfaceIndex 14 -ServerAddresses 8.8.8.8
Get-DnsClientCache отобразить кэшированные записи
-клиента DNS
-Clear-DnsClientCache очистить кэш
Get-NetAdapterBinding -Name Ethernet -IncludeHidden -AllBindings
-Get-NetAdapterBinding -Name "Беспроводная сеть" -DisplayName "IP версии 6 (TCP/IPv6)" | Set-NetAdapterBinding -Enabled $false
-отключить IPv6 на адаптере
Get-NetTCPSetting
-Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CongestionProvider DCTCP
-Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CwndRestart True
-Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -ForceWS Disabled
netstat -anop tcp -n/-f/-b
-Get-NetTCPConnection -State Established,Listen | ? LocalPort -Match 3389
-Get-NetTCPConnection -State Established,Listen | ? RemotePort -Match 22
-Get-NetUDPEndpoint | ? LocalPort -Match 514 netstat -ap
-udp`
netstat -se
-Get-NetAdapterStatistics
$env:computername
-hostname.exe
-(Get-CIMInstance CIM_ComputerSystem).Name
-(New-Object -ComObject WScript.Network).ComputerName
-[System.Environment]::MachineName
-[System.Net.Dns]::GetHostName()
ipconfig /all | Select-String "физ" grep
-Get-NetNeighbor -AddressFamily IPv4
function Get-ARP {
-Param (
-$proxy,
-$search
-)
-if (!$proxy) {
-$arp = arp -a
-}
-if ($proxy) {
-$arp = icm $proxy {arp -a}
-}
-$mac = $arp[3..260]
-$mac = $mac -replace "^\s\s"
-$mac = $mac -replace "\s{1,50}"," "
-$mac_coll = New-Object System.Collections.Generic.List[System.Object]
-foreach ($m in $mac) {
-$smac = $m -split " "
-$mac_coll.Add([PSCustomObject]@{
-IP = $smac[0];
-MAC = $smac[1];
-Type = $smac[2]
-})
-}
-if ($search) {
-if ($search -NotMatch "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") {
-#$ns = nslookup $search
-#$ns = $ns[-2]
-#$global:ns = $ns -replace "Address:\s{1,10}"
-$rdns = Resolve-DnsName $search -ErrorAction Ignore
-$ns = $rdns.IPAddress
-if ($ns -eq $null) {
-return
-}
-} else {
-$ns = $search
-}
-$mac_coll = $mac_coll | ? ip -Match $ns
-}
-$mac_coll
-}Get-ARP -search 192.168.3.100
-Get-ARP -search 192.168.3.100 -proxy dc-01
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber"
-отобразить номер текущего RDP порта
-Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber" -Value "3390"
-изменить RDP-порт
-$(Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\" -Name "fDenyTSConnections").fDenyTSConnections
-если 0, то включен
-Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\" -Name "fDenyTSConnections" -Value 0
-включить RDP
-reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
-(gcim -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).SetAllowTSConnections(0)
-включить RDP (для Windows Server)
-Get-Service TermService | Restart-Service -Force
-перезапустить rdp-службу
-New-NetFirewallRule -Profile Any -DisplayName "RDP 3390" -Direction Inbound -Protocol TCP -LocalPort 3390
-открыть RDP-порт
auditpol /get /category:* отобразить все политики
-аудита
-auditpol /get /category:Вход/выход отобразить локальные
-политики аудита для Входа и Выхода из системы
-auditpol /set /subcategory:"Вход в систему" /success:enable /failure:enable
-включить локальные политики - Аудит входа в систему
-auditpol /set /subcategory:"Выход из системы" /success:enable /failure:enable
$url = $($(Invoke-RestMethod https://api.github.com/repos/DigitalRuby/IPBan/releases/latest).assets | Where-Object name -match ".+win.+x64.+").browser_download_url
-получить ссылку для загрузки последней версии
-$version = $(Invoke-RestMethod https://api.github.com/repos/DigitalRuby/IPBan/releases/latest).tag_name
-получить номер последней версии
-$path = "$home\Documents\ipban-$version" путь для
-установки
-Invoke-RestMethod $url -OutFile "$home\Downloads\IPBan-$version.zip"
-скачать дистрибутив
-Expand-Archive "$home\Downloads\ipban-$version.zip" -DestinationPath $path
-разархивировать в путь для установки
-Remove-Item "$home\Downloads\ipban-$version.zip" удалить
-дистрибутив
-sc create IPBan type=own start=delayed-auto binPath="$path\DigitalRuby.IPBan.exe" DisplayName=IPBan
-создать службу
-Get-Service IPBan статус службы
-$conf = $(Get-Content "$path\ipban.config") читаем
-конфигурацию
-$conf = $conf -replace '<add key="Whitelist" value=""/>','<add key="Whitelist" value="192.168.3.0/24"/>'
-добавить в белый лист домашнюю сеть для исключения
-$conf = $conf -replace '<add key="ProcessInternalIPAddresses" value="false"/>','<add key="ProcessInternalIPAddresses" value="true"/>'
-включить обработку локальных (внутренних) ip-адресов
-$conf = $conf -replace '<add key="FailedLoginAttemptsBeforeBanUserNameWhitelist" value="20"/>','<add key="FailedLoginAttemptsBeforeBanUserNameWhitelist" value="5"/>'
-указать количество попыток подключения до блокировки
-$conf = $conf -replace '<add key="ExpireTime" value="01:00:00:00"/>','<add key="ExpireTime" value="00:01:00:00"/>'
-задать время блокировки 1 час
-$conf > "$path\ipban.config" обновить конфигурацию
-Get-Service IPBan | Start-Service запустить службу
Get-NetFirewallRule | Where-Object DisplayName -Match "IPBan" | ForEach-Object {
- $Name = $_.DisplayName
- Get-NetFirewallAddressFilter -AssociatedNetFirewallRule $_ | Select-Object @{Name="Name"; Expression={$Name}},LocalIP,RemoteIP
-} # отобразить область применения правил Брандмауэра для IPBan
-Get-Content -Wait "$path\logfile.txt" читать лог
-Get-Service IPBan | Stop-Service остановить службу
-sc delete IPBan удалить службу
shutdown /r /o перезагрузка в безопасный режим
-shutdown /s /t 600 /c "Power off after 10 minutes"
-выключение
-shutdown /s /f принудительное закрытие приложений
-shutdown /a отмена
-shutdown /r /t 0 /m \\192.168.3.100
-Restart-Computer -ComputerName 192.168.3.100 -Protocol WSMan
-через WinRM
-Restart-Computer –ComputerName 192.168.3.100 –Force через
-WMI
-Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\Start\HideShutDown" -Name "value" -Value 1
-скрыть кнопку выключения
-Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\Start\HideRestart" -Name "value" -Value 1
-скрыть кнопку перезагрузки
function Start-Shutdown {
- <#
- .SYNOPSIS
- Module for shutdown and restart the computer at a specified time
- .DESCRIPTION
- Example:
- # Start-Shutdown -Time "18:00"
- # Start-Shutdown -Restart -Time "18:00"
- # Start-Shutdown -Cancel
- .LINK
- https://github.com/Lifailon/PS-Commands
- #>
- param(
- [string]$Time,
- [switch]$Restart,
- [switch]$Cancel
- )
- if ($Time) {
- $currentDateTime = Get-Date
- $shutdownTime = Get-Date $Time
- if ($shutdownTime -lt $currentDateTime) {
- $shutdownTime = $shutdownTime.AddDays(1)
- }
- $timeUntilShutdown = $shutdownTime - $currentDateTime
- $secondsUntilShutdown = [math]::Round($timeUntilShutdown.TotalSeconds)
- }
- if ($Cancel) {
- Start-Process -FilePath "shutdown.exe" -ArgumentList "/a"
- } elseif ($Restart) {
- Write-Host "The computer will restart after $($timeUntilShutdown.Hours) hours and $($timeUntilShutdown.Minutes) minutes."
- Start-Process -FilePath "shutdown.exe" -ArgumentList "/r", "/f", "/t", "$secondsUntilShutdown"
- } else {
- Write-Host "The computer will shutdown after $($timeUntilShutdown.Hours) hours and $($timeUntilShutdown.Minutes) minutes."
- Start-Process -FilePath "shutdown.exe" -ArgumentList "/s", "/f", "/t", "$secondsUntilShutdown"
- }
-}Get-Command -Module Microsoft.PowerShell.LocalAccounts
-Get-LocalUser список пользователей
-Get-LocalGroup список групп
-New-LocalUser "1C" -Password $Password -FullName "1C Domain"
-создать пользователя
-Set-LocalUser -Password $Password 1C изменить пароль
-Add-LocalGroupMember -Group "Administrators" -Member "1C"
-добавить в группу Администраторов
-Get-LocalGroupMember "Administrators" члены группы
@("vproxy-01","vproxy-02","vproxy-03") | %{
-icm $_ {Add-LocalGroupMember -Group "Administrators" -Member "support4"}
-icm $_ {Get-LocalGroupMember "Administrators"}
-}Get-SmbServerConfiguration
-Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
-отключить протокол SMB v1
-Get-WindowsFeature | Where-Object {$_.name -eq "FS-SMB1"} | ft Name,Installstate
-модуль ServerManager, проверить установлен ли компонент SMB1
-Install-WindowsFeature FS-SMB1 установить SMB1
-Uninstall-WindowsFeature –Name FS-SMB1 –Remove удалить SMB1
-клиента (понадобится перезагрузка)
-Get-WindowsOptionalFeature -Online модуль DISM, для работы
-с компонентами Windows
-Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -Remove
-удалить SMB1
-Set-SmbServerConfiguration –AuditSmb1Access $true включить
-аудит SMB1
-Get-SmbConnection список активных сессий и используемая
-версия SMB (Dialect)
-Get-SmbOpenFile | select ClientUserName,ClientComputerName,Path,SessionID
-список открытых файлов
-Get-SmbShare список сетевых папок
-New-SmbShare -Name xl-share -Path E:\test создать новую
-общую сетевую папку (расшарить)
--EncryptData $True включить шифрование SMB
--Description имя в сетевом окружении
--ReadAccess "domain\username" доступ на чтение
--ChangeAccess доступ на запись
--FullAccess полный доступ
--NoAccess ALL нет прав
--FolderEnumerationMode [AccessBased | Unrestricted]
-позволяет скрыть в сетевой папке объекты, на которых у пользователя нет
-доступа с помощью Access-Based Enumeration (ABE)
-Get-SmbShare xl-share | Set-SmbShare -FolderEnumerationMode AccessBased
-ключить ABE для всех расшаренных папок
-Remove-SmbShare xl-share -force удалить сетевой доступ
-(шару)
-Get-SmbShareAccess xl-share вывести список доступов
-безопасности к шаре
-Revoke-SmbShareAccess xl-share -AccountName Everyone –Force
-удалить группу из списка доступов
-Grant-SmbShareAccess -Name xl-share -AccountName "domain\XL-Share" -AccessRight Change –force
-изменить/добавить разрешения на запись (Full,Read)
-Grant-SmbShareAccess -Name xl-share -AccountName "все" -AccessRight Change –force
-Block-SmbShareAccess -Name xl-share -AccountName "domain\noAccess" -Force
-принудительный запрет
-New-SmbMapping -LocalPath X: -RemotePath \\$srv\xl-share -UserName support4 -Password password –Persistent $true
-подключить сетевой диск
--Persistent восстановление соединения после отключения
-компьютера или сети
--SaveCredential позволяет сохранить учетные данные
-пользователя для подключения в диспетчер учетных данных Windows
-Credential Manager
-Stop-Process -Name "explorer" | Start-Process -FilePath "C:\Windows\explorer.exe"
-перезапустить процесс для отображения в проводнике
-Get-SmbMapping список подключенных сетевых дисков
-Remove-SmbMapping X: -force отмонтировать сетевой
-диск
-$CIMSession = New-CIMSession –Computername $srv создать
-сеанс CIM (аудентификация на SMB)
-Get-SmbOpenFile -CIMSession $CIMSession | select ClientUserName,ClientComputerName,Path | Out-GridView -PassThru | Close-SmbOpenFile -CIMSession $CIMSession -Confirm:$false –Force
-закрыть файлы (открыть к ним сетевой доступ)
(Get-Acl \\$srv\xl-share).access доступ ACL на уровне
-NTFS
-Get-Acl C:\Drivers | Set-Acl C:\Distr скопировать NTFS
-разрешения с одной папки и применить их на другую
Install-Module -Name NTFSSecurity -force
-Get-Item "\\$srv\xl-share" | Get-NTFSAccess
-Add-NTFSAccess -Path "\\$srv\xl-share" -Account "domain\xl-share" -AccessRights Fullcontrol -PassThru
-добавить
-Remove-NTFSAccess -Path "\\$srv\xl-share" -Account "domain\xl-share" -AccessRights FullControl -PassThru
-удалить
-Get-ChildItem -Path "\\$srv\xl-share" -Recurse -Force | Clear-NTFSAccess
-удалить все разрешения, без удаления унаследованных разрешений
-Get-ChildItem -Path "\\$srv\xl-share" -Recurse -Force | Enable-NTFSAccessInheritance
-включить NTFS наследование для всех объектов в каталоге
Get-Command -Module Storage
-Get-Disk список логических дисков
-Get-Partition отобразить разделы на всех дисках
-Get-Volume список логичких разделов
-Get-PhysicalDisk список физических дисков
-Initialize-Disk 1 –PartitionStyle MBR инициализировать
-диск
-New-Partition -DriveLetter D –DiskNumber 1 -Size 500gb
-создать раздел (выделить все место -UseMaximumSize)
-Format-Volume -DriveLetter D -FileSystem NTFS -NewFileSystemLabel Disk-D
-форматировать раздел
-Set-Partition -DriveLetter D -IsActive $True сделать
-активным
-Remove-Partition -DriveLetter D –DiskNumber 1 удалить
-раздел
-Clear-Disk -Number 1 -RemoveData очистить диск
-Repair-Volume –driveletter C –Scan Check disk
-Repair-Volume –driveletter C –SpotFix
-Repair-Volume –driverletter C -Scan –Cimsession $CIMSession
New-IscsiVirtualDisk -Path D:\iSCSIVirtualDisks\iSCSI2.vhdx -Size 20GB
-создать динамический vhdx-диск (для фиксированного размера
--UseFixed)
-New-IscsiServerTarget -TargetName iscsi-target-2 -InitiatorIds "IQN:iqn.1991-05.com.microsoft:srv3.contoso.com"
-создать Target
-Get-IscsiServerTarget | fl TargetName, LunMappings
-Connect-IscsiTarget -NodeAddress "iqn.1995-05.com.microsoft:srv2-iscsi-target-2-target" -IsPersistent $true
-подключиться инициатором к таргету
-Get-IscsiTarget | fl
-Disconnect-IscsiTarget -NodeAddress "iqn.1995-05.com.microsoft:srv2-iscsi-target-2-target" -Confirm:$false
-отключиться
DISM.exe /Online /add-capability /CapabilityName:Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 /CapabilityName:Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0
-Add-WindowsCapability –online –Name Rsat.Dns.Tools~~~~0.0.1.0
-Add-WindowsCapability -Online -Name Rsat.DHCP.Tools~~~~0.0.1.0
-Add-WindowsCapability –online –Name Rsat.FileServices.Tools~~~~0.0.1.0
-Add-WindowsCapability -Online -Name Rsat.WSUS.Tools~~~~0.0.1.0
-Add-WindowsCapability -Online -Name Rsat.CertificateServices.Tools~~~~0.0.1.0
-Add-WindowsCapability -Online -Name Rsat.RemoteDesktop.Services.Tools~~~~0.0.1.0
-Get-WindowsCapability -Name RSAT* -Online | Select-Object -Property DisplayName, State
-отобразить список установленных компанентов
$Session = New-PSSession -ComputerName $srv -Credential
-$cred\Export-PSsession -Session $Session -Module
-ActiveDirectory -OutputModule
-ActiveDirectoryэкспортировать модуль из удаленной сесси (например, с DC) \Remove-PSSession
--Session $Session\Import-Module
-ActiveDirectory\Get-Command -Module ActiveDirectory`
$d0 = $env:userdnsdomain
-$d0 = $d0 -split "\."
-$d1 = $d0[0]
-$d2 = $d0[1]
-$group = [ADSI]"LDAP://OU=Domain Controllers,DC=$d1,DC=$d2"
-$group | select *
$Local_User = [ADSI]"WinNT://./Администратор,user"
-$Local_User | Get-Member
-$Local_User.Description
-$Local_User.LastLogin время последней авторизации
-локального пользователя
$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher
-$ldapsearcher.SearchRoot = "LDAP://OU=Domain Controllers,DC=$d1,DC=$d2"
-$ldapsearcher.Filter = "(objectclass=computer)"
-$dc = $ldapsearcher.FindAll().path
$usr = $env:username cписок групп текущего
-пользователя
-$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher
-$ldapsearcher.Filter = "(&(objectCategory=User)(samAccountName=$usr))"
-$usrfind = $ldapsearcher.FindOne()
-$groups = $usrfind.properties.memberof -replace "(,OU=.+)"
-$groups = $groups -replace "(CN=)"
DC (Domain Component) - компонент доменного имени
-OU (Organizational Unit) - организационные подразделения (type),
-используются для упорядочения объектов
-Container - так же используется для упорядочения объектов, контейнеры в
-отличии от подраделений не могут быть переименованы, удалены, созданы
-или связаны с объектом групповой политики (Computers, Domain
-Controllers, Users)
-DN (Distinguished Name) — уникальное имя объекта и местоположение в лесу
-AD. В DN описывается содержимое атрибутов в дереве (путь навигации),
-требуемое для доступа к конкретной записи или ее поиска
-CN (Common Name) - общее имя
(Get-ADObject (Get-ADRootDSE).DefaultNamingContext -Properties wellKnownObjects).wellKnownObjects
-отобразить отобразить контейнеры по умолчанию
-redircmp OU=Client Computers,DC=root,DC=domain,DC=local
-изменить контейнер компьютеров по умолчанию
-redirusr изменить контейнер пользователей по умолчанию
Import-module AdmPwd.ps импортировать модуль
-Get-AdmPwdPassword -ComputerName NAME посмотреть
-пароль
-Reset-AdmPwdPassword -ComputerName NAME изменить
-пароль
-Get-ADComputer -Filter * -SearchBase "DC=$d1,DC=$d2" | Get-AdmPwdPassword -ComputerName {$_.Name} | select ComputerName,Password,ExpirationTimestamp | Out-GridView
-Get-ADComputer -Identity $srv | Get-AdmPwdPassword -ComputerName {$_.Name} | select ComputerName,Password,ExpirationTimestamp
Удаленные объекты хранятся в корзине AD в течении времени захоронения
-(определяется в атрибуте домена msDS-deletedObjectLifetime), заданном
-для леса. По умолчанию это 180 дней. Если данный срок прошел, объект все
-еще остается в контейнере Deleted Objects, но большинство его атрибутов
-и связей очищаются (Recycled Object). После истечения периода
-tombstoneLifetime (по умолчанию также 180 дней, но можно увеличить)
-объект полностью удаляется из AD автоматическим процессом очистки.
-Get-ADForest domain.local отобразить уровень работы
-леса
-Set-ADForestMode -Identity domain.local -ForestMode Windows2008R2Forest -force
-увеличить уровень работы леса
-Enable-ADOptionalFeature –Identity "CN=Recycle Bin Feature,CN=Optional Features,CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=domain,DC=local" –Scope ForestOrConfigurationSet –Target "domain.local"
-включить корзину
-Get-ADOptionalFeature "Recycle Bin Feature" | select-object name,EnabledScopes
-если значение EnabledScopes не пустое, значит в домене корзина Active
-Directory включена
-Get-ADObject -Filter 'Name -like "*tnas*"' -IncludeDeletedObjects
-найти удаленную (Deleted: True) УЗ (ObjectClass: user) в AD
-Get-ADObject -Filter 'Name -like "*tnas*"' –IncludeDeletedObjects -Properties *| select-object Name, sAMAccountName, LastKnownParent, memberOf, IsDeleted | fl
-проверить значение атрибута IsDeleted, контейнер, в котором находился
-пользователе перед удалением (LastKnownParent) и список групп, в которых
-он состоял
-Get-ADObject –filter {Deleted -eq $True -and ObjectClass -eq "user"} –includeDeletedObjects
-вывести список удаленных пользователей
-Restore-ADObject -Identity "3dc33c7c-b912-4a19-b1b7-415c1395a34e"
-восстановить по значению атрибута ObjectGUID
-Get-ADObject -Filter 'SAMAccountName -eq "tnas-01"' –IncludeDeletedObjects | Restore-ADObject
-восстановить по SAMAccountName
-Get-ADObject -Filter {Deleted -eq $True -and ObjectClass -eq 'group' -and Name -like '*Allow*'} –IncludeDeletedObjects | Restore-ADObject –Verbose
-восстановить группу или компьютер
$photo = [byte[]](Get-Content C:\Install\adm.jpg -Encoding byte)
-преобразовать файл картинки в массив байтов (jpeg/bmp файл, размером
-фото до 100 Кб и разрешением 96?96)
-Set-ADUser support4 -Replace @{thumbnailPhoto=$photo}
-задать значение атрибута thumbnailPhoto
Get-ADDomainController выводит информацию о текущем
-контроллере домена (LogonServer), который используется данным
-компьютером для аутентификации (DC выбирается при загрузке в
-соответствии с топологией сайтов AD)
-Get-ADDomainController -Discover -Service PrimaryDC найти
-контроллер с ролью PDC в домене
-Get-ADDomainController -Filter * | ft HostName,IPv4Address,Name,Site,OperatingSystem,IsGlobalCatalog
-список все DC, принадлежность к сайту, версии ОС и GC
При загрузке ОС служба NetLogon делает DNS запрос со списком -контроллеров домена (к SRV записи ldap._tcp.dc._msdcs.domain), -DNS возвращает список DC в домене с записью Service Location (SRV). -Клиент делает LDAP запрос к DC для определения сайта AD по своему IP -адресу. Клиент через DNS запрашивает список контроллеров домена в сайте -(в разделе _tcp.sitename._sites…).
-USN (Update Sequence Numbers) - счетчик номера последовательного -обновления, который существует у каждого объекта AD. При репликации -контроллеры обмениваются значениями USN, объект с более низким USN будет -при репликации перезаписан объектом с более высоким USN. Находится в -свойствах - Object (включить View - Advanced Features). Каждый -контроллер домена содержит отдельный счетчик USN, который начинает -отсчет в момент запуска процесса Dcpromo и продолжает увеличивать -значения в течение всего времени существования контроллера домена. -Значение счетчика USN увеличивается каждый раз, когда на контроллере -домена происходит транзакция, это операции создания, обновления или -удаления объекта.
-Get-ADDomainController -Filter * | % { отобразить USN
-объекта на всех DC в домене\Get-ADUser -Server $_.HostName
--Identity support4 -Properties uSNChanged | select
-SamAccountName,uSNChanged\}`
dcpromo /forceremoval принудительно выполнит понижение в
-роли контроллера домена до уровня рядового сервера. После понижения роли
-выполняется удаление всех ссылок в домене на этот контроллер. Далее
-производит включение сервера в состав домена, и выполнение обратного
-процесса, т.е. повышение сервера до уровня контроллера домена.
nltest /DSGETDC:$env:userdnsdomain узнать на каком DC
-аудентифицирован хост (Logon Server)
-nltest /SC_RESET:$env:userdnsdomain\srv-dc2.$env:userdnsdomain
-переключить компьютер на другой контроллер домена AD вручную (The
-command completed successfully)
-Get-ADComputer –Identity $env:computername -Properties PasswordLastSet
-время последней смены пароля на сервере
-Test-ComputerSecureChannel –verbose проверить доверительные
-отношения с доменом (соответствует ли локальный пароль компьютера
-паролю, хранящемуся в AD)
-Reset-ComputerMachinePassword -Credential domain\admin
-принудительно обновить пароль
-Netdom ResetPWD /Server:dc-01 /UserD:domain\admin /PasswordD:*
-сбросить хэш пароля компьютера в домене (перезагрузка не
-требуется)
-Search-ADAccount -AccountDisabled -ComputersOnly | select Name,LastLogonDate,Enabled
-отобразить все отключенные компьютеры
Get-ADComputer -Filter * -Properties * | select name
-список всех компьютеров в домене (Filter), вывести все свойства
-(Properties)
-Get-ADComputer -Identity $srv -Properties * | ft Name,LastLogonDate,PasswordLastSet,ms-Mcs-AdmPwd -Autosize
-конкретного компьютера в AD (Identity)
-Get-ADComputer -SearchBase "OU=Domain Controllers,DC=$d1,DC=$d2" -Filter * -Properties * | ft Name, LastLogonDate, distinguishedName -Autosize
-поиск в базе по DN (SearchBase)
(Get-ADComputer -Filter {enabled -eq "true"}).count
-получить общее количество активных (незаблокированных) компьютеров
-(Get-ADComputer -Filter {enabled -eq "true" -and OperatingSystem -like "*Windows Server 2016*"}).count
-кол-во активных копьютеров с ОС WS 2016
Get-ADComputer -Filter * -Properties * | select @{Label="Ping Status"; Expression={
-$ping = ping -n 1 -w 50 $_.Name
-if ($ping -match "TTL") {"Online"} else {"Offline"}
-}},
-@{Label="Status"; Expression={
-if ($_.Enabled -eq "True") {$_.Enabled -replace "True","Active"} else {$_.Enabled -replace "False","Blocked"}
-}}, Name, IPv4Address, OperatingSystem, @{Label="UserOwner"; Expression={$_.ManagedBy -replace "(CN=|,.+)"}
-},Created | Out-GridView
Get-ADUser -Identity support4 -Properties * список всех
-атрибутов
-Get-ADUser -Identity support4 -Properties DistinguishedName, EmailAddress, Description
-путь DN, email и описание
-Get-ADUser -Filter {(Enabled -eq "True") -and (mail -ne "null")} -Properties mail | ft Name,mail
-список активных пользователей и есть почтовый ящик
-Get-ADUser -Filter {SamAccountName -like "*"} | Measure-Object
-посчитать кол-во всех аккаунтов (Count)
-Get-ADUser -Filter * -Properties WhenCreated | sort WhenCreated | ft Name, whenCreated
-дата создания
-Get-ADUser -Identity support4 -property LockedOut | select samaccountName,Name,Enabled,Lockedout
-Enabled=True учетная запись включена - да
-Lockedout=False учетная запись заблокирована (например,
-политикой паролей) - нет
-Get-ADUser -Identity support4 | Unlock-ADAccount
-разблокировать учетную запись
-Disable-ADAccount -Identity support4 отключить учетную
-запись
-Enable-ADAccount -Identity support4 включить учетную
-запись
-Search-ADAccount -LockedOut найти все заблокированные
-учетные записи
-Search-ADAccount -AccountDisabled | select Name,LastLogonDate,Enabled
-отобразить все отключенные учетные записи с временем последнего
-входа
Get-ADUser -Identity support4 -Properties PasswordLastSet,PasswordExpired,PasswordNeverExpires
-PasswordLastSet время последней смены пароля
-PasswordExpired=False пароль истек - нет
-PasswordNeverExpires=True срок действия пароля не истекает
-- да
-Set-ADAccountPassword support4 -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "password" -Force -Verbose)
-изменить пароль учетной записи
-Set-ADUser -Identity support4 -ChangePasswordAtLogon $True
-смена пароля при следующем входе в систему
$day = (Get-Date).adddays(-90)
-Get-ADUser -filter {(passwordlastset -le $day)} | ft
-пользователи, которые не меняли свой пароль больше 90 дней
$day = (Get-Date).adddays(-30)
-Get-ADUser -filter {(Created -ge $day)} -Property Created | select Name,Created
-Новые пользователи за 30 дней
$day = (Get-Date).adddays(-360)
-Get-ADUser -Filter {(LastLogonTimestamp -le $day)} -Property LastLogonTimestamp | select Name,SamAccountName,@{n='LastLogonTimestamp';e={[DateTime]::FromFileTime($_.LastLogonTimestamp)}} | sort -Descending LastLogonTimestamp
-пользователи, которые не логинились больше 360 дней. Репликация атрибута
-LastLogonTimestamp составляет от 9 до 14 дней.
-| Disable-ADAccount $_.SamAccountName заблокировать
--WhatIf отобразить вывод без применения изменений
(Get-ADUser -Identity support4 -Properties MemberOf).memberof
-список групп в которых состоит пользователь
-Get-ADGroupMember -Identity "Domain Admins" | Select Name,SamAccountName
-список пользователей в группе
-Add-ADGroupMember -Identity "Domain Admins" -Members support5
-добавить в группу
-Remove-ADGroupMember -Identity "Domain Admins" -Members support5 -force
-удалить из группы
-Get-ADGroup -filter * | where {!($_ | Get-ADGroupMember)} | Select Name
-отобразить список пустых групп (-Not)
Get-Command -Module ActiveDirectory -Name *Replication*
-список всех командлетов модуля
-Get-ADReplicationFailure -Target dc-01 список ошибок
-репликации с партнерами
-Get-ADReplicationFailure -Target $env:userdnsdomain -Scope Domain
-Get-ADReplicationPartnerMetadata -Target dc-01 | select Partner,LastReplicationAttempt,LastReplicationSuccess,LastReplicationResult,LastChangeUsn
-время последней и время успешной репликации с партнерами
-Get-ADReplicationUpToDatenessVectorTable -Target dc-01
-Update Sequence Number (USN) увеличивается каждый раз, когда на
-контроллере домена происходит транзакция (операции создания, обновления
-или удаления объекта), при репликации DC обмениваются значениями USN,
-объект с более низким USN при репликации будет перезаписан высоким
-USN.
repadmin /replsummary отображает время последней
-репликации на всех DC по направлению (Source и Destination) и их
-состояние с учетом партнеров
-repadmin /showrepl $srv отображает всех партнеров по
-реплкации и их статус для всех разделов Naming Contexts
-(DC=ForestDnsZones, DC=DomainDnsZones, CN=Schema,
-CN=Configuration)
-repadmin /replicate $srv2 $srv1 DC=domain,DC=local
-выполнить репликацию с $srv1 на $srv2 только указанный раздела
-домена
-repadmin /SyncAll /AdeP запустить межсайтовую исходящую
-репликацию всех разделов от текущего сервера со всеми партнерами по
-репликации
-/A выполнить для всех разделов NC
-/d в сообщениях идентифицировать серверы по DN (вместо GUID
-DNS - глобальным уникальным идентификаторам)
-/e межсайтовая синхронизация (по умолчанию синхронизирует
-только с DC текущего сайта)
-/P извещать об изменениях с этого сервера (по умолчанию:
-опрашивать об изменениях)
-repadmin /Queue $srv отображает кол-во запросов входящей
-репликации (очередь), которое необходимо обработать (причиной может быть
-большое кол-во партнеров или формирование 1000 объектов скриптом)
-repadmin /showbackup * узнать дату последнего Backup
Error: 1722 сервер rpc недоступен (ошибка отката
-репликации). Проверить имя домена в настройках сетевого адаптера, первым
-должен идти адрес DNS-сервера другого контроллера домена, вторым свой
-адрес.
-Get-Service -ComputerName $srv | select name,status | ? name -like "RpcSs"
-Get-Service -ComputerName $srv -Name RpcSs -RequiredServices
-зависимые службы
-Зависимые службы RPC:
-“Служба сведений о подключенных сетях” - должен быть включен отложенный
-запуск. Если служба срабатывает до “службы списка сетей”, может падать
-связь с доменом (netlogon)
-“Центр распространения ключей Kerberos”
-“DNS-сервер”
-nslookup $srv
-tnc $srv -p 135
-repadmin /retry повторить попытку привязки к целевому DC,
-если была ошибка 1722 или 1753 (RPC недоступен)
repadmin /showrepl $srv
-Last attempt @ 2022-07-15 10:46:01 завершена с ошибкой, результат 8456 (0x2108)
-при проверки showrepl этого партнера, его ошибка: 8457 (0x2109)
-Last success @ 2022-07-11 02:29:46 последний успех
-Когда репликация автоматически отключена, ОС записывает в DSA - not
-writable одно из четырех значений:
-Path: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NTDS\Parameters
-Dsa Not Writable
-#define DSA_WRITABLE_GEN 1 версия леса несовместима с
-ОС
-#define DSA_WRITABLE_NO_SPACE 2 на диске, где размещена
-база данных Active Directory или файлы журналов (логи), недостаточно
-свободного места
-#define DSA_WRITABLE_USNROLLBCK 4 откат USN произошел из-за
-неправильного отката базы данных Active Directory во времени
-(восстановление из снапшота)
-#define DSA_WRITABLE_CORRUPT_UTDV 8 вектор актуальности
-поврежден на локальном контроллере домена
dcdiag /s:<DomainController> [/n:<NamingContext>] [[/u:<domain\user>] [/p:<password>]] [{/a|/e}{/q|/v}] [/f:<LogFile>] [/ferr:<ErrorLog>] [/test:<test>] [/fix]
-dcdiag /Test:replications /s:dc-01 отображает ошибки
-репликации
-dcdiag /Test:DNS /e /v /q тест DNS
-/a проверка всех серверов данного сайта
-/e проверка всех серверов предприятия
-/q выводить только сообщения об ошибках
-/v выводить подробную информацию
-/fix автоматически исправляет ошибки
-/test:
-NetLogons проверка наличие прав на выполнение
-репликации
-Connectivity проверяет регистрацию DNS для каждого
-контроллера домена, отправляет тестовый эхо-пакет на каждый контроллер
-домена и проверяет подключение по протоколам LDAP и RPC к каждому
-контроллеру домена
-Services проверяет работоспособность всех служб,
-необходимых для работы контроллера домена, на указанном контроллере
-домена
-Systemlog проверяет наличие ошибок в журналах контроллера
-домена
-FRSEvent проверяет ошибки репликации в работе службы
-репликации файлов, что может означать наличие проблем в репликации
-SYSVOL и, таким образом, целостности копий объектов групповых
-политик
-FSMOCheck не проверяет роли хозяев операций, а вместо этого
-запрашивает сервер глобального каталога, первичный контроллер домена,
-предпочтительный сервер времени, сервер времени и центр распространения
-ключей (контроллер домена может подключиться к KDC, PDC, серверу
-глобального каталога)
-KnowsOfRoleHolders пgроверяет возможность подключения
-контроллеров домена ко всем пяти хозяевам операций (ролями FSMO)
-MachineAccount проверяет правильность регистрации учетной
-записи целевого компьютера и правильность объявлений служб этого
-компьютера (корректность доверительных отношения с доменом). Если
-обнаружена ошибка, ее можно исправить с помощью утилиты dcdiag, указав
-параметры /fixmachineaccount или /recreatemachineaccount
-Advertising проверяет, правильно ли контроллер домена
-сообщает о себе и о своей роли хозяина операций. Этот тест завершиться
-неудачно, если служба NetLogon не запущена
-CheckSDRefDom проверяет правильность доменов ссылок
-дескрипторов безопасности для каждого раздела каталогов программ
-CrossRefValidation проверяет правильность перекрестных
-ссылок для доменов
-RRSSysvol проверяет состояние готовности для FRS
-SYSVOL
-Intersite проверяет наличие ошибок, которые могут помешать
-нормальной репликации между сайтами. Компания Microsoft предупреждает,
-что иногда результаты этого теста могут оказаться неточными
-KCCEvent проверяет безошибочность создания объектов
-соединений для репликации между сайтами
-NCSecDesc проверяет правильность разрешений для репликации
-в дескрипторах безопасности для заголовков контекста именования
-ObjectsReplicated проверяет правильность репликации агента
-сервера каталогов и объектов учетных записей компьютеров
-OutboundSecureChannels проверяется наличие безопасных
-каналов между всеми контроллерами домена в интересующем домене
-Replications проверяет возможность репликации между
-контроллерами домена и сообщает обо всех ошибках при репликации
-RidManager проверяет работоспособность и доступность
-хозяина относительных идентификаторов
-VerifyEnterpriseReferences проверяет действительность
-системных ссылок службы репликации файлов для всех объектов на всех
-контроллерах домена в лесу
-VerifyReferences проверяет действительность системных
-ссылок службы репликации файлов для всех объектов на указанном
-контроллере домена
-VerifyReplicas проверяет действительность всех разделов
-каталога приложения на всех серверах, принимающих участие в
-репликации
Перенос БД AD (ntds.dit):
-Get-Acl C:\Windows\NTDS | Set-Acl D:\AD-DB скопировать NTFS
-разрешения на новый каталог
-Stop-Service -ComputerName dc -name NTDS остановить службу
-Active Directory Domain Services
-ntdsutil запустить утилиту ntdsutil
-activate instance NTDS выбрать активный экземпляр базы
-AD
-files перейдем в контекст files, в котором возможно
-выполнение операция с файлами базы ntds.dit
-move DB to D:\AD-DB\ перенести базу AD в новый каталог
-(предварительно нужно его создать)
-info проверить, что БД находится в новом каталоге
-move logs to D:\AD-DB\ переместим в тот же каталог файлы с
-журналами транзакций
-quit
-Start-Service -ComputerName dc -name NTDS
Сброс пароля DSRM (режим восстановления служб каталогов):
-ntdsutil
-set dsrm password
-reset password on server NULL
-новый пароль
-подтверждение пароля
-quit
-quit
Синхронизировать с паролем УЗ в AD:
-ntdsutil
-set dsrm password
-sync from domain account dsrmadmin
-quit
-quit
Ошибка 0x00002e2 при загрузке ОС.
-Загрузиться в режиме восстанавления WinRE (Windows Recovery Environment)
-- Startup Settings - Restart - DSRM (Directory Services Restore
-Mode)
-reagentc /boottore shutdown /f /r /o /t 0 перезагрузка в
-режиме WinRE - ОС на базе WinPE (Windows Preinstallation Environment),
-образ winre.wim находится на скрытом разделе System Restore
-На контроллере домена единственная локальная учетная запись —
-администратор DSRM. Пароль создается при установке роли контроллера
-домена ADDS на сервере (SafeModeAdministratorPassword).
-ntdsutil
-activate instance ntds
-Files
-Info
-integrity проверить целостность БД
-Ошибка: Failed to open DIT for AD DS/LDS instance NTDS. Error
--2147418113
-mkdir c:\ntds_bak
-xcopy c:\Windows\NTDS\*.* c:\ntds_bak backup содержимого
-каталога с БД
-esentutl /g c:\windows\ntds\ntds.dit проверим целостность
-файла
-Вывод: Integrity check completed. Database is CORRUPTED ошибка, база AD
-повреждена
-esentutl /p c:\windows\ntds\ntds.dit исправить ошибки
-Вывод: Operation completed successfully in xx seconds. нет ошибок
-esentutl /g c:\windows\ntds\ntds.dit проверим целостность
-файла
-Выполнить анализ семантики базы с помощью ntdsutil:
-ntdsutil
-activate instance ntds
-semantic database analysis
-go
-go fixup исправить семантические ошибки
-Сжать файл БД:
-activate instance ntds
-files
-compact to C:\Windows\NTDS\TEMP
-copy C:\Windows\NTDS\TEMP\ntds.dit C:\Windows\NTDS\ntds.dit
-заменить оригинальный файл ntds.dit
-Del C:\Windows\NTDS\*.log удалить все лог файлы из каталога
-NTDS
Get-Command -Module GroupPolicy
-Get-GPO -Domain domain.local -All | ft
-Get-GPO -Name LAPS
-[xml](Get-GPOReport LAPS -ReportType Xml)
-Get-GPPermission -Name LAPS -All
-Get-GPO LAPS | New-GPLink -Target "ou=servers,dc=domain,dc=local"
-Set-GPLink -Name LAPS -Target "ou=servers,dc=domain,dc=local" -LinkEnabled No
-Backup-GPO -Name LAPS -Path "$home\Desktop"
-Backup-GPO -All -Path "$home\Desktop"
-Restore-GPO -Name LAPS -Path C:\Backup\GPOs\
Get-Command *WindowsFeature* source module
-ServerManager
-Get-WindowsFeature -ComputerName "localhost"
-Get-WindowsFeature | where Installed -eq $True список
-установленных ролей и компонентов
-Get-WindowsFeature | where FeatureType -eq "Role"
-отсортировать по списку ролей
-Install-WindowsFeature -Name DNS установить роль
-Get-Command *DNS*
-Get-DnsServerSetting -ALL
-Uninstall-WindowsFeature -Name DNS удалить роль
Install-WindowsFeature -Name WindowsPowerShellWebAccess -IncludeManagementTools
-Install-PswaWebApplication -UseTestCertificate Создать
-веб-приложение /pswa
-Add-PswaAuthorizationRule -UserGroupName "$domain\Domain Admins" -ComputerName * -ConfigurationName * -RuleName "For Admins"
-добавить права авторизации
При создании backup DC через WSB, создается копия состояния системы
-(System State), куда попадает база AD (NTDS.DIT), объекты групповых
-политик, содержимое каталога SYSVOL, реестр, метаданные IIS, база AD CS,
-и другие системные файлы и ресурсы. Резервная копия создается через
-службу теневого копирования VSS.
-Get-WindowsFeature Windows-Server-Backup проверить
-установлена ли роль
-Add-Windowsfeature Windows-Server-Backup –Includeallsubfeature
-установить роль
$path="\\$srv\bak-dc\dc-03\"
-[string]$TargetUNC=$path+(get-date -f 'yyyy-MM-dd')
-if ((Test-Path -Path $path) -eq $true) {New-Item -Path $TargetUNC -ItemType directory} # если путь доступен, создать новую директорию по дате
-$WBadmin_cmd = "wbadmin.exe START BACKUP -backupTarget:$TargetUNC -systemState -noverify -vssCopy -quiet"
-# $WBadmin_cmd = "wbadmin start backup -backuptarget:$path -include:C:\Windows\NTDS\ntds.dit -quiet" # Backup DB NTDS
-Invoke-Expression $WBadmin_cmdGet-Command -Module RemoteDesktop
-Get-RDServer -ConnectionBroker $broker список всех серверов
-в фермеы, указывается полное доменное имя при обращение к серверу с
-ролью RDCB
-Get-RDRemoteDesktop -ConnectionBroker $broker список
-коллекций
-(Get-RDLicenseConfiguration -ConnectionBroker $broker | select *).LicenseServer
-список серверов с ролью RDL
-Get-RDUserSession -ConnectionBroker $broker список всех
-активных пользователей
-Disconnect-RDUser -HostServer $srv -UnifiedSessionID $id -Force
-отключить сессию пользователя
-Get-RDAvailableApp -ConnectionBroker $broker -CollectionName C03
-список установленного ПО на серверах в коллекции
-(Get-RDSessionCollectionConfiguration -ConnectionBroker $broker -CollectionName C03 | select *).CustomRdpProperty
-use redirection server name:i:1
-Get-RDConnectionBrokerHighAvailability
Get-Command -Module DnsServer
-Show-DnsServerCache отобразить весь кэш DNS-сервера
-Show-DnsServerCache | where HostName -match ru
-Clear-DnsServerCache
-Get-DnsServerCache
-Get-DnsServerDiagnostics
$zone = icm $srv {Get-DnsServerZone} | select ZoneName,ZoneType,DynamicUpdate,ReplicationScope,SecureSecondaries,
-DirectoryPartitionName | Out-GridView -Title "DNS Server: $srv" –PassThru
-$zone_name = $zone.ZoneName
-if ($zone_name -ne $null) {
-icm $srv {Get-DnsServerResourceRecord -ZoneName $using:zone_name | sort RecordType | select RecordType,HostName, @{
-Label="IPAddress"; Expression={$_.RecordData.IPv4Address.IPAddressToString}},TimeToLive,Timestamp
-} | select RecordType,HostName,IPAddress,TimeToLive,Timestamp | Out-GridView -Title "DNS Server: $srv"
-}Sync-DnsServerZone –passthru синхронизировать зоны с
-другими DC в домене
-Remove-DnsServerZone -Name domain.local удалить зону
-Get-DnsServerResourceRecord -ZoneName domain.local -RRType A
-вывести все А-записи в указанной зоне
-Add-DnsServerResourceRecordA -Name new-host-name -IPv4Address 192.168.1.100 -ZoneName domain.local -TimeToLive 01:00:00 -CreatePtr
-создать А-запись и PTR для нее
-Remove-DnsServerResourceRecord -ZoneName domain.local -RRType A -Name new-host-name –Force
-удалить А-запись
$DNSServer = "DC-01"
-$DNSFZone = "domain.com"
-$DataFile = "C:\Scripts\DNS-Create-A-Records-from-File.csv"
-# cat $DataFile
-# "HostName;IP"
-# "server-01;192.168.1.10"
-$DNSRR = [WmiClass]"\\$DNSServer\root\MicrosoftDNS:MicrosoftDNS_ResourceRecord"
-$ConvFile = $DataFile + "_unicode"
-Get-Content $DataFile | Set-Content $ConvFile -Encoding Unicode
-Import-CSV $ConvFile -Delimiter ";" | ForEach-Object {
-$FQDN = $_.HostName + "." + $DNSFZone
-$IP = $_.HostIP
-$TextA = "$FQDN IN A $IP"
-[Void]$DNSRR.CreateInstanceFromTextRepresentation($DNSServer,$DNSFZone,$TextA)
-}Get-Command -Module DhcpServer
$mac = icm $srv -ScriptBlock {Get-DhcpServerv4Scope | Get-DhcpServerv4Lease} | select AddressState,
-HostName,IPAddress,ClientId,DnsRegistration,DnsRR,ScopeId,ServerIP | Out-GridView -Title "HDCP Server: $srv" –PassThru
-(New-Object -ComObject Wscript.Shell).Popup($mac.ClientId,0,$mac.HostName,64)Add-DhcpServerv4Reservation -ScopeId 192.168.1.0 -IPAddress 192.168.1.10 -ClientId 00-50-56-C0-00-08 -Description "new reservation"
dfsutil /root:\\domain.sys\public /export:C:\export-dfs.txt
-экспорт конфигурации namespace root
-dfsutil /AddFtRoot /Server:\\$srv /Share:public на новой
-машине предварительно создать корень на основе домена
-dfsutil /root:\\domain.sys\public /import:C:\export-dfs.txt /<verify /set
-Import (перед импортом данных в существующий корень DFS, утилита создает
-резервную копию конфигурации корня в текущем каталоге, из которого
-запускается утилита dfsutil)
-/verify выводит изменения, которые будут внесены в процессе
-импорта, без применения
-/set меняет целевое пространство имен путем полной
-перезаписи и замены на конфигурацию пространства имен из импортируемого
-файла
-/merge импортирует конфигурацию пространства имен в
-дополнение к существующей конфигурации для слияния, параметры из файла
-конфигурации будут иметь больший приоритет, чем существующие параметры
-пространства имен
Export-DfsrClone экспортирует клонированную базу данных
-репликации DFS и параметры конфигурации тома
-Get-DfsrCloneState получает состояние операции клонирования
-базы данных
-Import-DfsrClone импортирует клонированную базу данных
-репликации DFS и параметры конфигурации тома
net use x: \\$srv1\public\* примонтировать диск
-Get-DfsrFileHash x:\* | Out-File C:\$srv1.txt забрать hash
-всех файлов диска в файл (файлы с одинаковыми хешами всегда являются
-точными копиями друг друга)
-net use x: /d отмонтировать
-net use x: \\$srv2\public\*
-Get-DfsrFileHash x:\* | Out-File C:\$srv2.txt
-net use x: /d
-Compare-Object -ReferenceObject (Get-Content C:\$srv1.txt) -DifferenceObject (Get-Content C:\$srv2.txt) -IncludeEqual
-сравнить содержимое файлов
Get-DfsrBacklog -DestinationComputerName "fs-06" -SourceComputerName "fs-05" -GroupName "folder-rep" -FolderName "folder" -Verbose
-получает список ожидающих обновлений файлов между двумя партнерами
-репликации DFS
-Get-DfsrConnection отображает группы репликации, участников
-и статус
-Get-DfsReplicatedFolder отображает имя и полный путь к
-папкам реликации в системе DFS
-Get-DfsrState -ComputerName fs-06 -Verbose состояние
-репликации DFS для члена группы
-Get-DfsReplicationGroup отображает группы репликации и их
-статус
-Add-DfsrConnection создает соединение между членами группы
-репликации
-Add-DfsrMember добавляет компьютеры в группу
-репликации
-ConvertFrom-DfsrGuid преобразует идентификаторы GUID в
-понятные имена в заданной группы репликации
-Get-DfsrConnectionSchedule получает расписание соединений
-между членами группы репликации
-Get-DfsrGroupSchedule извлекает расписание группы
-репликации
-Get-DfsrIdRecord получает записи ID для реплицированных
-файлов или папок из базы данных репликации DFS
-Get-DfsrMember получает компьютеры в группе
-репликации
-Get-DfsrMembership получает параметры членства для членов
-групп репликации
-Get-DfsrPreservedFiles получает список файлов и папок,
-ранее сохраненных репликацией DFS
-Get-DfsrServiceConfiguration получает параметры службы
-репликации DFS для членов группы
-Grant-DfsrDelegation предоставляет разрешения участникам
-безопасности для группы репликации
-Revoke-DfsrDelegation отменяет разрешения участников
-безопасности для группы репликации
-New-DfsReplicationGroup создает группу репликации
-New-DfsReplicatedFolder создает реплицированную папку в
-группе репликации
-Remove-DfsrConnection удаляет соединение между членами
-группы репликации
-Remove-DfsReplicatedFolder удаляет реплицированную папку из
-группы репликации
-Remove-DfsReplicationGroup удаляет группу репликации
-Remove-DfsrMember удаляет компьютеры из группы
-репликации
-Restore-DfsrPreservedFiles восстанавливает файлы и папки,
-ранее сохраненные репликацией DFS
-Set-DfsrConnection изменяет параметры соединения между
-членами группы репликации
-Set-DfsrConnectionSchedule изменяет параметры расписания
-соединений между членами группы репликации
-Set-DfsReplicatedFolder изменяет настройки реплицированной
-папки
-Set-DfsReplicationGroup изменяет группу репликации
-Set-DfsrGroupSchedule изменяет расписание группы
-репликации
-Set-DfsrMember изменяет информацию о компьютере-участнике в
-группе репликации
-Set-DfsrMembership настраивает параметры членства для
-членов группы репликации
-Set-DfsrServiceConfiguration изменяет параметры службы
-репликации DFS
-Sync-DfsReplicationGroup синхронизирует репликацию между
-компьютерами независимо от расписания
-Suspend-DfsReplicationGroup приостанавливает репликацию
-между компьютерами независимо от расписания
-Update-DfsrConfigurationFromAD инициирует обновление службы
-репликации DFS
-Write-DfsrHealthReport создает отчет о работоспособности
-репликации DFS
-Write-DfsrPropagationReport создает отчеты для тестовых
-файлов распространения в группе репликации
-Start-DfsrPropagationTest создает тестовый файл
-распространения в реплицированной папке
Install-WindowsFeature Storage-Replica –IncludeManagementTools -Restart
-Get-Command -Module StorageReplica
-Test-SRTopology проверить соответствует ли сервер и канал
-связи технологии Storage Replica
-New-SRPartnership -SourceComputerName srv-01 -SourceRGName srv-01-rep-group-01 -SourceVolumeName D: -SourceLogVolumeName L: -DestinationComputerName srv-02 -DestinationRGName srv-02-rep-group-01 -DestinationVolumeName D: -DestinationLogVolumeName L: -LogSizeInBytes 1GB
-Get-Counter -Counter "\Storage Replica Statistics(*)"
-Get-WinEvent -ProviderName Microsoft-Windows-StorageReplica -max 10
-Set-SRPartnership -ReplicationMode Asynchronous переключить
-режим репликации на асинхронный
-Set-SRPartnership -NewSourceComputerName srv-02 -SourceRGName srv-02-rep-group-01 -DestinationComputerName srv-01 -DestinationRGName srv-01-rep-group-01
-изменить вручную направление репликации данных, переведя вторичную копию
-в онлайн режим (при выходе из строя основного сервера)
-Get-SRGroup информация о состояние группы реплизации
-Get-SRPartnerShip информация о направлении репликации
-(Get-SRGroup).Replicas | Select-Object numofbytesremaining
-проверить длину очереди копирования
-Get-SRPartnership | Remove-SRPartnership удалить реплизацию
-на основном сервере
-Get-SRGroup | Remove-SRGroup удалить реплизацию на обоих
-серверах
Install-Module ps2exe -Repository PSGallery
-Get-Module -ListAvailable список всех модулей
--noConsole использовать GUI, без окна консоли
-powershell
--noOutput выполнение в фоне
--noError без вывода ошибок
--requireAdmin при запуске запросить права
-администратора
--credentialGUI вывод диалогового окна для ввода учетных
-данных
-Invoke-ps2exe -inputFile "$home\Desktop\WinEvent-Viewer-1.1.ps1" -outputFile "$home\Desktop\WEV-1.1.exe" -iconFile "$home\Desktop\log_48px.ico" -title "WinEvent-Viewer" -noConsole -noOutput -noError
$powershell_Path = (Get-Command powershell).Source
-$NSSM_Path = (Get-Command "C:\WinPerf-Agent\NSSM-2.24.exe").Source
-$Script_Path = "C:\WinPerf-Agent\WinPerf-Agent-1.1.ps1"
-$Service_Name = "WinPerf-Agent"
-& $NSSM_Path install $Service_Name $powershell_Path -ExecutionPolicy Bypass -NoProfile -f $Script_Path
-создать Service
-& $NSSM_Path start $Service_Name запустить
-& $NSSM_Path status $Service_Name статус
-$Service_Name | Restart-Service перезапустить
-$Service_Name | Get-Service статус
-$Service_Name | Stop-Service остановить
-& $NSSM_Path set $Service_Name description "Check performance CPU and report email"
-изменить описание
-& $NSSM_Path remove $Service_Name удалить
Get-Job получение списка задач
-Start-Job запуск процесса
-Stop-Job остановка процесса
-Suspend-Job приостановка работы процесса
-Resume-Job восстановление работы процесса
-Wait-Job ожидание вывода команды
-Receive-Job получение результатов выполненного
-процесса
-Remove-Job удалить задачу
function Start-PingJob ($Network) {
-$RNetwork = $Network -replace "\.\d{1,3}$","."
-foreach ($4 in 1..254) {
-$ip = $RNetwork+$4
-# создаем задания, забираем 3-ю строку вывода и добавляем к выводу ip-адрес:
-(Start-Job {"$using:ip : "+(ping -n 1 -w 50 $using:ip)[2]}) | Out-Null
-}
-while ($True){
-$status_job = (Get-Job).State[-1] # забираем статус последнего задания
-if ($status_job -like "Completed"){ # проверяем на выполнение (задания выполняются по очереди сверху вниз)
-$ping_out = Get-Job | Receive-Job # если выполнен, забираем вывод всех заданий
-Get-Job | Remove-Job -Force # удаляем задания
-$ping_out
-break # завершаем цикл
-}}
-}Start-PingJob -Network 192.168.3.0
-(Measure-Command {Start-PingJob -Network 192.168.3.0}).TotalSeconds
-60 Seconds
Install-Module -Name ThreadJob
-Get-Module ThreadJob -list
-Start-ThreadJob {ping ya.ru} | Out-Null создать фоновую
-задачу
-Get-Job | Receive-Job -Keep отобразить и не удалять
-вывод
-(Get-Job).HasMoreData если False, то вывод команы
-удален
-(Get-Job)[-1].Output отобразить вывод последней задачи
function Start-PingThread ($Network) {
-$RNetwork = $Network -replace "\.\d{1,3}$","."
-foreach ($4 in 1..254) {
-$ip = $RNetwork+$4
-# создаем задания, забираем 3-ю строку вывода и добавляем к выводу ip-адрес:
-(Start-ThreadJob {"$using:ip : "+(ping -n 1 -w 50 $using:ip)[2]}) | Out-Null
-}
-while ($True){
-$status_job = (Get-Job).State[-1] # забираем статус последнего задания
-if ($status_job -like "Completed"){ # проверяем на выполнение (задания выполняются по очереди сверху вниз)
-$ping_out = Get-Job | Receive-Job # если выполнен, забираем вывод всех заданий
-Get-Job | Remove-Job -Force # удаляем задания
-$ping_out
-break # завершаем цикл
-}}
-}Start-PingThread -Network 192.168.3.0
-(Measure-Command {Start-PingThread -Network 192.168.3.0}).TotalSeconds
-24 Seconds
function Start-PingRSJob ($Network) {
-$RNetwork = $Network -replace "\.\d{1,3}$","."
-foreach ($4 in 1..254) {
-$ip = $RNetwork+$4
-(Start-RSJob {"$using:ip : "+(ping -n 1 -w 50 $using:ip)[2]}) | Out-Null
-}
-$ping_out = Get-RSJob | Receive-RSJob
-$ping_out
-Get-RSJob | Remove-RSJob
-}Start-PingRSJob -Network 192.168.3.0
-(Measure-Command {Start-PingRSJob -Network 192.168.3.0}).TotalSeconds
-10 Seconds
function Send-SMTP {
-param (
-[Parameter(Mandatory = $True)]$mess
-)
-$srv_smtp = "smtp.yandex.ru"
-$port = "587"
-$from = "login1@yandex.ru"
-$to = "login2@yandex.ru"
-$user = "login1"
-$pass = "password"
-$subject = "Service status on Host: $hostname"
-$Message = New-Object System.Net.Mail.MailMessage
-$Message.From = $from
-$Message.To.Add($to)
-$Message.Subject = $subject
-$Message.IsBodyHTML = $true
-$Message.Body = "<h1> $mess </h1>"
-$smtp = New-Object Net.Mail.SmtpClient($srv_smtp, $port)
-$smtp.EnableSSL = $true
-$smtp.Credentials = New-Object System.Net.NetworkCredential($user, $pass);
-$smtp.Send($Message)
-}Send-SMTP $(Get-Service)
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).StatusGet-NetNatStaticMapping отобразить пробросы (NAT)
-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 @VMSet-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
Get-NetTCPConnection -State Established,Listen | Where-Object LocalPort -Match 2179
-найти порт слушателя
-Get-Process -Id (Get-NetTCPConnection -State Established,Listen | Where-Object LocalPort -Match 2179).OwningProcess
-найти процесс по ID (vmms/VMConnect)
-New-NetFirewallRule -Name "Hyper-V" -DisplayName "Hyper-V" -Group "Hyper-V" -Direction Inbound -Protocol TCP -LocalPort 2179 -Action Allow -Profile Public
-Get-LocalGroupMember -Group "Администраторы Hyper-V" или
-“Hyper-V Administrators”
-Add-LocalGroupMember -Group "Администраторы Hyper-V" -Member "lifailon"
-Get-VM * | select name,ID добавить id в RDCMan для
-подключения
-Grant-VMConnectAccess -ComputerName plex-01 -VMName hv-devops-01 -UserName lifailon
-дать доступ на подключение не администратору
-Grant-VMConnectAccess -ComputerName huawei-book -VMName hv-devops-01 -UserName lifailon
-Get-VMConnectAccess
-Revoke-VMConnectAccess -VMName hv-devops-01 -UserName lifailon
Error: Unknown disconnection reason 3848 - добавить
-ключи реестра на стороне клиента
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsDomain -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
-New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowDefaultCredentials -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
-New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsWhenNTLMOnlyDomain -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowDefaultCredentialsDomain -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
-New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentials -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
-New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsWhenNTLMOnly -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
-New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentialsWhenNTLMOnly -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
-New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentials -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
-New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentialsDomain -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -ForceInstall-Module -Name VMware.PowerCLI # -AllowClobber
-установить модуль (PackageProvider: nuget)
-Get-Module -ListAvailable VMware* | Select Name,Version
-Import-Module VMware.VimAutomation.Core импортировать в
-сессию
-Get-PSProvider | format-list Name,PSSnapIn,ModuleName
-список оснасток Windows PowerShell
Get-PowerCLIConfiguration конфигурация подключения
-Set-PowerCLIConfiguration -Scope AllUsers -InvalidCertificateAction ignore -confirm:$false
-eсли используется самоподписанный сертификат, изменить значение
-параметра InvalidCertificateAction с Unset на Ignore/Warn
-Set-PowerCLIConfiguration -Scope AllUsers -ParticipateInCeip $false
-отключить уведомление сбора данных через VMware Customer Experience
-Improvement Program (CEIP)
Read-Host –AsSecureString | ConvertFrom-SecureString | Out-File "$home\Documents\vcsa_password.txt"
-зашифровать пароль и сохранить в файл
-$esxi = "vcsa.domain.local"
-$user = "administrator@vsphere.local"
-$pass = Get-Content "$home\Documents\vcsa_password.txt" | ConvertTo-SecureString
-прочитать пароль
-$pass = "password"
-$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user ,$pass
-Connect-VIServer $esxi -User $Cred.Username -Password $Cred.GetNetworkCredential().password
-подключиться, используя PSCredential ($Cred)
-Connect-VIServer $esxi -User $user -Password $pass
-подключиться, используя логин и пароль
Get-Command –Module *vmware*
-Get-Command –Module *vmware* -name *get*iscsi*
-Get-IScsiHbaTarget
-Get-Datacenter
-Get-Cluster
-Get-VMHost
-Get-VMHost | select Name,Model,ProcessorType,MaxEVCMode,NumCpu,CpuTotalMhz,CpuUsageMhz,MemoryTotalGB,MemoryUsageGB
-Get-VMHostDisk | select VMHost,ScsiLun,TotalSectors
Get-Datastore
-Get-Datastore TNAS-vmfs-4tb-01
-Get-Datastore TNAS-vmfs-4tb-01 | get-vm
-Get-Datastore -RelatedObject vm-01
-(Get-Datastore TNAS-vmfs-4tb-01).ExtensionData.Info.GetType()
-(Get-Datastore TNAS-vmfs-4tb-01).ExtensionData.Info.Vmfs.Extent
Get-Command –Module *vmware* -name *disk*
-Get-VM vm-01 | Get-Datastore
-Get-VM vm-01 | Get-HardDisk
-Get-VM | Get-HardDisk | select Parent,Name,CapacityGB,StorageFormat,FileName | ft
-Copy-HardDisk
-Get-VM | Get-Snapshot
-Get-VM | where {$_.Powerstate -eq "PoweredOn"}
-Get-VMHost esxi-05 | Get-VM | where {$_.Powerstate -eq "PoweredOff"} | Move-VM –Destination (Get-VMHost esxi-06)
Get-VM | select Name,VMHost,PowerState,NumCpu,MemoryGB,
-@{Name="UsedSpaceGB"; Expression={[int32]($_.UsedSpaceGB)}},@{Name="ProvisionedSpaceGB"; Expression={[int32]($_.ProvisionedSpaceGB)}},
-CreateDate,CpuHotAddEnabled,MemoryHotAddEnabled,CpuHotRemoveEnabled,Notes
Get-VMGuest vm-01 | Update-Tools
-Get-VMGuest vm-01 | select OSFullName,IPAddress,HostName,State,Disks,Nics,ToolsVersion
-Get-VMGuest * | select -ExpandProperty IPAddress
-Restart-VMGuest -vm vm-01 -Confirm:$False
-Start-VM -vm vm-01 -Confirm:$False
-Shutdown-VMGuest -vm vm-01 -Confirm:$false
New-VM –Name vm-01 -VMHost esxi-06 –ResourcePool Production –DiskGB 60 –DiskStorageFormat Thin –Datastore TNAS-vmfs-4tb-01
-Get-VM vm-01 | Copy-VMGuestFile -Source "\\$srv\Install\Soft\Btest.exe" -Destination "C:\Install\" -LocalToGuest -GuestUser USER -GuestPassword PASS -force
Get-VM -name vm-01 | Export-VApp -Destination C:\Install -Format OVF
-Export template (.ovf, .vmdk, .mf)
-Get-VM -name vm-01 | Export-VApp -Destination C:\Install -Format OVA
Get-VMHostNetworkAdapter | select VMHost,Name,Mac,IP,@{Label="Port Group"; Expression={$_.ExtensionData.Portgroup}} | ft
-Get-VM | Get-NetworkAdapter | select Parent,Name,Id,Type,MacAddress,ConnectionState,WakeOnLanEnabled | ft
Get-Command –Module *vmware* -name *event*
-Get-VIEvent -MaxSamples 1000 | where {($_.FullFormattedMessage -match "power")} | select username,CreatedTime,FullFormattedMessage
-Get-logtype | select Key,SourceEntityId,Filename,Creator,Info
-(Get-Log vpxd:vpxd.log).Entries | select -Last 50
Get-Command –Module *vmware* -name *syslog*
-Set-VMHostSysLogServer -VMHost esxi-05 -SysLogServer "tcp://192.168.3.100" -SysLogServerPort 3515
-Get-VMHostSysLogServer -VMHost esxi-05
$srv_cas = "exchange-cas"
-$session_exchange = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$srv_cas/PowerShell/
--Credential $Cred -Authentication Kerberos
-Get-PSSession
-Import-PSSession $session_exchange -DisableNameChecking
-импортировать в текущую сессию
Get-ExchangeServer | select name,serverrole,admindisplayversion,Edition,OriginatingServer,WhenCreated,WhenChanged,DataPath | ft
-список всех серверов
Get-ImapSettings настройки IMAP
-Get-ExchangeCertificate список сертификатов
-Get-ExchangeCertificate -Thumbprint "5CEC8544D4743BC279E5FEA1679F79F5BD0C2B3A" | Enable-ExchangeCertificate -Services IMAP, POP, IIS, SMTP
-iisreset
-Get-ClientAccessService | fl identity, *uri* настройки
-службы автообнаружения в Exchange 2016
-Get-ClientAccessService -Identity $srv | Set-ClientAccessService -AutoDiscoverServiceInternalUri https://mail.domain.ru/Autodiscover/Autodiscover.xml
-изменить на внешний адрес
-Get-OutlookAnywhere OA позволяет клиентам Outlook
-подключаться к своим почтовым ящикам за пределами локальной сети (без
-использования VPN)
-Get-WebServicesVirtualDirectory
-Get-OwaVirtualDirectory
-Get-ActiveSyncVirtualDirectory
-Get-OabVirtualDirectory виртуальная директория автономной
-адресной книги
-Get-OabVirtualDirectory -Server $srv | Set-OabVirtualDirectory -InternalUrl "https://mail.domain.ru/OAB" -ExternalUrl "https://mail.domain.ru/OAB"
MS (Mailbox) - сервер с БД почтовых ящиков и общих папок, отвечает
-только за их размещение и не выполняет маршрутизацию никаких
-сообщений.
-CAS (Client Access Server) - обработка клиентских подключений к почтовым
-ящикам, которые создаются клиентами Outlook Web Access (HTTP для Outlook
-Web App), Outlook Anywhere, ActiveSync (для мобильных устройств),
-интернет протоколы POP3 и IMAP4, MAPI для клиентов Microsoft
-Outlook.
-Hub Transort - ответвечает за маршрутизацию сообщений интернета и
-инфраструктурой Exchange, а также между серверами Exchange. Сообщения
-всегда маршрутизируются с помощью роли транспортного
-сервера-концентратора, даже если почтовые ящики источника и назначения
-находятся в одной базе данных почтовых ящиков.
-Relay - роль пограничного транспортного сервера (шлюз SMTP в периметре
-сети).
SCP (Service Connection Point) - запись прописывается в AD, при
-создание сервера CAS. Outlook запрашивает SCP, выбирает те, которые
-находятся в одном сайте с ним и по параметру WhenCreated – по дате
-создания, выбирая самый старый.
-Autodiscover. Outlook выбирает в качестве сервера Client Access тот,
-который прописан в атрибуте RPCClientAccessServer базы данных
-пользователя. Сведения о базе данных и сервере mailbox, на котором она
-лежит, берутся из AD.
Get-MessageTrackingLog -ResultSize Unlimited | select Timestamp,Sender,Recipients,RecipientCount,MessageSubject,Source,EventID,ClientHostname,ServerHostname,ConnectorId, @{Name="MessageSize"; Expression={[string]([int]($_.TotalBytes / 1024))+" KB"}},@{Name="MessageLatency"; Expression={$_.MessageLatency -replace "\.\d+$"}}
-Get-MessageTrackingLog -Start (Get-Date).AddHours(-24) -ResultSize Unlimited | where {[string]$_.recipients -like "*@yandex.ru"}
-вывести сообщения за последние 24 часа, где получателем был указанный
-домен
--Start “04/01/2023 09:00:00” -End “04/01/2023 18:00:00” - поиск по
-указанному промежутку времени
--MessageSubject “Тест” - поиск по теме письма
--Recipients “support4@domain.ru” - поиск по получателю
--Sender - поиск по отправителю
--EventID – поиск по коду события сервера (RECEIVE, SEND, FAIL, DSN,
-DELIVER, BADMAIL, RESOLVE, EXPAND, REDIRECT, TRANSFER, SUBMIT,
-POISONMESSAGE, DEFER)
--Server – поиск на определенном транспортном сервере
--messageID – трекинг письма по его ID
Get-Mailbox -Database "it2" список почтовых серверов в
-базе данных
-Get-Mailbox -resultsize unlimited | ? Emailaddresses -like "support4" | format-list name,emailaddresses,database,servername
-какую БД, сервер и smtp-адреса использует почтовый ящик
-Get-Mailbox -Database $db_name -Archive отобразить архивные
-почтовые ящики
Get-MailboxFolderStatistics -Identity "support4" -FolderScope All | select Name,ItemsInFolder,FolderSize
-отобразить кол-во писем и размер в каждой папке
-Get-MailboxStatistics "support4" | select DisplayName,LastLoggedOnUserAccount,LastLogonTime,LastLogoffTime,ItemCount,TotalItemSize,DeletedItemCount,TotalDeletedItemSize,Database,ServerName
-общее кол-во писем, их размер, время последнего входа и выхода, имя
-сервера и БД
-Get-Mailbox -Server s2 | Get-MailboxStatistics | where {$_.Lastlogontime -lt (get-date).AddDays(-30)} | Sort Lastlogontime -desc | ft displayname,Lastlogontime,totalitemsize
-ящики, которые не использовались 30 и более дней
Enable-Mailbox -Identity support9 -Database test_base
-создать почтовый ящик для существующего пользователя в AD
-New-Mailbox -Name $login -UserPrincipalName "$login@$domain" -Database $select_db -OrganizationalUnit $path -Password (ConvertTo-SecureString -String "$password" -AsPlainText -Force)
-создать новый почтовый ящик без привязки к пользователю AD
-Get-MailboxDatabase -Database $db_name | Remove-MailboxDatabase
-удалить БД
Set-MailBox "support4" -PrimarySmtpAddress support24@domain.ru -EmailAddressPolicyEnabled $false
-добавить и изменить основной SMTP-адрес электронной почты для
-пользователя
-Set-Mailbox -Identity "support4" -DeliverToMailboxAndForward $true -ForwardingSMTPAddress "username@outlook.com"
-включить переадресацию почты (электронная почта попадает в почтовый ящик
-пользователя support4 и одновременно пересылается по адресу
-username@outlook.com)
Get-Mailbox -Database $db_in | New-MoveRequest -TargetDatabase $db_out
-переместить все почтовые ящики из одной БД в другую
-New-MoveRequest -Identity $db_in -TargetDatabase $db_out
-переместить один почтовый ящик
-Get-MoveRequest | Suspend-MoveRequest остановить запросы
-перемещения
-Get-MoveRequest | Remove-MoveRequest удалить запросы на
-перемещение
-Get-MoveRequest | Get-MoveRequestStatistics статус
-перемещения
Status:
-Cleanup - нужно подождать
-Queued - в очереди
-InProgress - в процессе
-Percent Complete - процент выполнения
-CompletionInProgress - завершение процесса
-Completed - завершено
Remove-MoveRequest -Identity $db_name завершить процесс
-перемещения (убрать статус перемещения с почтового ящика и очистить
-список перемещений)
-Get-MailboxDatabase | Select Name, MailboxRetention после
-перемещения ящиков, размер базы не изменится, полное удаление из базы
-произойдет, как пройдет количество дней, выставленное в параметре
-MailboxRetention
-Set-MailboxDatabase -MailboxRetention '0.00:00:00' -Identity $db_name
-изменить значение
Enable-Mailbox -Identity $name -Archive включить архив
-для пользователя
-Get-Mailbox $name | New-MoveReques –ArchiveOnly –ArchiveTargetDatabase DBArch
-переместить архивный почтовый ящик в другую БД
-Get-Mailbox $name | fl Name,Database,ArchiveDatabase место
-расположения БД пользователя и БД его архива
-Disable-Mailbox -Identity $name -Archive отключить
-архив
-Connect-Mailbox -Identity "8734c04e-981e-4ccf-a547-1c1ac7ebf3e2" -Archive -User $name -Database it2
-подключение архива пользователя к указанному почтовому ящику
-Get-Mailbox $name | Set-Mailbox -ArchiveQuota 20GB -ArchiveWarningQuota 19GB
-настроить квоты хранения архива
Get-Mailbox -Identity $mailbox | fl IssueWarningQuota, ProhibitSendQuota, ProhibitSendReceiveQuota, UseDatabaseQuotaDefaults
-отобразить квоты почтового ящика
-IssueWarningQuota — квота, при достижении которой Exchange отправит
-уведомление
-ProhibitSendQuota — при достижении будет запрещена отправка
-ProhibitSendReceiveQuota — при достижении будет запрещена отправка и
-получение
-UseDatabaseQuotaDefaults — используется ли квота БД или false -
-индвидиуальные
-Set-Mailbox -Identity $mailbox -UseDatabaseQuotaDefaults $false -IssueWarningQuota "3 GB" -ProhibitSendQuota "4 GB" -ProhibitSendReceiveQuota "5 GB"
-задать квоту для пользователя
Get-MailboxDatabase $db_name | fl Name, *Quota
-отобразить квоты наложенные на БД
-Set-MailboxDatabase $db -ProhibitSendReceiveQuota "5 GB" -ProhibitSendQuota "4 GB" -IssueWarningQuota "3 GB"
-настроить квоты на БД
Get-MailboxDatabase -Status | select ServerName,Name,DatabaseSize
-список и размер всех БД на всех MX-серверах
-New-MailboxDatabase -Name it_2022 -EdbFilePath E:\Bases\it_2022\it_2022.edb -LogFolderPath G:\Logs\it_2022 -OfflineAddressBook "Default Offline Address List" -server exch-mx-01
-создать БД
-Restart-Service MSExchangeIS
-Get-Service | Where {$_ -match "exchange"} | Restart-Service
-Get-MailboxDatabase -Server exch-01 список баз данных на
-MX-сервере
-New-MoveRequest -Identity "support4" -TargetDatabase it_2022
-переместить почтовый ящик в новую БД
-Move-Databasepath $db_name –EdbFilepath "F:\DB\$db_name\$db_name.edb" –LogFolderpath "E:\DB\$db_name\logs\"
-переместить БД и транзакционные логи на другой диск
-Set-MailboxDatabase -CircularLoggingEnabled $true -Identity $db_name
-включить циклическое ведение журнала (Circular Logging), где
-последовательно пишутся 4 файла логов по 5 МБ, после чего первый
-лог-файл перезаписывается
-Set-MailboxDatabase -CircularLoggingEnabled $false -Identity $db_name
-отключить циклическое ведение журнала
-Get-MailboxDatabase -Server "exch-mx-01" -Status | select EdbFilePath,LogFolderPath,LogFilePrefix
-путь к БД, логам, имя текущего актуального лог-файла
New-MailboxRepairRequest -Database it2 -CorruptionType ProvisionedFolder, SearchFolder, AggregateCounts, Folderview
-запустить последовательный тест (в конкретный момент времени не доступен
-один почтовый ящик) и исправление ошибок на прикладном уровне
-Get-MailboxRepairRequest -Database it2 прогресс
-выполнения
-Позволяет исправить:
-ProvisionedFolder – нарушения логической структуры папок
-SearchFolder – ошибки в папках поиска
-AggregateCounts – проверка и исправление информации о количестве
-элементов в папках и их размере
-FolderView – неверное содержимое, отображаемое представлениями папок
При отправке/получении любого письма Exchange сначала вносит -информацию в транзакционный лог, и только потом сохраняет элемент -непосредственно в базу данных. Размер одного лог файла - 1 Мб. Есть три -способа урезания логов: DAG, Backup на базе Volume Shadow Copy, Circular -Logging.
-Ручное удаление журналов транзакций:
-cd E:\MS_Exchange_2010\MailBox\Reg_v1_MailBoxes\ перейти в
-каталог с логами
-ls E*.chk узнать имя файла, в котором находится информация
-из контрольной точки фиксации журналов
-eseutil /mk .\E18.chk узнать последний файл журнала,
-действия из которого были занесены в БД Exchange
-Checkpoint: (0x561299,8,16) 561299 имя файла, который был
-последним зафиксирован (его информация уже в базе данных)
-Находим в проводнике файл E0500561299.txt, можно удалять все файлы
-журналов, которые старше найденного файла
Восстановление БД (если две копии БД с ошибкой):
-Get-MailboxDatabaseCopyStatus -Identity db_name\* | Format-List Name,Status,ContentIndexState
-Status : FailedAndSuspended
-ContentIndexState : Failed
-Status : Dismounted
-ContentIndexState : Failed
Get-MailboxDatabase -Server exch-mx-01 -Status | fl Name,EdbFilePath,LogFolderPath
-проверить расположение базы и транзакционных логов
-LogFolderPath - директория логов
-E18 - имя транкзакционного лога (из него читаются остальные логи)
-dismount-Database db_name отмантировать БД
-eseutil /mh D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb
-проверить базу
-State: Dirty Shutdown - несогласованное состояние, означает, что часть
-транзакций не перенесена в базу, например, после того, как была
-осуществлена аварийная перезагрузка сервера.
-eseutil /ml E:\MS_Exchange_2010\MailBox\db_name\E18
-проверка целостности транзакционных логи, если есть логи транзакций и
-они не испорчены, то можно восстановить из них, из файла E18 считываются
-все логи, должен быть статус - ОК
Soft Recovery (мягкое восстановление) - необходимо перевести базу в
-состояние корректного отключения (Clear shutdown) путем записи
-недостающих файлов журналов транзакций в БД.
-eseutil /R E18 /l E:\MS_Exchange_2010\MailBox\db_name\ /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb
-eseutil /R E18 /a /i /l E:\MS_Exchange_2010\MailBox\db_name\ /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb
-если с логами что-то не так, можно попробовать восстановить базу
-игнорируя ошибку в логах
-eseutil /mk D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb
-cостоянии файла контрольных точек
-eseutil /g D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb
-проверка целостности БД
-eseutil /k D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb
-проверка контрольных сумм базы (CRC)
Hard Recovery - если логи содержат ошибки и база не
-восстанавливается, то восстанавливаем базу без логов.
-eseutil /p D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb
-/p - удалит поврежденные страницы, эта информация будет удалена из БД и
-восстановит целостность
-esetuil /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb
-выполнить дефрагментацию (если был потерян большой объем данных, то
-может сильно снизиться производительность)
-После выполнения команд необходимо вручную удалить все файлы с
-расширением log в папке MDBDATA, перед попыткой смонтировать базу
-данных.
-isinteg -s "db_name.edb" -test alltests проверьте
-целостность базы данных
-isinteg -s "server_name" -fix -test -alltests если проверка
-будет провалена. Выполнять команду до тех пор, пока у всех ошибок не
-станет статус 0 или статус не перестанет меняться, иногда необходимо 3
-прохода для достижения результата.
-eseutil /mh D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb | Select-String -Pattern "State:","Log Required:"
-проверить статус
-State: Clear shutdown - успешный статус
-Log Required требуются ли файлы журналов, необходимые базе,
-чтобы перейти в согласованное состояние. Если база размонтирована
-корректно, то это значение будет равняться 0.
-mount-Database -force db_name примонтировать БД
-Get-MailboxDatabase –Status db_name | fl Mounted статус
-БД
-New-MailboxRepairRequest -Database db_name -CorruptionType SearchFolder,AggregateCounts,ProvisionedFolder,FolderView
-восстановление логической целостности данных
-После этого восстановить Index.
-Если индексы не восстанавливаются, но БД монтируется, то перенести
-почтовые ящики в новую БД.
Восстановление БД из Backup:
-1-й вариант: 1. Отмантировать текущую БД и удалить или переименовать -директорию с файлами текущей БД. 3. Восстановить в ту же директорию из -Backup базу с логами. 4. Запустить мягкое восстановление БД (Soft -Recovery). 5. Примониторвать.
-2-й вариант: 1. Отмантировать и удалить текущую БД. 2. Восстановить -БД с логами из Backup в любое место. 3. Запустить мягкое восстановление -БД (Soft Recovery). 4. Создать новую БД. 5. Создать Recovery Database и -смонтировать в нее восстановленную из бэкапа БД, скопировать из неё -почтовые ящики в новую БД и переключить на них пользователей. 6. Если -использовать Dial Tone Recovery, то так же перенести из временной БД -промежуточные данные почтовых ящиков.
-3-й вариант: 1. Восстановить целостность Soft Repair или Hard
-Recovery. 2. Создать новую БД. Указывать в свойствах: «база может быть
-перезаписана при восстановлении». 3. Если база была только что оздана и
-еще не была подмонтирована, то эта папка будет пуста, туда перемещаем
-базу из Backup, которая была обработана ESEUTIL вместе со всеми файлами.
-Указать имя .edb такое же, которое было при создании новой базы. 4.
-Монтируем базу. 5. Перенацеливаем ящики со старой (Mailbox_DB_02),
-неисправной базы, на новую базу (Mailbox_DB_02_02):
-Get-Mailbox -Database Mailbox_DB_02 | where {$_.ObjectClass -NotMatch '(SystemAttendantMailbox|ExOleDbSystemMailbox)'} | Set-Mailbox -Database Mailbox_DB_02_02
-6. Восстановление логической целостности данных:
-New-MailboxRepairRequest -Database "Mailbox_DB_02_02" -CorruptionType ProvisionedFolder, SearchFolder, AggregateCounts, Folderview
Get-Mailbox -Database "MailboxDB" | Set-Mailbox -Database "TempDB"
-перенацелить ящики с одной БД (нерабочей) на другую (пустую)
-Get-Mailbox -Database TempDB отобразить почтовые ящики в БД
-TempDB
-Restart-Service MSExchangeIS перезапустить службу Mailbox
-Information Store (банка данных), иначе пользователи будут по-прежнему
-пытаться подключиться к старой БД
-iisreset
-Get-Mailbox -Database "TempDB" | Set-Mailbox -Database "MailboxDB"
-после восстановления старой БД, нужно переключить пользователей с
-временной БД обратно
-После этого сделать слияние с временной БД с помощью Recovery.
New-MailboxDatabase –Recovery –Name RecoveryDB –Server $exch_mx –EdbFilePath "D:\TempDB\TempDB.edb" -LogFolderPath "D:\TempDB"
-для переноса новых писем из временной БД в основную необходим только сам
-файл TempDB.edb со статусом Clean Shutdown, из нее необходимо создать
-служебную БД (ключ -Recovery)
-Mount-Database "D:\TempDB\TempDB.edb" примонтировать
-БД
-Get-MailboxStatistics -Database RecoveryDB
-New-MailboxRestoreRequest –SourceDatabase RecoveryDB –SourceStoreMailbox support –TargetMailbox support
-скопировать данные почтового ящика с DisplayName: support из RecoveryDB
-в почтовый ящик с псевдонимом support существующей базы. По умолчанию
-ищет в почтовой базе совпадающие LegacyExchangeDN либо проверяет
-совпадение адреса X500, если нужно восстановить данные в другой ящик,
-нужно указывать ключ -AllowLegacyDNMisMatch
-New-MailboxRestoreRequest –SourceDatabase RecoveryDB –SourceStoreMailbox support –TargetMailbox support –TargetRootFolder "Restore"
-скопировать письма в отдельную папку в ящике назначения (создается
-автоматически), возможно восстановить содержимое конкретной папки
--IncludeFolders “#Inbox#”
-Get-MailboxRestoreRequest | Get-MailboxRestoreRequestStatistics
-статус запроса восстановления
-Get-MailboxRestoreRequestStatistics -Identity support
-Get-MailboxRestoreRequest -Status Completed | Remove-MailboxRestoreRequest
-удалить все успешные запросы
Get-TransportServer $srv_cas | select MaxConcurrentMailboxDeliveries,MaxConcurrentMailboxSubmissions,MaxConnectionRatePerMinute,MaxOutboundConnections,MaxPerDomainOutboundConnections,PickupDirectoryMaxMessagesPerMinute
-настройки пропускной способности транспортного сервера
-MaxConcurrentMailboxDeliveries — максимальное количество одновременных
-потоков, которое может открыть сервер для отправки писем.
-MaxConcurrentMailboxSubmissions — максимальное количество одновременных
-потоков, которое может открыть сервер для получения писем.
-MaxConnectionRatePerMinute — максимальное возможная скорость открытия
-входящих соединений в минуту.
-MaxOutboundConnections — максимальное возможное количество соединений,
-которое может открыть Exchange для отправки.
-MaxPerDomainOutboundConnections — максимальное возможное количество
-исходящих соединений, которое может открыть Exchange для одного
-удаленного домена.
-PickupDirectoryMaxMessagesPerMinute — скорость внутренней обработки
-сообщений в минуту (распределение писем по папкам).
-Set-TransportServer exchange-cas -MaxConcurrentMailboxDeliveries 21 -MaxConcurrentMailboxSubmissions 21 -MaxConnectionRatePerMinute 1201 -MaxOutboundConnections 1001 -MaxPerDomainOutboundConnections 21 -PickupDirectoryMaxMessagesPerMinute 101
-изменить значения
Get-TransportConfig | select MaxSendSize, MaxReceiveSize
-ограничение размера сообщения на уровне траспорта (наименьший приоритет,
-после коннектора и почтового ящика).
-New-TransportRule -Name AttachmentLimit -AttachmentSizeOver 15MB -RejectMessageReasonText "Sorry, messages with attachments over 15 MB are not accepted"
-создать транспортное правило для проверки размера вложения
Get-ReceiveConnector | select Name,MaxMessageSize,RemoteIPRanges,WhenChanged
-ограничения размера сообщения на уровне коннектора (приоритет ниже, чем
-у почтового ящика)
-Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MaxMessageSize 30Mb
-изменить размер у последнего коннектора в списке (приоритет выше, чем у
-траспорта)
-Get-Mailbox "support4" | select MaxSendSize, MaxReceiveSize
-наивысший приоритет
-Set-Mailbox "support4" -MaxSendSize 30MB -MaxReceiveSize 30MB
-изменить размер
Set-SendConnector -Identity "ConnectorName" -Port 26
-изменить порт коннектора отправки
-Get-SendConnector "proxmox" | select port
Get-ReceiveConnector | select Name,MaxRecipientsPerMessage
-по умолчанию Exchange принимает ограниченное количество адресатов в
-одном письме (200)
-Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MaxRecipientsPerMessage 50
-изменить значение
-Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MessageRateLimit 1000
-задать лимит обработки сообщений в минуту для коннектора
Get-OfflineAddressbook | Update-OfflineAddressbook
-обновить OAB
-Get-ClientAccessServer | Update-FileDistributionService
New-MailboxExportRequest -Mailbox $name -filepath "\\$srv\pst\$name.PST" # -ContentFilter {(Received -lt "01/01/2021")} -Priority Highest/Lower # -IsArchive
-выполнить экспорт из архива пользователя
-New-MailboxExportRequest -Mailbox $name -IncludeFolders "#Inbox#" -FilePath "\\$srv\pst\$name.PST"
-только папку входящие
-New-MailboxImportRequest -Mailbox $name "\\$srv\pst\$name.PST"
-импорт из PST
-Get-MailboxExportRequest статус запросов
-Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest
-удалить успешно завершенные запросы
-Remove-MailboxExportRequest -RequestQueue MBXDB01 -RequestGuid 25e0eaf2-6cc2-4353-b83e-5cb7b72d441f
-отменить экспорт
Get-DistributionGroup список групп рассылки
-Get-DistributionGroupMember "!_Офис" список пользователей в
-группе
-Add-DistributionGroupMember -Identity "!_Офис" -Member "$name@$domain"
-добавить в группу рассылки
-Remove-DistributionGroupMember -Identity "!_Офис" -Member "$name@$domain"
-New-DistributionGroup -Name "!_Тест" -Members "$name@$domain"
-создать группу
-Set-DistributionGroup -Identity "support4" -HiddenFromAddressListsEnabled $true (или Set-Mailbox)
-скрыть из списка адресов Exchange
Search-Mailbox -Identity "support4" -SearchQuery 'Тема:"Mikrotik DOWN"'
-поиск писем по теме
-Search-Mailbox -Identity "support4" -SearchQuery 'Subject:"Mikrotik DOWN"'
-Search-Mailbox -Identity "support4" -SearchQuery 'attachment -like:"*.rar"'
-Search-Mailbox -Identity "support4" -SearchQuery "отправлено: < 01/01/2020" -DeleteContent -Force
-удаление писем по дате
Формат даты в зависимости от региональных настроек сервера:
-20/07/2018
-07/20/2018
-20-Jul-2018
-20/July/2018
Get-AdminAuditLogConfig настройки аудита
-Set-Mailbox -Identity "support4" -AuditOwner HardDelete
-добавить логирование HardDelete писем
-Set-mailbox -identity "support4" -AuditlogAgelimit 120
-указать время хранения
-Get-mailbox -identity "support4" | Format-list Audit*
-данные аудита
-Search-MailboxAuditLog -Identity "support4" -LogonTypes Delegate -ShowDetails -Start "2022-02-22 18:00" -End "2022-03-22 18:00"
-просмотр логов
-Search-AdminAuditLog -StartDate "02/20/2022" | ft CmdLetName,Caller,RunDate,ObjectModified -Autosize
-поиск событий истории выполненых команд в журнале аудита Exchange
Test-ServiceHealth проверить доступность ролей сервера:
-почтовых ящиков, клиентского доступа, единой системы обмена сообщениями,
-траспортного сервера
-$mx_srv_list | %{Test-MapiConnectivity -Server $_} проверка
-подключения MX-серверов к БД
-Test-MAPIConnectivity -Database $db проверка возможности
-логина в базу
-Test-MAPIConnectivity –Identity $user@$domain проверка
-возможности логина в почтовый ящик
-Test-ComputerSecureChannel проверка работы службы AD
-Test-MailFlow результат тестового потока почты
Get-TransportServer | %{Get-Queue -Server $_.Name}
-отобразить очереди на всех транспортных серверах
-Get-Queue -Identity EXCHANGE-CAS\155530 | Format-List
-подробная информация об очереди
-Get-Queue -Identity EXCHANGE-CAS\155530 | Get-Message -ResultSize Unlimited | Select FromAddress,Recipients
-отобразить список отправителей (FromAddress) и список получателей в
-очереди (Recipients)
-Get-Message -Queue EXCHANGE-CAS\155530 отобразить
-индентификатор сообщений в конкретной очереди (серверписьма)
-Resume-Message EXCHANGE-CAS\155530\444010 повторить
-отправку письма из очереди
-Retry-Queue -Filter {Status -eq "Retry"} принудительно
-повторить отправку всех сообщений c статусом “Повторить”
-Get-Queue -Identity EXCHANGE-CAS\155530 | Get-Message -ResultSize unlimited | Remove-Message -WithNDR $False
-очистить очередь
-Get-transportserver EXCHANGE-CAS | Select MessageExpirationTimeout
-отобразить время жизни сообщений в очереди (по умолчанию, 2 дня)
Error Exchange 452 4.3.1 Insufficient system resources - окончание
-свободного места на диске, на котором находятся очереди службы Exchange
-Hub Transport, за мониторинг отвечает компонент доступных ресурсов Back
-Pressure, который в том числе отслеживает свободное место на диске
-Порог Medium (90%) — перестать принимать по SMTP почту от внешних
-отправителей (почта от MAPI клиентов при этом обрабатывается)
-Порог High (99%) — обработка потока почты полностью прекращается
-Решение: очистить, например логи IIS (C:3SVC1), увеличить размер диска,
-отключить мониторинг Back Pressure (плохой вариант) или перенести
-транспортные очередь на другой диск достаточного объёма.
Get-Service | ? name -like "MSExchangeTransport" | Stop-Service
-остановить служу очереди
-Rename-Item "C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\Queue" "C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\Queue_old"
-очистить базу очереди
-C:\Program Files\Microsoft\Exchange Server\V15\Bin\EdgeTransport.exe.config
-конфигурационный файл, который содержит путь к бд с очередью (блок
-
-Для переноса БД, необходимо переместить существующие файлы базы данных
-Mail.que и Trn.chk (контрольные точки для отслеживания записи в логах)
-из исходного местоположения в новое. Переместите существующие файлы
-журнала транзакций Trn.log, Trntmp.log, Trn nnnn.log , Trnres00001.jrs,
-Trnres00002.jrs и Temp.edb из старого расположения в новое. tmp.edb —
-временный файл для проверки схемы самой базы, перености не нужно.
-После запуска службы транспорта удалить старую базу данных очереди и
-файлы журнала транзакций из старого расположения.
Get-MailboxDatabase -Status | ft Name, DatabaseSize, AvailableNewMailboxSpace
-DatabaseSize - текущий размер базы
-AvailableNewMailboxSpace - объём пустых страниц, пространство, которое
-можно освободить при дефрагментации
-(DatabaseSize — AvailableNewMailboxSpace) x 1,1 - необходимо
-дополнительно иметь свободного места не менее 110% от текущего размера
-базы (без учета пустых страниц)
-cd $path
-Dismount-Database "$path\$db_name" отмонтировать БД
-eseutil /d "$path\$db_name.edb"
-Mount-Database "$path\$db" примонтировать БД
Install-WindowsFeature -Name Failover-Clustering -ComputerName EXCH-MX-01
-основывается на технологии Windows Server Failover Cluster
-New-DatabaseAvailabilityGroup -Name dag-01 -WitnessServer fs-05 -WitnessDirectory C:\witness_exchange1
-создать группу с указанием файлового свидетеля для кворума
-Quorum - это процесс голосования, в котором для принятия решения нужно
-иметь большинство голосов, что бы сделать текущую копию базы данных
-активной.
-WitnessDirectory — используется для хранения данных файлового
-ресурса-свидетеля.
-Set-DatabaseAvailabilityGroup dag-01 –DatabaseAvailabilityGroupIPAdress $ip
-изменить ip-адрес группы
-Get-DatabaseAvailabilityGroup список всех групп
-Get-DatabaseAvailabilityGroup -Identity dag-01
-Add-DatabaseAvailabilityGroupServer -Identity dag-01 -MailboxServer EXCH-MX-01
-добавить первый сервер (все БД на серверах в DAG должны храниться по
-одинаковому пути)
-Add-MailboxDatabaseCopy -Identity db_name -MailboxServer EXCH-MX-04
-добавить копию БД
-Get-MailboxDatabaseCopyStatus -Identity db_name\* | select Name,Status,LastInspectedLogTime
-статус и время последнего копирования журнала транзакий
Status:
-Mounted - рабочая база
-Suspended - приостановлено копирование
-Healthy - рабочая пассивная копия
-ServiceDown - недоступна (выключен сервер)
-Dismounted - отмонтирована
-FailedAndSuspended - ошибка и приостановка копирования
-Resynchronizing - процесс синхронизация, где будет постепенно
-уменьшаться длина очереди
-CopyQueue Length - длина репликационной очереди копирования (0 - значит
-все изменения из активной базы реплицированы в пассивную копию)
Resume-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04
-возобновить (Resume) или запустить копирование бд на EXCH-MX-04 (из
-статуса Suspended в Healthy)
-Suspend-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04
-остановить копирование (в статус Suspended)
-Update-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -DeleteExistingFiles
-обновить копию БД (сделать Full Backup)
-Set-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -ActivationPreference 1
-изменить приоритет для активации копий БД (какую использовать, 1 – самое
-высокое значение)
-Move-ActiveMailboxDatabase db_name -ActivateOnServer EXCH-MX-04 -MountDialOverride:None -Confirm:$false
-включить копию БД в DAG (переключиться на активную копию)
-Remove-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -Confirm:$False
-удалить копии пассивной базы в DAG-группе (у БД должно быть отключено
-ведение циклического журнала)
-Remove-DatabaseAvailabilityGroupServer -Identity dag-01 -MailboxServer EXCH-MX-04 -ConfigurationOnly
-удалить MX сервер из группы DAG
-Import-Module FailoverClusters
-Get-ClusterNode EXCH-MX-04 | Remove-ClusterNode -Force
-удалить отказавший узел из Windows Failover Cluster
Get-DatabaseAvailabilityGroup | Get-DatabaseAvailabilityGroupHealth
-мониторинг
Get-MailboxDatabaseCopyStatus * | select name,status,ContentIndexState,ContentIndexErrorMessage,ActiveDatabaseCopy,LatestCopyBackupTime,CopyQueueLength
-узнать состояние работы индксов БД и текст ошибки, на каком сервере
-активная копия БД, дата последней копии и текущая очередь
-Get-MailboxDatabaseCopyStatus -Identity $db_name\* | Format-List Name,ContentIndexState
-отобразить список всех копий конкретной БД на всех серверах, и статус их
-индексов, если у второго сервера статус Healthy, можно восстановить из
-него
-Get-MailboxDatabaseCopyStatus -Identity $db_name\EXCH-MX-04 | Update-MailboxDatabaseCopy -SourceServer EXCH-MX-01 -CatalogOnly
-восстановить БД из копии
-cd %PROGRAMFILES%\Microsoft\Exchange Server\V14\Scripts или
-v15 для Exchange 2016
-.\ResetSearchIndex.ps1 $db_name скрипт восстановления
-индекса
Get-MailboxDatabaseCopyStatus * | where {$_.ContentIndexState -eq "Failed" -or $_.ContentIndexState -eq "FailedAndSuspended"}
-отобразить у какой БД произошел сбой работы (FailedAndSuspended) или
-индекса (ContentIndexState)
import-Module TrueNas
-(Get-Module TrueNas).ExportedCommands
-Connect-TrueNasServer -Server tnas-01 -SkipCertificateCheck
-Get-TrueNasCertificate настройки сертификата
-Get-TrueNasSetting настройки языка, time zone, syslog level
-и server, https port
-Get-TrueNasUser список пользователей
-Get-TrueNasSystemVersion характеристики (Physical Memory,
-Model, Cores) и Uptime
-Get-TrueNasSystemAlert snmp для оповещений
-Get-TrueNasSystemNTP список используемых NTP серверов
-Get-TrueNasDisk список разделов физического диска
-Get-TrueNasInterface сетевые интерфейсы
-Get-TrueNasGlobalConfig сетевые настройки
-Get-TrueNasDnsServer настроенные DNS-сервера
-Get-TrueNasIscsiTarget отобразить ID группы инициаторов
-использующих таргет, используемый portal, authentification и
-authen-method
-Get-TrueNasIscsiInitiator отобразить группы
-инициаторов
-Get-TrueNasIscsiPortal слушатель (Listen) и порт
-Get-TrueNasIscsiExtent список ISCSi Target (статус работы,
-путь)
-Get-TrueNasPool список pool (Id, Path, Status,
-Healthy)
-Get-TrueNasVolume -Type FILESYSTEM список pool файловых
-систем
-Get-TrueNasVolume -Type VOLUME список разделов в pool и их
-размер
-Get-TrueNasService | ft список служб и их статус
-Start-TrueNasService ssh запустить службу
-Stop-TrueNasService ssh остановить службу
Set-ExecutionPolicy AllSigned or Set-ExecutionPolicy
-Bypass -Scope Process
-Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
-choco install veeam-backup-and-replication-console
-Get-Module Veeam.Backup.PowerShell
-Get-Command -Module Veeam.Backup.PowerShell or
-Get-VBRCommand
-Connect-VBRServer -Server $srv -Credential $cred or -User
-and -Password- Port 9392 default
-Get-VBRJob
-Get-VBRCommand *get*backup*
-Get-VBRComputerBackupJob
-Get-VBRBackup
-Get-VBRBackupRepository
-Get-VBRBackupSession
-Get-VBRBackupServerCertificate
-Get-VBRRestorePoint
-Get-VBRViProxy
$url = "https://habr.com/ru/rss/users/Lifailon/publications/articles/?fl=ru"
-RSS лента публикаций на Habr
-Invoke-RestMethod $url
-$iwr = Invoke-WebRequest -Uri $url
-$iwr | Get-Member
-$iwr.Content
-$iwr.StatusCode -eq 200
-$iwr.Headers
-$iwr.ParsedHtml | Select lastModified
-$iwr.Links | fl title,innerText,href
-$iwr.Images.src
GET - Read
-POST - Create
-PATCH - Partial update/modify
-PUT - Update/replace
-DELETE - Remove
function Download-Image {
-param (
- [Parameter(Mandatory = $True)]$url
-)
- $folder = $url -replace "http.+://" -replace "/","-" -replace "-$"
- $path = "$home\Pictures\$folder"
- if (Test-Path $path) {
- Remove-Item $path -Recurse -Force
- New-Item -ItemType Directory $path > $null
- } else {
- New-Item -ItemType Directory $path > $null
- }
- $irm = Invoke-WebRequest -Uri $url
- foreach ($img in $irm.Images.src) {
- $name = $img -replace ".+/"
- Start-Job {
- Invoke-WebRequest $using:img -OutFile "$using:path\$using:name"
- } > $null
- }
- while ($True){
- $status_job = (Get-Job).State[-1]
- if ($status_job -like "Completed"){
- Get-Job | Remove-Job -Force
- break
- }}
- $count_all = $irm.Images.src.Count
- $count_down = (Get-Item $path\*).count
- "Downloaded $count_down of $count_all files to $path"
-}Download-Image -url https://losst.pro/
https://veeam-11:9419/swagger/ui/index.html
-$Header = @{
-"x-api-version" = "1.0-rev2"
-}
-$Body = @{
-"grant_type" = "password"
-"username" = "$login"
-"password" = "$password"
-}
-$vpost = iwr "https://veeam-11:9419/api/oauth2/token" -Method POST -Headers $Header -Body $Body -SkipCertificateCheck
-$vtoken = (($vpost.Content) -split '"')[3]$token = $vtoken | ConvertTo-SecureString -AsPlainText –Force
-$vjob = iwr "https://veeam-11:9419/api/v1/jobs" -Method GET -Headers $Header -Authentication Bearer -Token $token -SkipCertificateCheck
-
-$Header = @{
-"x-api-version" = "1.0-rev1"
-"Authorization" = "Bearer $vtoken"
-}
-$vjob = iwr "https://veeam-11:9419/api/v1/jobs" -Method GET -Headers $Header -SkipCertificateCheck
-$vjob = $vjob.Content | ConvertFrom-Json
-
-$vjob = Invoke-RestMethod "https://veeam-11:9419/api/v1/jobs" -Method GET -Headers $Header -SkipCertificateCheck
-$vjob.data.virtualMachines.includes.inventoryObjectStart-PodeServer {
- Add-PodeEndpoint -Address localhost -Port "8080" -Protocol "HTTP"
- ### Get info endpoints
- Add-PodeRoute -Path "/" -Method "GET" -ScriptBlock {
- Write-PodeJsonResponse -Value @{
- "service"="/api/service";
- "process"="/api/process"
- }
- }
- ### GET
- Add-PodeRoute -Path "/api/service" -Method "GET" -ScriptBlock {
- Write-PodeJsonResponse -Value $(
- Get-Service | Select-Object Name,@{
- Name="Status"; Expression={[string]$_.Status}
- },@{
- Name="StartType"; Expression={[string]$_.StartType}
- } | ConvertTo-Json
- )
- }
- Add-PodeRoute -Path "/api/process" -Method "GET" -ScriptBlock {
- Write-PodeJsonResponse -Value $(
- Get-Process | Sort-Object -Descending CPU | Select-Object -First 15 ProcessName,
- @{Name="ProcessorTime"; Expression={$_.TotalProcessorTime -replace "\.\d+$"}},
- @{Name="Memory"; Expression={[string]([int]($_.WS / 1024kb))+"MB"}},
- @{Label="RunTime"; Expression={((Get-Date) - $_.StartTime) -replace "\.\d+$"}}
- )
- }
- Add-PodeRoute -Path "/api/process-html" -Method "GET" -ScriptBlock {
- Write-PodeHtmlResponse -Value (
- Get-Process | Sort-Object -Descending CPU | Select-Object -First 15 ProcessName,
- @{Name="ProcessorTime"; Expression={$_.TotalProcessorTime -replace "\.\d+$"}},
- @{Name="Memory"; Expression={[string]([int]($_.WS / 1024kb))+"MB"}},
- @{Label="RunTime"; Expression={((Get-Date) - $_.StartTime) -replace "\.\d+$"}} # Auto ConvertTo-Html
- )
- }
- ### POST
- Add-PodeRoute -Path "/api/service" -Method "POST" -ScriptBlock {
- # https://pode.readthedocs.io/en/latest/Tutorials/WebEvent/
- # $WebEvent | Out-Default
- $Value = $WebEvent.Data["ServiceName"]
- $Status = (Get-Service -Name $Value).Status
- Write-PodeJsonResponse -Value @{
- "Name"="$Value";
- "Status"="$Status";
- }
- }
-}irm http://localhost:8080/api/service -Method Get
-irm http://localhost:8080/api/process -Method Get
-http://localhost:8080/api/process-html использовать
-браузер
-irm http://localhost:8080/api/service -Method Post -Body @{"ServiceName" = "AnyDesk"}
Invoke-Expression(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/Deploy-Selenium/rsa/Deploy-Selenium-Drivers.ps1")
-установка всех драйверов и Chromium соответствующий версии для
-драйвера
$path = "$home\Documents\Selenium\"
-$log = "$path\ChromeDriver.log"
-$ChromeDriver = "$path\ChromeDriver.exe"
-$WebDriver = "$path\WebDriver.dll"
-$SupportDriver = "$path\WebDriver.Support.dll"
-$Chromium = (Get-ChildItem $path -Recurse | Where-Object Name -like chrome.exe).FullName
-Add-Type -Path $WebDriver
-Add-Type -Path $SupportDriver
-try {
- $ChromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions # создаем объект с настройками запуска браузера
- $ChromeOptions.BinaryLocation = $Chromium # передаем путь до исполняемого файла, который отвечает за запуск браузера
- $ChromeOptions.AddArgument("start-maximized") # добавляем аргумент, который позволяет запустить браузер на весь экран
- #$ChromeOptions.AddArgument("start-minimized") # запускаем браузер в окне
- #$ChromeOptions.AddArgument("window-size=400,800") # запускаем браузер с заданными размерам окна в пикселях
- $ChromeOptions.AcceptInsecureCertificates = $True # игнорировать предупреждение на сайтах с не валидным сертификатом
- #$ChromeOptions.AddArgument("headless") # скрывать окно браузера при запуске
- $ChromeDriverService = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService($ChromeDriver) # создаем объект настроек службы драйвера
- $ChromeDriverService.HideCommandPromptWindow = $True # отключаем весь вывод логирования драйвера в консоль (этот вывод нельзя перенаправить)
- $ChromeDriverService.LogPath = $log # указать путь до файла с журналом
- $ChromeDriverService.EnableAppendLog = $True # не перезаписывать журнал при каждом новом запуске
- #$ChromeDriverService.EnableVerboseLogging = $True # кроме INFO и ошибок, записывать DEBUG сообщения
- $Selenium = New-Object OpenQA.Selenium.Chrome.ChromeDriver($ChromeDriverService, $ChromeOptions) # инициализируем запуск с указанными настройками
-
- $Selenium.Navigate().GoToUrl("https://google.com") # переходим по указанной ссылке в браузере
- #$Selenium.Manage().Window.Minimize() # свернуть окно браузера после запуска и перехода по нужному url (что бы считать страницу корректно)
- # Ищем поле для ввода текста:
- $Search = $Selenium.FindElements([OpenQA.Selenium.By]::Id('APjFqb'))
- $Search = $Selenium.FindElements([OpenQA.Selenium.By]::XPath('//*[@id="APjFqb"]'))
- $Search = $Selenium.FindElements([OpenQA.Selenium.By]::Name('q'))
- $Search = $Selenium.FindElements([OpenQA.Selenium.By]::XPath('//*[@name="q"]'))
- $Search = $Selenium.FindElements([OpenQA.Selenium.By]::ClassName('gLFyf'))
- $Search = $Selenium.FindElements([OpenQA.Selenium.By]::CssSelector('[jsname="yZiJbe"]'))
- $Search = $Selenium.FindElements([OpenQA.Selenium.By]::TagName('textarea')) | Where-Object ComputedAccessibleRole -eq combobox
- $Search.SendKeys("calculator online") # передаем текст выбранному элементу
- $Search.SendKeys([OpenQA.Selenium.Keys]::Enter) # нажимаем Enter для вызова функции поиска
-
- Start-Sleep 1
- $div = $Selenium.FindElements([OpenQA.Selenium.By]::TagName("div"))
- $2 = $div | Where-Object {($_.ComputedAccessibleRole -eq "button") -and ($_.ComputedAccessibleLabel -eq "2")}
- $2.Click()
- $2.Click()
- $plus = $div | Where-Object {($_.ComputedAccessibleRole -eq "button") -and ($_.Text -eq "+")}
- $plus.Click()
- $3 = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector('[jsname="KN1kY"]'))
- $3.Click()
- $3.Click()
- $sum = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector('[jsname="Pt8tGc"]'))
- $sum.Click()
- $result = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector('[jsname="VssY5c"]')).Text
- Write-Host "Result: $result" -ForegroundColor Green
-}
-finally {
- $Selenium.Close()
- $Selenium.Quit()
-}
-Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-GPT/Get-GPT.psm1 | Out-File -FilePath "$(New-Item -Path "$($($Env:PSModulePath -split ";")[0])\Get-GPT" -ItemType Directory -Force)\Get-GPT.psm1" -ForceGet-GPT "Исполняй роль калькулятора. Посчитай сумму чисел: 22+33"
Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-Translation/Get-Translation.psm1 | Out-File -FilePath "$(New-Item -Path "$($($Env:PSModulePath -split ";")[0])\Get-Translation" -ItemType Directory -Force)\Get-Translation.psm1" -ForceGet-Translation -Provider DeepL -Text "I translating the text"
-Get-Translation -Provider DeepL -Text "Я перевожу текст"
-Get-Translation -Provider Google -Text "I translating the text"
-Get-Translation -Provider Google -Text "Я перевожу текст" -Language en
Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-SpeedTest/Get-SpeedTest.psm1 | Out-File -FilePath "$(New-Item -Path "$($($Env:PSModulePath -split ";")[0])\Get-SpeedTest" -ItemType Directory -Force)\Get-SpeedTest.psm1" -ForceGet-SpeedTest -Provider Libre
-Get-SpeedTest -Provider Open
-Get-SpeedTest -Provider Ookla
$ie.document.IHTMLDocument3_getElementsByTagName("input") | select name
-получить имена всех Input Box
-$ie.document.IHTMLDocument3_getElementsByTagName("button") | select innerText
-получить имена всех Button
-$ie.Document.documentElement.innerHTML прочитать сырой Web
-Content (<input name=“login” tabindex=“100” class=“input__control
-input__input” id=“uniq32005644019429136” spellcheck=“false”
-placeholder=“Логин”)
-$All_Elements = $ie.document.IHTMLDocument3_getElementsByTagName("*")
-забрать все элементы
-$Go_Button = $All_Elements | ? innerText -like "go" поиск
-элемента по имени
-$Go_Button | select ie9_tagName получить TagName (SPAN) для
-быстрого дальнейшего поиска
-$SPAN_Elements = $ie.document.IHTMLDocument3_getElementsByTagName("SPAN")
$ie = New-Object -ComObject InternetExplorer.Application
-$ie.navigate("https://yandex.ru")
-$ie.visible = $true
-$ie.document.IHTMLDocument3_getElementByID("login").value = "Login"
-$ie.document.IHTMLDocument3_getElementByID("passwd").value = "Password"
-$Button_Auth = ($ie.document.IHTMLDocument3_getElementsByTagName("button")) | ? innerText -match "Войти"
-$Button_Auth.Click()
-$Result = $ie.Document.documentElement.innerHTML
-$ie.Quit()$wshell = New-Object -ComObject Wscript.Shell
-$wshell | Get-Member
-$link = $wshell.CreateShortcut("$Home\Desktop\Yandex.lnk")
-создать ярлык
-$link | Get-Member
-$link.TargetPath = "https://yandex.ru" куда ссылается
-(метод TargetPath объекта $link где хранится
-объект CreateShortcut) \
-`$link.Save()` сохранить
Set-WinUserLanguageList -LanguageList en-us,ru -Force
-изменить языковую раскладку клавиатуры
(New-Object -ComObject Wscript.shell).SendKeys([char]173)
-включить/выключить звук
-$wshell.Exec("notepad.exe") запустить приложение
-$wshell.AppActivate("Блокнот") развернуть запущенное
-приложение
$wshell.SendKeys("Login") текст
-$wshell.SendKeys("{A 5}") напечатать букву 5 раз
-подряд
-$wshell.SendKeys("%{TAB}") ALT+TAB
-$wshell.SendKeys("^") CTRL
-$wshell.SendKeys("%") ALT
-$wshell.SendKeys("+") SHIFT
-$wshell.SendKeys("{DOWN}") вниз
-$wshell.SendKeys("{UP}") вверх
-$wshell.SendKeys("{LEFT}") влево
-$wshell.SendKeys("{RIGHT}") вправо
-$wshell.SendKeys("{PGUP}") PAGE UP
-$wshell.SendKeys("{PGDN}") PAGE DOWN
-$wshell.SendKeys("{BACKSPACE}") BACKSPACE/BKSP/BS
-$wshell.SendKeys("{DEL}") DEL/DELETE
-$wshell.SendKeys("{INS}") INS/INSERT
-$wshell.SendKeys("{PRTSC}") PRINT SCREEN
-$wshell.SendKeys("{ENTER}")
-$wshell.SendKeys("{ESC}")
-$wshell.SendKeys("{TAB}")
-$wshell.SendKeys("{END}")
-$wshell.SendKeys("{HOME}")
-$wshell.SendKeys("{BREAK}")
-$wshell.SendKeys("{SCROLLLOCK}")
-$wshell.SendKeys("{CAPSLOCK}")
-$wshell.SendKeys("{NUMLOCK}")
-$wshell.SendKeys("{F1}")
-$wshell.SendKeys("{F12}")
-$wshell.SendKeys("{+}{^}{%}{~}{(}{)}{[}{]}{{}{}}")
function Get-AltTab {
-(New-Object -ComObject wscript.shell).SendKeys("%{Tab}")
-Start-Sleep $(Get-Random -Minimum 30 -Maximum 180)
-Get-AltTab
-}
-Get-AltTab$wshell = New-Object -ComObject Wscript.Shell
-$output = $wshell.Popup("Выберите действие?",0,"Заголовок",4)
-if ($output -eq 6) {"yes"} elseif ($output -eq 7) {"no"} else {"no good"}
Type:
-0 ОК
-1 ОК и Отмена
-2 Стоп, Повтор, Пропустить
-3 Да, Нет, Отмена
-4 Да и Нет
-5 Повтор и Отмена
-16 Stop
-32 Question
-48 Exclamation
-64 Information
-
-Output:
--1 Timeout
-1 ОК
-2 Отмена
-3 Стоп
-4 Повтор
-5 Пропустить
-6 Да
-7 Нет
-$wshell = New-Object -ComObject WScript.Network
-$wshell | Get-Member
-$wshell.UserName
-$wshell.ComputerName
-$wshell.UserDomain
$wshell = New-Object -ComObject Shell.Application
-$wshell | Get-Member
-$wshell.Explore("C:\")
-$wshell.Windows() | Get-Member получить доступ к открытым в
-проводнике или браузере Internet Explorer окон
$shell = New-Object -Com Shell.Application
-$RecycleBin = $shell.Namespace(10)
-$RecycleBin.Items()
$Outlook = New-Object -ComObject Outlook.Application
-$Outlook | Get-Member
-$Outlook.Version
$Outlook = New-Object -ComObject Outlook.Application
-$Namespace = $Outlook.GetNamespace("MAPI")
-$Folder = $namespace.GetDefaultFolder(4)` исходящие
-$Folder = $namespace.GetDefaultFolder(6)` входящие
-$Explorer = $Folder.GetExplorer()
-$Explorer.Display()
-$Outlook.Quit()(New-Object -com 'Microsoft.Update.AutoUpdate').Settings
-(New-Object -com 'Microsoft.Update.AutoUpdate').Results
-(New-Timespan -Start ((New-Object -com 'Microsoft.Update.AutoUpdate').Results|Select -ExpandProperty LastInstallationSuccessDate) -End (Get-Date)).hours
-кол-во часов, прошедших с последней даты установки обновления
-безопасности в Windows.
[System.Diagnostics.EventLog] | select Assembly,Module
-$EventLog = [System.Diagnostics.EventLog]::new("Application")
-$EventLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application,192.168.3.100
-$EventLog | Get-Member -MemberType Method
-$EventLog.MaximumKilobytes максимальный размер
-журнала
-$EventLog.Entries просмотреть журнал
-$EventLog.Clear() очистить журнал
Join-Path C: Install Test
-[System.IO.Path]::Combine("C:", "Install", "Test")
[System.Math] | Get-Member -Static -MemberType Methods
-[System.Math]::Max(2,7)
-[System.Math]::Min(2,7)
-[System.Math]::Floor(3.9)
-[System.Math]::Truncate(3.9)
Add-Type -AssemblyName System.Web
-[System.Web.Security.Membership]::GeneratePassword(10,2)
$CriticalSound = New-Object System.Media.SoundPlayer
-$CriticalSound.SoundLocation = "C:\WINDOWS\Media\Windows Critical Stop.wav"
-$CriticalSound.Play()
-
-$GoodSound = New-Object System.Media.SoundPlayer
-$GoodSound.SoundLocation = "C:\WINDOWS\Media\tada.wav"
-$GoodSound.Play()[System.Environment] | Get-Member -Static
-[System.Environment]::OSVersion
-[System.Environment]::Version
-[System.Environment]::MachineName
-[System.Environment]::UserName
[System.Diagnostics.Process] | Get-Member -Static
-[System.Diagnostics.Process]::Start('notepad.exe')
$cSource = @'
-using System;
-using System.Drawing;
-using System.Runtime.InteropServices;
-using System.Windows.Forms;
-public class Clicker
-{
-//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
-[StructLayout(LayoutKind.Sequential)]
-struct INPUT
-{
- public int type; // 0 = INPUT_MOUSE,
- // 1 = INPUT_KEYBOARD
- // 2 = INPUT_HARDWARE
- public MOUSEINPUT mi;
-}
-//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx
-[StructLayout(LayoutKind.Sequential)]
-struct MOUSEINPUT
-{
- public int dx ;
- public int dy ;
- public int mouseData ;
- public int dwFlags;
- public int time;
- public IntPtr dwExtraInfo;
-}
-//This covers most use cases although complex mice may have additional buttons
-//There are additional constants you can use for those cases, see the msdn page
-const int MOUSEEVENTF_MOVED = 0x0001 ;
-const int MOUSEEVENTF_LEFTDOWN = 0x0002 ;
-const int MOUSEEVENTF_LEFTUP = 0x0004 ;
-const int MOUSEEVENTF_RIGHTDOWN = 0x0008 ;
-const int MOUSEEVENTF_RIGHTUP = 0x0010 ;
-const int MOUSEEVENTF_MIDDLEDOWN = 0x0020 ;
-const int MOUSEEVENTF_MIDDLEUP = 0x0040 ;
-const int MOUSEEVENTF_WHEEL = 0x0080 ;
-const int MOUSEEVENTF_XDOWN = 0x0100 ;
-const int MOUSEEVENTF_XUP = 0x0200 ;
-const int MOUSEEVENTF_ABSOLUTE = 0x8000 ;
-const int screen_length = 0x10000 ;
-//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx
-[System.Runtime.InteropServices.DllImport("user32.dll")]
-extern static uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
-public static void LeftClickAtPoint(int x, int y)
-{
- //Move the mouse
- INPUT[] input = new INPUT[3];
- input[0].mi.dx = x*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width);
- input[0].mi.dy = y*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);
- input[0].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE;
- //Left mouse button down
- input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
- //Left mouse button up
- input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;
- SendInput(3, input, Marshal.SizeOf(input[0]));
-}
-}
-'@Add-Type -TypeDefinition $cSource -ReferencedAssemblies System.Windows.Forms,System.Drawing
-[Clicker]::LeftClickAtPoint(1900,1070)
Add-Type -Language CsharpVersion3 -TypeDefinition @"
-using System.Runtime.InteropServices;
-[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
-interface IAudioEndpointVolume {
-// f(), g(), ... are unused COM method slots. Define these if you care
-int f(); int g(); int h(); int i();
-int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
-int j();
-int GetMasterVolumeLevelScalar(out float pfLevel);
-int k(); int l(); int m(); int n();
-int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
-int GetMute(out bool pbMute);
-}
-[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
-interface IMMDevice {
-int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
-}
-[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
-interface IMMDeviceEnumerator {
-int f(); // Unused
-int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
-}
-[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }
-public class Audio {
-static IAudioEndpointVolume Vol() {
-var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
-IMMDevice dev = null;
-Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
-IAudioEndpointVolume epv = null;
-var epvid = typeof(IAudioEndpointVolume).GUID;
-Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
-return epv;
-}
-public static float Volume {
-get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;}
-set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));}
-}
-public static bool Mute {
-get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
-set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
-}
-}
-"@[Audio]::Volume = 0.50
-[Audio]::Mute = $true
Function:
-https://learn.microsoft.com/ru-ru/windows/win32/api/lmshare/nf-lmshare-netsessionenum?redirectedfrom=MSDN
-Source: https://fuzzysecurity.com/tutorials/24.html
function Invoke-NetSessionEnum {
-param (
-[Parameter(Mandatory = $True)][string]$HostName
-)
-Add-Type -TypeDefinition @"
-using System;
-using System.Diagnostics;
-using System.Runtime.InteropServices;
-[StructLayout(LayoutKind.Sequential)]
-public struct SESSION_INFO_10
-{
- [MarshalAs(UnmanagedType.LPWStr)]public string OriginatingHost;
- [MarshalAs(UnmanagedType.LPWStr)]public string DomainUser;
- public uint SessionTime;
- public uint IdleTime;
-}
-public static class Netapi32
-{
-[DllImport("Netapi32.dll", SetLastError=true)]
- public static extern int NetSessionEnum(
- [In,MarshalAs(UnmanagedType.LPWStr)] string ServerName,
- [In,MarshalAs(UnmanagedType.LPWStr)] string UncClientName,
- [In,MarshalAs(UnmanagedType.LPWStr)] string UserName,
- Int32 Level,
- out IntPtr bufptr,
- int prefmaxlen,
- ref Int32 entriesread,
- ref Int32 totalentries,
- ref Int32 resume_handle);
-
-[DllImport("Netapi32.dll", SetLastError=true)]
- public static extern int NetApiBufferFree(
- IntPtr Buffer);
-}
-"@
-# Create SessionInfo10 Struct
-$SessionInfo10 = New-Object SESSION_INFO_10
-$SessionInfo10StructSize = [System.Runtime.InteropServices.Marshal]::SizeOf($SessionInfo10)` Grab size to loop bufptr
-$SessionInfo10 = $SessionInfo10.GetType()` Hacky, but we need this ;))
-# NetSessionEnum params
-$OutBuffPtr = [IntPtr]::Zero` Struct output buffer
-$EntriesRead = $TotalEntries = $ResumeHandle = 0` Counters & ResumeHandle
-$CallResult = [Netapi32]::NetSessionEnum($HostName, "", "", 10, [ref]$OutBuffPtr, -1, [ref]$EntriesRead, [ref]$TotalEntries, [ref]$ResumeHandle)
-if ($CallResult -ne 0){
-echo "Mmm something went wrong!`nError Code: $CallResult"
-}
-else {
-if ([System.IntPtr]::Size -eq 4) {
-echo "`nNetapi32::NetSessionEnum Buffer Offset --> 0x$("{0:X8}" -f $OutBuffPtr.ToInt32())"
-}
-else {
-echo "`nNetapi32::NetSessionEnum Buffer Offset --> 0x$("{0:X16}" -f $OutBuffPtr.ToInt64())"
-}
-echo "Result-set contains $EntriesRead session(s)!"
-# Change buffer offset to int
-$BufferOffset = $OutBuffPtr.ToInt64()
-# Loop buffer entries and cast pointers as SessionInfo10
-for ($Count = 0; ($Count -lt $EntriesRead); $Count++){
-$NewIntPtr = New-Object System.Intptr -ArgumentList $BufferOffset
-$Info = [system.runtime.interopservices.marshal]::PtrToStructure($NewIntPtr,[type]$SessionInfo10)
-$Info
-$BufferOffset = $BufferOffset + $SessionInfo10StructSize
-}
-echo "`nCalling NetApiBufferFree, no memleaks here!"
-[Netapi32]::NetApiBufferFree($OutBuffPtr) |Out-Null
-}
-}Invoke-NetSessionEnum localhost
Function:
-https://learn.microsoft.com/ru-ru/windows/win32/api/winbase/nf-winbase-copyfile
-Source:
-https://devblogs.microsoft.com/scripting/use-powershell-to-interact-with-the-windows-api-part-1/
$MethodDefinition = @"
-[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
-public static extern bool CopyFile(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);
-"@
-$Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name "Kernel32" -Namespace "Win32" -PassThru
-$Kernel32::CopyFile("$($Env:SystemRoot)\System32\calc.exe", "$($Env:USERPROFILE)\Desktop\calc.exe", $False) Function: -https://learn.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser-showwindowasync
-$Signature = @"
-[DllImport("user32.dll")]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
-"@
-$ShowWindowAsync = Add-Type -MemberDefinition $Signature -Name "Win32ShowWindowAsync" -Namespace Win32Functions -PassThru
-$ShowWindowAsync | Get-Member -Static
-$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $pid).MainWindowHandle, 2)
-$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $Pid).MainWindowHandle, 3)
-$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $Pid).MainWindowHandle, 4)Function: -https://learn.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser-getasynckeystate
-Add-Type -AssemblyName System.Windows.Forms
-[int][System.Windows.Forms.Keys]::F1 определить номер [Int]
-клавиши по ее названию
-65..90 | % {"{0} = {1}" -f $_, [System.Windows.Forms.Keys]$_}
-порядковый номер букв (A..Z)
function Get-ControlKey {
-$key = 112
-$Signature = @'
-[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
-public static extern short GetAsyncKeyState(int virtualKeyCode);
-'@
-Add-Type -MemberDefinition $Signature -Name Keyboard -Namespace PsOneApi
-[bool]([PsOneApi.Keyboard]::GetAsyncKeyState($key) -eq -32767)
-}
-
-Write-Warning 'Press F1 to exit'
-while ($true) {
-Write-Host '.' -NoNewline
-if (Get-ControlKey) {
-break
-}
-Start-Sleep -Seconds 0.5
-}Source: -https://powershell.one/tricks/input-devices/detect-key-press
-[Console] | Get-Member -Static
-[Console]::BackgroundColor = "Blue"
-[Console]::OutputEncoding используемая кодировка в текущей
-сессии
-[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
-изменить кодировку для отображения кириллицы
-[Console]::outputEncoding = [System.Text.Encoding]::GetEncoding("cp866")
-для ISE
-[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("windows-1251")
-для ps2exe
-Get-Service | Out-File $home\Desktop\Service.txt -Encoding oem
->
-Get-Service | Out-File $home\Desktop\Service.txt -Append
->>
do {
-if ([Console]::KeyAvailable) {
-$keyInfo = [Console]::ReadKey($true)
-break
-}
-Write-Host "." -NoNewline
-sleep 1
-} while ($true)
-Write-Host
-$keyInfo
-
-function Get-KeyPress {
-param (
-[Parameter(Mandatory)][ConsoleKey]$Key,
-[System.ConsoleModifiers]$ModifierKey = 0
-)
-if ([Console]::KeyAvailable) {
-$pressedKey = [Console]::ReadKey($true)
-$isPressedKey = $key -eq $pressedKey.Key
-if ($isPressedKey) {
-$pressedKey.Modifiers -eq $ModifierKey
-} else {
-[Console]::Beep(1800, 200)
-$false
-}}}
-
-Write-Warning 'Press Ctrl+Shift+Q to exit'
-do {
-Write-Host "." -NoNewline
-$pressed = Get-KeyPress -Key Q -ModifierKey 'Control,Shift'
-if ($pressed) {break}
-sleep 1
-} while ($true)API: -https://learn.microsoft.com/en-us/dotnet/api/system.drawing?view=net-7.0&redirectedfrom=MSDN
-Add-Type -AssemblyName System.Drawing
-$Width = 800
-$Height = 400
-$image = New-Object System.Drawing.Bitmap($Width,$Height)
-$graphic = [System.Drawing.Graphics]::FromImage($image)
-$background_color = [System.Drawing.Brushes]::Blue # задать цвет фона (синий)
-$graphic.FillRectangle($background_color, 0, 0, $image.Width, $image.Height)
-$text_color = [System.Drawing.Brushes]::White # задать цвет текста (белый)
-$font = New-Object System.Drawing.Font("Arial", 20, [System.Drawing.FontStyle]::Bold) # задать шрифт
-$text = "PowerShell" # указать текст
-$text_position = New-Object System.Drawing.RectangleF(320, 180, 300, 100) # задать положение текста (x, y, width, height)
-$graphic.DrawString($text, $font, $text_color, $text_position) # нанести текст на изображение
-$image.Save("$home\desktop\powershell_image.bmp", [System.Drawing.Imaging.ImageFormat]::Bmp) # сохранить изображение
-$image.Dispose() # освобождение ресурсов$path = "$home\desktop\powershell_image.bmp"
-Invoke-Item $path
$src_image = [System.Drawing.Image]::FromFile($path)
-$Width = 400
-$Height = 200
-$dst_image = New-Object System.Drawing.Bitmap -ArgumentList $src_image, $Width, $Height # изменить размер изображения
-$dst_image.Save("$home\desktop\powershell_image_resize.bmp", [System.Drawing.Imaging.ImageFormat]::Bmp)
-
-$rotated_image = $src_image.Clone() # создать копию исходного изображения
-$rotated_image.RotateFlip([System.Drawing.RotateFlipType]::Rotate180FlipNone) # перевернуть изображение на 180 градусов
-$rotated_image.Save("$home\desktop\powershell_image_rotated.bmp", [System.Drawing.Imaging.ImageFormat]::Bmp)
-$src_image.Dispose() # закрыть (отпустить) исходный файл$Timer = New-Object System.Timers.Timer
-$Timer.Interval = 1000
-Register-ObjectEvent -InputObject $Timer -EventName Elapsed -SourceIdentifier Timer.Output -Action {
-$Random = Get-Random -Min 0 -Max 100
-Write-Host $Random
-}
-$Timer.Enabled = $True$Timer.Enabled = $False остановить
-$Timer | Get-Member -MemberType Event отобразить список
-всех событий объекта
-Get-EventSubscriber список зарегистрированных подписок на
-события в текущей сессии
-Unregister-Event -SourceIdentifier Timer.Output удаляет
-регистрацию подписки на событие по имени события (EventName) или все
-*
--Forward перенаправляет события из удаленного сеанса
-(New-PSSession) в локальный сеанс
--SupportEvent не выводит результат регистрации события на
-экран (и Get-EventSubscriber и Get-Job)
Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action {
-$date = Get-Date -f hh:mm:ss
-(New-Object -ComObject Wscript.Shell).Popup("PowerShell Exit: $date",0,"Action",64)
-}
-Source: -https://cloudbrothers.info/en/test-udp-connection-powershell/
-function Start-UDPServer {
-param(
-$Port = 5201
-)
-$RemoteComputer = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any, 0)
-do {
-$UdpObject = New-Object System.Net.Sockets.UdpClient($Port)
-$ReceiveBytes = $UdpObject.Receive([ref]$RemoteComputer)
-$UdpObject.Close()
-$ASCIIEncoding = New-Object System.Text.ASCIIEncoding
-[string]$ReturnString = $ASCIIEncoding.GetString($ReceiveBytes)
-[PSCustomObject]@{
-LocalDateTime = $(Get-Date -UFormat "%Y-%m-%d %T")
-ClientIP = $RemoteComputer.address.ToString()
-ClientPort = $RemoteComputer.Port.ToString()
-Message = $ReturnString
-}
-} while (1)
-}Start-UDPServer -Port 5201
function Test-NetUDPConnection {
-param(
-[string]$ComputerName = "127.0.0.1",
-[int32]$PortServer = 5201,
-[int32]$PortClient = 5211,
-$Message
-)
-begin {
-$UdpObject = New-Object system.Net.Sockets.Udpclient($PortClient)
-$UdpObject.Connect($ComputerName, $PortServer)
-}
-process {
-$ASCIIEncoding = New-Object System.Text.ASCIIEncoding
-if (!$Message) {$Message = Get-Date -UFormat "%Y-%m-%d %T"}
-$Bytes = $ASCIIEncoding.GetBytes($Message)
-[void]$UdpObject.Send($Bytes, $Bytes.length)
-}
-end {
-$UdpObject.Close()
-}
-}Test-NetUDPConnection -ComputerName 127.0.0.1 -PortServer 5201
-Test-NetUDPConnection -ComputerName 127.0.0.1 -PortServer 514 -Message "<30>May 31 00:00:00 HostName multipathd[784]: Test message"
function Start-TCPServer {
-param(
-$Port = 5201
-)
-do {
-$TcpObject = New-Object System.Net.Sockets.TcpListener($port)
-$ReceiveBytes = $TcpObject.Start()
-$ReceiveBytes = $TcpObject.AcceptTcpClient()
-$TcpObject.Stop()
-$ReceiveBytes.Client.RemoteEndPoint | select Address,Port
-} while (1)
-}Start-TCPServer -Port 5201
-Test-NetConnection -ComputerName 127.0.0.1 -Port 5201
Broadcast package consisting of 6 byte filled “0xFF” and then 96 byte -where the mac address is repeated 16 times
-function Send-WOL {
-param (
-[Parameter(Mandatory = $True)]$Mac,
-$IP,
-[int]$Port = 9
-)
-$Mac = $Mac.replace(":", "-")
-if (!$IP) {$IP = [System.Net.IPAddress]::Broadcast}
-$SynchronizationChain = [byte[]](,0xFF * 6)
-$ByteMac = $Mac.Split("-") | %{[byte]("0x" + $_)}
-$Package = $SynchronizationChain + ($ByteMac * 16)
-$UdpClient = New-Object System.Net.Sockets.UdpClient
-$UdpClient.Connect($IP, $port)
-$UdpClient.Send($Package, $Package.Length)
-$UdpClient.Close()
-}Send-WOL -Mac "D8-BB-C1-70-A3-4E"
-Send-WOL -Mac "D8-BB-C1-70-A3-4E" -IP 192.168.3.100
$ByteText = [System.Text.Encoding]::UTF8.GetBytes("password")
-$Text = [System.Text.Encoding]::UTF8.GetString($ByteText)
$text = "password"
-$byte = [System.Text.Encoding]::Unicode.GetBytes($text)
-$base64 = [System.Convert]::ToBase64String($byte)
-$decode_base64 = [System.Convert]::FromBase64String($base64)
-$decode_string = [System.Text.Encoding]::Unicode.GetString($decode_base64)
$path_image = "$home\Documents\1200x800.jpg"
-$BBase64 = [System.Convert]::ToBase64String((Get-Content $path_image -Encoding Byte))
-Add-Type -assembly System.Drawing
-$Image = [System.Drawing.Bitmap]::FromStream([IO.MemoryStream][Convert]::FromBase64String($BBase64))
-$Image.Save("$home\Desktop\1200x800.jpg")
$httpListener = New-Object System.Net.HttpListener
-$httpListener.Prefixes.Add("http://+:8888/")
-$httpListener.Start()
-while (!([console]::KeyAvailable)) {
-$info = Get-Service | select name,status | ConvertTo-HTML
-$context = $httpListener.GetContext()
-$context.Response.StatusCode = 200
-$context.Response.ContentType = 'text/HTML'
-$WebContent = $info
-$EncodingWebContent = [Text.Encoding]::UTF8.GetBytes($WebContent)
-$context.Response.OutputStream.Write($EncodingWebContent , 0, $EncodingWebContent.Length)
-$context.Response.Close()
-Get-NetTcpConnection -LocalPort 8888
-(Get-Date).datetime
-}
-$httpListener.Close()[System.Net.WebClient] | Get-Member
-(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/PowerShell-Commands/rsa/README.md")
function Get-WebCertificate ($srv) {
-$iwr = iwr $srv
-$status_code = $iwr.StatusCode
-$status = $iwr.BaseResponse.StatusCode
-$info = $iwr.BaseResponse.Server
-$spm = [System.Net.ServicePointManager]::FindServicePoint($srv)
-$date_end = $spm.Certificate.GetExpirationDateString()
-$cert_name = ($spm.Certificate.Subject) -replace "CN="
-$cert_owner = ((($spm.Certificate.Issuer) -split ", ") | where {$_ -match "O="}) -replace "O="
-$Collections = New-Object System.Collections.Generic.List[System.Object]
-$Collections.Add([PSCustomObject]@{
-Host = $srv;
-Server = $info;
-Status = $status;
-StatusCode = $status_code;
-Certificate = $cert_name;
-Issued = $cert_owner;
-End = $date_end
-})
-$Collections
-}Get-WebCertificate https://google.com
$path = "$home\Desktop\Services-to-Excel.xlsx"
-$Excel = New-Object -ComObject Excel.Application
-$Excel.Visible = $false` отключить открытие GUI
-$ExcelWorkBook = $Excel.Workbooks.Add()` Создать книгу
-$ExcelWorkSheet = $ExcelWorkBook.Worksheets.Item(1)` Создать лист
-$ExcelWorkSheet.Name = "Services"` задать имя листа
-$ExcelWorkSheet.Cells.Item(1,1) = "Name service"
-# Задать имена столбцов:
-$ExcelWorkSheet.Cells.Item(1,2) = "Description"
-$ExcelWorkSheet.Cells.Item(1,3) = "Status"
-$ExcelWorkSheet.Cells.Item(1,4) = "Startup type"
-$ExcelWorkSheet.Rows.Item(1).Font.Bold = $true` выделить жирным шрифтом
-$ExcelWorkSheet.Rows.Item(1).Font.size=14
-# Задать ширину колонок:
-$ExcelWorkSheet.Columns.Item(1).ColumnWidth=30
-$ExcelWorkSheet.Columns.Item(2).ColumnWidth=80
-$ExcelWorkSheet.Columns.Item(3).ColumnWidth=15
-$ExcelWorkSheet.Columns.Item(4).ColumnWidth=25
-$services = Get-Service
-$counter = 2` задать начальный номер строки для записи
-foreach ($service in $services) {
-$status = $service.Status
-if ($status -eq 1) {
-$status_type = "Stopped"
-} elseif ($status -eq 4) {
-$status_type = "Running"
-}
-$Start = $service.StartType
-if ($Start -eq 1) {
-$start_type = "Delayed start"
-} elseif ($Start -eq 2) {
-$start_type = "Automatic"
-} elseif ($Start -eq 3) {
-$start_type = "Manually"
-} elseif ($Start -eq 4) {
-$start_type = "Disabled"
-}
-$ExcelWorkSheet.Columns.Item(1).Rows.Item($counter) = $service.Name
-$ExcelWorkSheet.Columns.Item(2).Rows.Item($counter) = $service.DisplayName
-$ExcelWorkSheet.Columns.Item(3).Rows.Item($counter) = $status_type
-$ExcelWorkSheet.Columns.Item(4).Rows.Item($counter) = $start_type
-if ($status_type -eq "Running") {
-$ExcelWorkSheet.Columns.Item(3).Rows.Item($counter).Font.Bold = $true
-}
-$counter++` +1 увеличить для счетчика строки Rows
-}
-$ExcelWorkBook.SaveAs($path)
-$ExcelWorkBook.close($true)
-$Excel.Quit()$path = "$home\Desktop\Services-to-Excel.xlsx"
-$Excel = New-Object -ComObject Excel.Application
-$Excel.Visible = $false
-$ExcelWorkBook = $excel.Workbooks.Open($path)` открыть xlsx-файл
-$ExcelWorkBook.Sheets | select Name,Index` отобразить листы
-$ExcelWorkSheet = $ExcelWorkBook.Sheets.Item(1)` открыть лист по номеру Index
-1..100 | %{$ExcelWorkSheet.Range("A$_").Text}` прочитать значение из столбца А строки c 1 по 100
-$Excel.Quit()Install-Module -Name ImportExcel
-$data | Export-Excel .\Data.xlsx
-$data = Import-Excel .\Data.xlsx
$data = ps
-$Chart = New-ExcelChartDefinition -XRange CPU -YRange WS -Title "Process" -NoLegend
-$data | Export-Excel .\ps.xlsx -AutoNameRange -ExcelChartDefinition $Chart -Show
Get-Service | Select Name,DisplayName,Status,StartType | Export-Csv -path "$home\Desktop\Get-Service.csv" -Append -Encoding Default
-экспортировать в csv (-Encoding UTF8)
-Import-Csv "$home\Desktop\Get-Service.csv" -Delimiter ","
-импортировать массив
$data = ConvertFrom-Csv @"
-Region,State,Units,Price
-West,Texas,927,923.71
-$null,Tennessee,466,770.67
-"@$systeminfo = systeminfo /FO csv | ConvertFrom-Csv вывод
-работы программы в CSV и конвертация в объект
-$systeminfo."Полный объем физической памяти"
-$systeminfo."Доступная физическая память"
'
-log =
-{
- level = 4;
-};
-' | ConvertFrom-String` создает PSCustomObject (разбивает по пробелам, удаляет все пробелы и пустые строки)"
-key1 = value1
-key2 = value2
-" | ConvertFrom-StringData # создает Hashtable$xml = [xml](Get-Content $home\desktop\test.rdg)` прочитать содержимое XML-файла
-$xml.load("$home\desktop\test.rdg")` открыть файл
-$xml.RDCMan.file.group.properties.name` имена групп
-$xml.RDCMan.file.group.server.properties` имена всех серверов
-$xml.RDCMan.file.group[3].server.properties` список серверов в 4-й группе
-($xml.RDCMan.file.group[3].server.properties | ? name -like ADIRK).Name = "New-Name"` изменить значение
-$xml.RDCMan.file.group[3].server[0].properties.displayName = "New-displayName"
-$xml.RDCMan.file.group[3].server[1].RemoveAll()` удалить объект (2-й сервер в списке)
-$xml.Save($file)` сохранить содержимое объекта в файлаGet-Service | Export-Clixml -path $home\desktop\test.xml
-экспортировать объект PowerShell в XML
-Import-Clixml -Path $home\desktop\test.xml импортировать
-объект XML в PowerShell
-ConvertTo-Xml (Get-Service)
function Get-CredToXML {
- param (
- $CredFile = "$home\Documents\cred.xml"
- )
- if (Test-Path $CredFile) {
- Import-Clixml -path $CredFile
- }
- elseif (!(Test-Path $CredFile)) {
- $Cred = Get-Credential -Message "Enter credential"
- if ($Cred -ne $null) {
- $Cred | Export-CliXml -Path $CredFile
- $Cred
- }
- else {
- return
- }
- }
-}$Cred = Get-CredToXML
-$Login = $Cred.UserName
-$PasswordText = $Cred.GetNetworkCredential().password
-получить пароль в текстовом виде
$XmlWriterSettings = New-Object System.Xml.XmlWriterSettings
-$XmlWriterSettings.Indent = $true` включить отступы
-$XmlWriterSettings.IndentChars = " "` задать отступ
-
-$XmlFilePath = "$home\desktop\test.xml"
-$XmlObjectWriter = [System.XML.XmlWriter]::Create($XmlFilePath, $XmlWriterSettings)` создать документ
-$XmlObjectWriter.WriteStartDocument()` начать запись в документ
-
-$XmlObjectWriter.WriteComment("Comment")
-$XmlObjectWriter.WriteStartElement("Root")` создать стартовый элемент, который содержит дочерние объекты
- $XmlObjectWriter.WriteStartElement("Configuration")` создать первый дочерний элемент для BaseSettings
- $XmlObjectWriter.WriteElementString("Language","RU")
- $XmlObjectWriter.WriteStartElement("Fonts") # <Fonts>
- $XmlObjectWriter.WriteElementString("Name","Arial")
- $XmlObjectWriter.WriteElementString("Size","12")
- $XmlObjectWriter.WriteEndElement() # </Fonts>
- $XmlObjectWriter.WriteEndElement()` конечный элемент </Configuration>
-$XmlObjectWriter.WriteEndElement()` конечный элемент </Root>
-
-$XmlObjectWriter.WriteEndDocument()` завершить запись в документ
-$XmlObjectWriter.Flush()
-$XmlObjectWriter.Close()$xml = [xml](gc $home\desktop\test.xml)
-$xml.Root.Configuration.Fonts
-$NewElement = $xml.CreateElement("Fonts")` выбрать элемент куда добавить
-$NewElement.set_InnerXML("<Name>Times New Roman</Name><Size>14</Size>")` Заполнить значениями дочерние элементы Fonts
-$xml.Root.Configuration.AppendChild($NewElement)` добавить элемент новой строкой в Configuration (родитель Fonts)
-$xml.Save("$home\desktop\test.xml")$log = '
-{
- "log": {
- "level": 7
- }
-}
-' | ConvertFrom-Json
-
-Get-Service | ConvertTo-Json
-
-$OOKLA = '
-{
-"result" :
-{"date":1683534970,"id":"14708271987","connection_icon":"wireless","download":33418,"upload":35442,"latency":15,"distance":50,"country_code":"RU","server_id":2707,"server_name":"Bryansk","sponsor_name":"DOM.RU","sponsor_url":null,"connection_mode":"multi","isp_name":"Resource Link","isp_rating":"4.0","test_rank":63,"test_grade":"B-","test_rating":4,"idle_latency":"17","download_latency":"116","upload_latency":"75","additional_servers":
-[{"server_id":8191,"server_name":"Bryansk","sponsor_name":"SectorTelecom.ru"},{"server_id":46278,"server_name":"Fokino","sponsor_name":"Fokks - Promyshlennaya avtomatika Ltd."},{"server_id":18218,"server_name":"Bryansk","sponsor_name":"RIA-link Ltd."}],
-"path":"result\u002F14708271987","hasSecondary":true
-}
-}
-' | ConvertFrom-Json
-$ookla.resultImport-Module PSYaml` используется в Docker/Ansible
-$netplan = "
-network:` словарь по типу - ключ : значение с вложенными словарями
- ethernets:
- ens160:
- dhcp4: yes
- dhcp6: no
- nameservers:
- addresses:` [8.8.8.8, 1.1.1.1]` список данных (строк)
- - 8.8.8.8
- - 1.1.1.1
- version: 2
-"
-$network = ConvertFrom-Yaml $netplan
-$network.Values.ethernets.ens160.nameservers
-
-$DataType = "
-int: !!int 10.1
-flo: !!float 10.1
-str: !!str string
-bool: !!bool` boolean
-"function ConvertFrom-Html {
- param (
- [Parameter(ValueFromPipeline)]$url
- )
- $irm = Invoke-RestMethod $url
- $HTMLFile = New-Object -ComObject HTMLFile
- $Bytes = [System.Text.Encoding]::Unicode.GetBytes($irm)
- $HTMLFile.write($Bytes)
- ($HTMLFile.all | where {$_.tagname -eq "body"}).innerText
-}
-
-$apache_status = "http://192.168.3.102/server-status"
-$apache_status | ConvertFrom-HtmlGet-Process | select Name, CPU | ConvertTo-Html -As Table > "$home\desktop\proc-table.html"
-вывод в формате List (Format-List) или Table (Format-Table)
$servers = "ya.ru","ya.com","google.com"
-$path = "$home\Desktop\Ping.html"
-$header = @"
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<title>Отчет о статусе серверов</title>
-<style type="text/css">
-<!--
-body {
-background-color: #E0E0E0;
-font-family: sans-serif
-}
-table, th, td {
-background-color: white;
-border-collapse:collapse;
-border: 1px solid black;
-padding: 5px
-}
--->
-</style>
-"@
-$body = @"
-<h1>Ping status</h1>
-<p>$(get-date -Format "dd.MM.yyyy hh:mm").</p>
-"@
-$results = foreach ($server in $servers) {
- if (Test-Connection $server -Count 1 -ea 0 -Quiet) {
- $status = "Up"
- }
- else {
- $status = "Down"
- }
- [PSCustomObject]@{
- Name = $server
- Status = $status
- }
-}
-$results | ConvertTo-Html -head $header -body $body | foreach {
- $_ -replace "<td>Down</td>","<td style='background-color:#FF8080'>Down</td>" -replace "<td>Up</td>","<td style='background-color:#5BCCF3'>Up</td>"
-} | Out-File $path
-Invoke-Item $pathImport-Module PSWriteHTML
-(Get-Module PSWriteHTML).ExportedCommands
-Get-Service | Out-GridHtml -FilePath ~\Desktop\Get-Service-Out-GridHtml.htmlImport-Module HtmlReport
-$topVM = ps | Sort PrivateMemorySize -Descending | Select -First 10 | %{,@(($_.ProcessName + " " + $_.Id), $_.PrivateMemorySize)}
-$topCPU = ps | Sort CPU -Descending | Select -First 10 | %{,@(($_.ProcessName + " " + $_.Id), $_.CPU)}
-New-Report -Title "Piggy Processes" -Input {
-New-Chart Bar "Top VM Users" -input $topVm
-New-Chart Column "Top CPU Overall" -input $topCPU
-ps | Select ProcessName, Id, CPU, WorkingSet, *MemorySize | New-Table "All Processes"
-} > ~\Desktop\Get-Process-HtmlReport.html$path = "$home\Documents\Get-Service.db"
-$Module = Get-Module MySQLite
-if ($Module -eq $null) {
-Install-Module MySQLite -Repository PSGallery -Scope CurrentUser
-}
-Import-Module MySQLite
-New-MySQLiteDB -Path $path # создать БД
-Invoke-MySQLiteQuery -Path $path -Query "CREATE TABLE Service (Name TEXT NOT NULL, DisplayName TEXT NOT NULL, Status TEXT NOT NULL);" # создать таблицу
-
-$Service = Get-Service | select Name,DisplayName,Status
-foreach ($S in $Service) {
-$Name = $S.Name
-$DName = $S.DisplayName
-$Status = $S.Status
-Invoke-MySQLiteQuery -Path $path -Query "INSERT INTO Service (Name, DisplayName, Status) VALUES ('$Name', '$DName', '$Status');"
-}(Get-MySQLiteDB $path).Tables список таблиц в базе
-Invoke-MySQLiteQuery -Path $path -Query "SELECT name FROM sqlite_master WHERE type='table';"
-список таблиц в базе
-Invoke-MySQLiteQuery -Path $path -Query "DROP TABLE Service;"
-удалить таблицу
$TableName = "Service"
-Invoke-MySQLiteQuery -Path $path -Query "SELECT * FROM $TableName" # прочитать содержимое таблицы (в формате объекта)Get-Service | select Name,DisplayName,Status | ConvertTo-MySQLiteDB -Path $path -TableName Service -force
-конвертировать объект в таблицу
$Connection = New-SQLiteConnection -DataSource $path
-$Connection.ChangePassword("password")
-$Connection.Close()
-Invoke-SqliteQuery -Query "SELECT * FROM Service" -DataSource "$path;Password=password"apt -y install mysql-server mysql-client
-mysql -V
-systemctl status mysql
-mysqladmin -u root password задать пароль root
nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
-user = mysql
-# pid-file = /var/run/mysqld/mysqld.pid
-# socket = /var/run/mysqld/mysqld.sock
-# port = 3306
-# datadir = /var/lib/mysql
-# tmpdir = /tmp
-bind-address = 0.0.0.0
-mysqlx-bind-address = 0.0.0.0
-log_error = /var/log/mysql/error.log
-systemctl restart mysql
-ss -tulnp | grep 3306
-ufw allow 3306/tcp
-nc -zv 192.168.1.253 3306
-tnc 192.168.1.253 -p 3306
mysql -u root -p
-SELECT user(), now(), version();
-quit;
mysql -u root -p -e 'SHOW TABLES FROM db_aduser;'
-отобразить список таблиц без подключения к консоли MySQL
CREATE создать БД, пользователя, таблицу
-ALTER управление столбцами таблице
-DROP удалить БД, пользователя, таблицу
-USE выбрать БД
-SHOW вывесли список БД, прав доступа пользователя (GRANTS),
-названия столбцов и их свойства
-GRANT дать доступ пользователю к БД
-REVOKE удалить доступ пользователя к БД
-UPDATE изменить права доступа, значения с таблице
-FLUSH обновить права доступа
-SELECT отобразить выбранную БД, вывести список
-пользователей, выборка данных в таблице
-INSERT внести данные
-DELETE удалить данные в (FROM) таблице
VARCHAR(N) строка переменной длины, в формате ASCII, где
-один символ занимает 1 байт, числом N указывается максимальная возможная
-длина строки
-NVARCHAR(N) строка переменной длины, в формате Unicode, где
-один символ занимает 2 байта
-CHAR(N)/nchar(N) строка фиксированной длины, которая всегда
-дополняется справа пробелами до длины N и в базе данных она занимает
-ровно N символов
-INT целое число, от -2147483648 до 2147483647, занимает 4
-байта
-FLOAT число, в котором может присутствовать десятичная
-точка (запятая)
-BIT флаг, Да - 1 или Нет - 0
-DATE формат даты, например 25.05.2023
-TIME 23:30:55.1234567
-DATETIME 25.05.2023 23:30:55.1234567
SHOW databases; # вывести список БД
-CREATE DATABASE db_aduser; # создать БД
-CREATE DATABASE db_rep DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; # создать БД с кодировкой UTF-8
-DROP DATABASE db_rep; # удалить БД
-USE db_aduser; # выбрать/переключиться на выбранную БД
-SELECT database(); # отобразить выбранную БД
-SELECT USER,HOST FROM mysql.user; # вывести список УЗ
-CREATE USER posh@localhost IDENTIFIED BY '1qaz!QAZ'; # создать УЗ, которая будет подключаться с локального сервера
-CREATE USER posh@localhost IDENTIFIED BY '1qaz!QAZ'; # создать УЗ, которая будет подключаться с указанного сервера
-CREATE USER posh@'192.168.3.99' IDENTIFIED BY '1qaz!QAZ'; # УЗ для доступа с конкретного сервера
-CREATE USER 'admin'@'%' IDENTIFIED BY 'Admin12#'; # УЗ для доступа с любого сервера (% - wildcard)
-DROP USER posh@localhost; # удалить пользователя
-SHOW GRANTS FOR posh@'%'; # отобразить права доступа пользователя
-GRANT ALL PRIVILEGES ON db_aduser.* TO posh@'192.168.3.99'; # полный доступ для posh к БД db_aduser
-GRANT ALL PRIVILEGES ON *.* TO posh@'%'; # доступ к всем БД c любого клиентского хоста
-GRANT SELECT,DELETE ON mysql.* TO posh@'%'; # права SELECT и DELETE на встроенную БД mysql
-REVOKE DELETE ON mysql.* FROM posh@'%'; # удалить доступ DELETE
-UPDATE mysql.user SET super_priv='Y' WHERE USER='posh' AND host='%'; # изменить привелегии для пользователя
-SELECT USER,HOST,super_priv FROM mysql.user; # список УЗ и таблица с правами SUPER privilege
-FLUSH PRIVILEGES; # обновить права доступа
-SHOW TABLES; # отобразить список всех таблиц
-SHOW TABLES LIKE '%user'; # поиск таблицы по wildcard-имени
-CREATE TABLE table_aduser (id INT NOT NULL AUTO_INCREMENT, Name VARCHAR(100), email VARCHAR(100), PRIMARY KEY (ID)); # создать таблицу
-DROP TABLE table_aduser; # удалить таблицу
-SHOW COLUMNS FROM table_aduser; # отобразить название стобцов и их свойства
-ALTER TABLE table_aduser DROP COLUMN id; # удалить столбец id
-ALTER TABLE table_aduser ADD COLUMN info VARCHAR(10); # добавить столбец info
-ALTER TABLE table_aduser CHANGE info new_info VARCHAR(100); # изменить имя столбца info на new_info и его тип данных
-ALTER TABLE table_aduser ADD COLUMN (id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (ID)); # добавить столбец id
-INSERT table_aduser (Name,email) VALUES ('Alex','no-email');
-INSERT table_aduser (Name,email) VALUES ('Alex','no-email');
-INSERT table_aduser (Name) VALUES ('Support');
-INSERT table_aduser (Name) VALUES ('Jack');
-SELECT * FROM table_aduser; # содержимое всех стобцов в выбранной (FROM) таблице
-SELECT Name,email FROM table_aduser; # содержимое указанных стобцов
-SELECT DISTINCT Name,Email FROM table_aduser; # отобразить уникальные записи (без повторений)
-SELECT * FROM table_aduser ORDER BY Name; # отсортировать по Name
-SELECT * FROM table_aduser ORDER BY Name DESC; # обратная сортировка
-SELECT COUNT(*) FROM table_aduser; # количество строк в таблице
-SELECT COUNT(new_info) FROM table_aduser; # количество строк в столбце
-NOT; AND; OR # по приоритетам условий
-SELECT * FROM table_aduser WHERE Name = 'Alex'; # поиск по содержимому
-SELECT * FROM table_aduser WHERE NOT Name != 'Alex'; # условие NOT где Name не равен значению
-SELECT * FROM table_aduser WHERE email != ''; # вывести строки, где содержимое email не рано null
-SELECT * FROM table_aduser WHERE email != '' OR id > 1000; # или id выше 1000
-SELECT * FROM table_aduser WHERE Name RLIKE "support"; # регистронезависемый (RLIKE) поиск
-SELECT * FROM table_aduser WHERE Name RLIKE "^support"; # начинаются только с этого словосочетания
-SELECT * FROM table_aduser WHERE Name RLIKE "alex"; # найти и проверить значения перед удалением
-DELETE FROM table_aduser WHERE Name RLIKE "alex"; # Query OK, 2 rows affected # удалено две строки
-DELETE FROM table_aduser; # удалить ВСЕ значения
-SELECT * FROM table_aduser WHERE Name = 'Jack'; # найти и проверить значение перед изменением
-UPDATE table_aduser SET Name = 'Alex' WHERE Name = 'Jack'; # изменить значение 'Jack' на 'Alex'
-UPDATE db_aduser.table_aduser SET Name='BCA' WHERE id=1; # изменить значение в строке с ID 1
-CHECK TABLE db_aduser.table_aduser; # проверить
-ANALYZE TABLE db_aduser.table_aduser; # анализировать
-OPTIMIZE TABLE db_aduser.table_aduser; # оптимизировать
-REPAIR TABLE db_aduser.table_aduser; # восстановить
-TRUNCATE TABLE db_aduser.table_aduser; # очистить
-mysqldump -u root -p --databases db_aduser > /bak/db_aduser.sql
-mysql -u root -p db_aduser < /bak/db_aduser.sql
-
-crontab -e
-00 22 * * * /usr/bin/mysqldump -uroot -p1qaz!QAZ db_zabbix | /bin/bzip2 > `date +/dump/zabbix/zabbix-\%d-\%m-\%Y-\%H:\%M.bz2`
-00 23 * * * /usr/bin/mysqldump -uroot -p1qaz!QAZ db_zabbix > `date +/dump/smb/zabbix-\%d-\%m-\%Y-\%H:\%M.sql`
-0 0 * * * find /dump/zabbix -mtime +7 -exec rm {} \;
-
-mysqldump -u root --single-transaction db_zabbix > /dump/zabbix/db_zabbix.sql
-mysql -u user_zabbix -p -e 'CREATE DATABASE db_zabbix;'
-mysql -u user_zabbix -p db_zabbix < /root/db_zabbix.sql
-sed -i '/innodb_force_recovery/d' /etc/mysql/my.cnf # удалить
-mode=6; sed -i "/^\[mysqld\]/{N;s/$/\ninnodb_force_recovery=$mode/}" /etc/mysql/my.cnf # добавить mode 6
-systemctl restart mysql
-
-[mysqld]
-innodb_force_recovery=1 # сервер пытается начать работу независимо от того, есть ли поврежденные данные InnoDB или нет
-innodb_force_recovery=2 # удается восстановить работу за счет остановки потока команд, которые были частично выполнены или не выполнены (не запускает фоновые операции)
-innodb_force_recovery=3 # отменяет откат после восстановления поврежденных файлов (не пытается откатить транзакции)
-innodb_force_recovery=6 # запуск СУБД в режиме read only
-$ip = "192.168.1.253"
-$user = "posh"
-$pass = "1qaz!QAZ"
-$db = "db_aduser"
-Add-Type –Path "$home\Documents\MySQL-Connector-NET\8.0.31-4.8\MySql.Data.dll"
-$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{
-ConnectionString="server=$ip;uid=$user;pwd=$pass;database=$db"
-}
-$Connection.Open()
-$Command = New-Object MySql.Data.MySqlClient.MySqlCommand
-$Command.Connection = $Connection
-$UserList = Get-ADUser -filter * -properties name,EmailAddress
-foreach ($user in $UserList) {
-$uname=$user.Name
-$uemail=$user.EmailAddress
-$Command.CommandText = "INSERT INTO table_aduser (Name,Email) VALUES ('$uname','$uemail')"
-$Command.ExecuteNonQuery()
-}
-$Connection.Close()$ip = "192.168.1.253"
-$user = "posh"
-$pass = "1qaz!QAZ"
-$db = "db_aduser"
-Add-Type –Path "$home\Documents\MySQL-Connector-NET\8.0.31-4.8\MySql.Data.dll"
-$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{
-ConnectionString = "server=$ip;uid=$user;pwd=$pass;database=$db"
-}
-$Connection.Open()
-$Command = New-Object MySql.Data.MySqlClient.MySqlCommand
-$Command.Connection = $Connection
-$MYSQLDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter
-$MYSQLDataSet = New-Object System.Data.DataSet
-$Command.CommandText = "SELECT * FROM table_aduser"
-$MYSQLDataAdapter.SelectCommand = $Command
-$NumberOfDataSets = $MYSQLDataAdapter.Fill($MYSQLDataSet, "data")
-$Collections = New-Object System.Collections.Generic.List[System.Object]
-foreach($DataSet in $MYSQLDataSet.tables[0]) {
-$Collections.Add([PSCustomObject]@{
-Name = $DataSet.name;
-Mail = $DataSet.email
-})
-}
-$Connection.Close()
-$Collectionswget -qO- https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
-импортировать GPG-ключ для репозитория
-https://packages.microsoft.com/config/ubuntu/ выбрать
-репозиторий и скопировать URL
-add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list)"
-apt-get update обновить список пакетов
-apt-get install mssql-server
-/opt/mssql/bin/mssql-conf setup скрипт начальной
-конфигурации (выбрать редакцию, 3 - express и русский язык 9 из
-11)
-systemctl status mssql-server
-curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
-установить клиент
-curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | tee /etc/apt/sources.list.d/msprod.list
-apt-get update
-apt-get install mssql-tools
-echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
-добавить в домашний каталог файла bashrc, что бы не писать путь к
-исполняемому файлу
-export PATH="$PATH:/opt/mssql-tools/bin"
-iptables -I INPUT 1 -p tcp --dport 1433 -j ACCEPT
sqlcmd -S localhost -U SA
-CREATE DATABASE itinvent
-go
-SELECT name FROM master.dbo.sysdatabases
-go
-$user = "itinvent"
-$pass = "itinvent"
-$db = "itinvent"
-$srv = "192.168.3.103"
-$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
-$SqlConnection.ConnectionString = "server=$srv;database=$db;user id=$user;password=$pass;Integrated Security=false"
-
-$SqlCommand = New-Object System.Data.SqlClient.SqlCommand` класс формата команды
-$SqlCommand.CommandText = "SELECT * FROM ITINVENT.dbo.USERS"` отобразить содержимое таблицы
-#$SqlCommand.CommandText = "SELECT LICENCE_DATE,DESCR,MODEL_NO,TYPE_NO FROM ITINVENT.dbo.ITEMS where LICENCE_DATE IS NOT NULL"
-$SqlCommand.Connection = $SqlConnection` передать формат подключения
-$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter` создать адаптер подключения для выполнения SELECT запросов к БД
-$SqlAdapter.SelectCommand = $SqlCommand` передать команду
-
-$DataSet = New-Object System.Data.DataSet` создать объект приема данных формата XML
-$SqlAdapter.Fill($DataSet)` заполнить данными полученные от адаптера (возвращает кол-во объектов)
-$SqlConnection.Close()
-$Data = $DataSet.Tables
-$Data[0] | ft$user = "itinvent"
-$pass = "itinvent"
-$db = "db_test"
-$srv = "192.168.3.103"
-$sql = "INSERT INTO table_test (column_user) VALUES ('lifailon')"` добавить данные в таблицу table_test в колонку column_user
-$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
-$SqlConnection.ConnectionString = "server=$srv;database=$db;user id=$user;password=$pass;Integrated Security=false"
-$SqlCommand = New-Object System.Data.SqlClient.SqlCommand
-$SqlCommand.CommandText = $sql
-$SqlCommand.Connection = $SqlConnection
-$SqlConnection.Open()
-$rowsAffected = $SqlCommand.ExecuteNonQuery();` для запросов INSERT/UPDATE/DELETE не используется SqlDataAdapter
-$SqlConnection.Close()USE [db_test]
-GO
-INSERT INTO [dbo].[table_test]
- ([column_user])
- VALUES
- ('lifailon')
-GO
-SELECT TOP (1000) [column_user]
-FROM [db_test].[dbo].[table_test]
-DDL (Data Definition Language / Язык определения данных). К этому
-типу относятся команды, которые создают базу данных, таблицы, индексы,
-хранимые процедуры.
-CREATE создает объекты базы данных (саму базу даных,
-таблицы, индексы и т.д.)
-ALTER изменяет объекты базы данных
-DROP удаляет объекты базы данных
-TRUNCATE удаляет все данные из таблиц
DML (Data Manipulation Language / Язык манипуляции данными). К
-этому типу относят команды по выбору, обновлению, добавлению и удалению
-данных.
-SELECT извлекает данные из БД
-UPDATE обновляет данные
-INSERT добавляет новые данные
-DELETE удаляет данные
DCL (Data Control Language / Язык управления доступа к данным). К
-этому типу относят команды, которые управляют правами по доступу к
-данным.
-GRANT предоставляет права для доступа к данным
-REVOKE отзывает права на доступ к данным
-- Переменные
-DECLARE @text NVARCHAR(20), @int INT;
-SET @text='Test';
-SET @int = 21;
-select @text,@int
-
--- Имена сервера и экземпляра
-Select @@SERVERNAME as [Server\Instance];
-
--- версия SQL Server
-Select @@VERSION as SQLServerVersion;
-
--- Текущая БД (БД, в контексте которой выполняется запрос)
-Select DB_NAME() AS CurrentDB_Name;
-
--- Время работы с момента запуска сервера
-SELECT @@Servername AS ServerName ,
- create_date AS ServerStarted ,
- DATEDIFF(s, create_date, GETDATE()) / 86400.0 AS DaysRunning ,
- DATEDIFF(s, create_date, GETDATE()) AS SecondsRunnig
-FROM sys.databases
-WHERE name = 'tempdb';
-
--- Количество активных соединений
-SELECT @@Servername AS Server ,
- DB_NAME(database_id) AS DatabaseName ,
- COUNT(database_id) AS Connections ,
- Login_name AS LoginName ,
- MIN(Login_Time) AS Login_Time ,
- MIN(COALESCE(last_request_end_time, last_request_start_time))
- AS Last_Batch
-FROM sys.dm_exec_sessions
-WHERE database_id > 0
- AND DB_NAME(database_id) NOT IN ( 'master', 'msdb' )
-GROUP BY database_id ,
- login_name
-ORDER BY DatabaseName;
-
--- Статус Backup
-SELECT @@Servername AS ServerName ,
- d.Name AS DBName ,
- MAX(b.backup_finish_date) AS LastBackupCompleted
-FROM sys.databases d
- LEFT OUTER JOIN msdb..backupset b
- ON b.database_name = d.name
- AND b.[type] = 'D'
-GROUP BY d.Name
-ORDER BY d.Name;
-
--- Путь к Backup
-SELECT @@Servername AS ServerName ,
- d.Name AS DBName ,
- b.Backup_finish_date ,
- bmf.Physical_Device_name
-FROM sys.databases d
- INNER JOIN msdb..backupset b ON b.database_name = d.name
- AND b.[type] = 'D'
- INNER JOIN msdb.dbo.backupmediafamily bmf ON b.media_set_id = bmf.media_set_id
-ORDER BY d.NAME ,
- b.Backup_finish_date DESC;
-
--- Вывести список всех БД, модели восстановления и путь к mdf/ldf
-EXEC sp_helpdb;
-SELECT @@SERVERNAME AS Server ,
- d.name AS DBName ,
- create_date ,
- recovery_model_Desc AS RecoveryModel ,
- m.physical_name AS FileName
-FROM sys.databases d
- JOIN sys.master_files m ON d.database_id = m.database_id
-ORDER BY d.name;
-
--- Размер БД
-with fs
-as
-(
- select database_id, type, size * 8.0 / 1024 size
- from sys.master_files
-)
-select
- name,
- (select sum(size) from fs where type = 0 and fs.database_id = db.database_id) DataFileSizeMB,
- (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) LogFileSizeMB
-from sys.databases
-
--- Поиск таблицы по маске имени (вывод: названия схемы где распологается объект, тип объекта, дата создания и последней модификации):
-select [object_id], [schema_id],
- schema_name([schema_id]) as [schema_name],
- [name],
- [type],
- [type_desc],
- [create_date],
- [modify_date]
-from sys.all_objects
--- where [name]='INVENT';
-where [name] like '%INVENT%';
-
--- Кол-во строк в таблицах
-SELECT @@ServerName AS Server ,
- DB_NAME() AS DBName ,
- OBJECT_SCHEMA_NAME(p.object_id) AS SchemaName ,
- OBJECT_NAME(p.object_id) AS TableName ,
- i.Type_Desc ,
- i.Name AS IndexUsedForCounts ,
- SUM(p.Rows) AS Rows
-FROM sys.partitions p
- JOIN sys.indexes i ON i.object_id = p.object_id
- AND i.index_id = p.index_id
-WHERE i.type_desc IN ( 'CLUSTERED', 'HEAP' )
- -- This is key (1 index per table)
- AND OBJECT_SCHEMA_NAME(p.object_id) <> 'sys'
-GROUP BY p.object_id ,
- i.type_desc ,
- i.Name
-ORDER BY SchemaName ,
- TableName;
-
--- Найти строковое (nvarchar) значение 2023 по всем таблицам базы данных
--- Отображается в какой таблице и столбце хранится значение, а также количество найденных пары таблица-колонка
-set nocount on
-declare @name varchar(128), @substr nvarchar(4000), @column varchar(128)
-set @substr = '%2023%'
-declare @sql nvarchar(max);
-create table`rslt
-(table_name varchar(128), field_name varchar(128), [value] nvarchar(max))
-declare s cursor for select table_name as table_name from information_schema.tables where table_type = 'BASE TABLE' order by table_name
-open s
-fetch next from s into @name
-while @@fetch_status = 0
-begin
-declare c cursor for
-select quotename(column_name) as column_name from information_schema.columns
-where data_type in ('text', 'ntext', 'varchar', 'char', 'nvarchar', 'char', 'sysname', 'int', 'tinyint') and table_name = @name
-set @name = quotename(@name)
-open c
-fetch next from c into @column
-while @@fetch_status = 0
-begin
---print 'Processing table - ' + @name + ', column - ' + @column
-set @sql='insert into`rslt select ''' + @name + ''' as Table_name, ''' + @column + ''', cast(' + @column +
-' as nvarchar(max)) from' + @name + ' where cast(' + @column + ' as nvarchar(max)) like ''' + @substr + '''';
-print @sql;
-exec(@sql);
-fetch next from c into @column;
-end
-close c
-deallocate c
-fetch next from s into @name
-end
-select table_name as [Table Name], field_name as [Field Name], count(*) as [Found Mathes] from`rslt
-group by table_name, field_name
-order by table_name, field_name
-drop table`rslt
-close s
-deallocate s
-
--- Поиск в таблице [CI_HISTORY] и столбцу [HIST_ID]:
-SELECT * FROM ITINVENT.dbo.CI_HISTORY where [HIST_ID] like '%2023%';
-
--- Узнать фрагментацию индексов
-DECLARE @db_id SMALLINT;
-SET @db_id = DB_ID(N'itinvent');
-IF @db_id IS NULL
-BEGIN;
- PRINT N'Неправильное имя базы';
-END;
-ELSE
-BEGIN;
- SELECT
- object_id AS [ID объекта],
- index_id AS [ID индекса],
- index_type_desc AS [Тип индекса],
- avg_fragmentation_in_percent AS [Фрагментация в %]
-
- FROM sys.dm_db_index_physical_stats(@db_id, NULL, NULL, NULL , 'LIMITED')
-
- ORDER BY [avg_fragmentation_in_percent] DESC;
-END;
-GO
-
--- TempDB
--- Initial size - начальный/минимальный размер БД (1024 MB)
--- Autogrowh - прирост (512MB)
--- По умолчанию tempdb настроена на авто-расширение (Autogrow) и при каждой перезагрузке SQL Server пересоздаёт файлы этой БД с минимальным размером инициализации.
--- Увеличив размер инициализации файлов tempdb, можно свести к минимуму затраты системных ресурсов на операции авто-расширения.
-
--- Изменить путь к БД:
-USE master;
-GO
-ALTER DATABASE tempdb
-MODIFY FILE (NAME = tempdev, FILENAME = 'F:\tempdb.mdf');
-GO
-ALTER DATABASE tempdb
-MODIFY FILE (NAME = temp2, FILENAME = 'F:\tempdb_mssql_2.ndf');
-GO
-ALTER DATABASE tempdb
-MODIFY FILE (NAME = temp3, FILENAME = 'F:\tempdb_mssql_3.ndf');
-GO
-ALTER DATABASE tempdb
-MODIFY FILE (NAME = temp4, FILENAME = 'F:\tempdb_mssql_4.ndf');
-GO
-ALTER DATABASE tempdb
-MODIFY FILE (NAME = temp5, FILENAME = 'F:\tempdb_mssql_5.ndf');
-GO
-ALTER DATABASE tempdb
-MODIFY FILE (NAME = temp6, FILENAME = 'F:\tempdb_mssql_6.ndf');
-GO
-ALTER DATABASE tempdb
-MODIFY FILE (NAME = temp7, FILENAME = 'F:\tempdb_mssql_7.ndf');
-GO
-ALTER DATABASE tempdb
-MODIFY FILE (NAME = temp8, FILENAME = 'F:\tempdb_mssql_8.ndf');
-GO
-ALTER DATABASE tempdb
-MODIFY FILE (NAME = templog, FILENAME = 'F:\templog.ldf');
-GO
-
--- Указать размер файла:
-MODIFY FILE (NAME = temp2, FILENAME = 'F:\tempdb_mssql_2.ndf' , SIZE = 1048576KB , FILEGROWTH = 524288KB);
-DBCC CHECKDB
Индексы. Индексы используются для быстрого поиска данных без -необходимости поиска/просмотра всех строк в таблице базы данных при -каждом обращении к таблице базы данных. Индекс ускоряет процесс запроса, -предоставляя быстрый доступ к строкам данных в таблице, аналогично тому, -как указатель в книге помогает вам быстро найти необходимую информацию. -Индексы предоставляют путь для быстрого поиска данных на основе значений -в этих столбцах. Для каждого индекса обязательно хранится его -статистика. MS SQL Server самостоятельно создает и изменяет индексы при -работе с базой. С течением времени данные в индексе становятся -фрагментированными, т.е. разбросанными по базе данных, что серьезно -снижает производительность запросов. Если фрагментация составляет от 5 -до 30% (стандартно в задании 15%), то рекомендуется ее устранить с -помощью реорганизации, при фрагментации выше 30% (по умолчанию в задаче -> 30% фрагментации и число страниц > 1000) необходимо полное -перестроение индексов. После перестроения планово используется только -реорганизация.
Реорганизация (Reorganize) или дефрагментация индекса — это серия -небольших локальных перемещений страниц так, чтобы индекс не был -фрагментирован. После реорганизации статистика не обновляется. Во время -выполнения почти все данные доступны, пользователи смогут -работать.
sp_msforeachtable N'DBCC INDEXDEFRAG (<имя базы данных>, ''?'')'
sp_msforeachtable N'DBCC DBREINDEX (''?'')'
exec sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN'
DBCC FREEPROCCACHE
Download InfluxDB 1.x -Open Source InfluxDB-Studio
-Invoke-RestMethod "https://dl.influxdata.com/influxdb/releases/influxdb-1.8.10_windows_amd64.zip" -OutFile "$home\Downloads\influxdb-1.8.10_windows_amd64.zip"
-Expand-Archive "$home\Downloads\influxdb-1.8.10_windows_amd64.zip" -DestinationPath "$home\Documents\"
-Remove-Item "$home\Downloads\influxdb-1.8.10_windows_amd64.zip"
-& "$home\Downloads\influxdb-1.8.10-1\influxd.exe"wget https://dl.influxdata.com/influxdb/releases/influxdb_1.8.10_amd64.deb
-sudo dpkg -i influxdb_1.8.10_amd64.deb
-systemctl start influxdb
-systemctl status influxdb
-
-ps aux | grep influxdb | grep -Ev "grep"
-netstat -natpl | grep 80[8-9][3-9]nano /etc/influxdb/influxdb.conf
-
-[http]
- enabled = true
- bind-address = ":8086"
- auth-enabled = false
-
-systemctl restart influxdbwget https://dl.influxdata.com/chronograf/releases/chronograf-1.10.2_windows_amd64.zip -UseBasicParsing -OutFile chronograf-1.10.2_windows_amd64.zip
-Expand-Archive .\chronograf-1.10.2_windows_amd64.zip -DestinationPath 'C:\Program Files\InfluxData\chronograf\'
-
-wget https://dl.influxdata.com/chronograf/releases/chronograf_1.10.2_amd64.deb
-sudo dpkg -i chronograf_1.10.2_amd64.deb
-systemctl status influxdb
-http://192.168.3.102:8888
-invoke-RestMethod https://dl.grafana.com/enterprise/release/grafana-enterprise-10.3.1.windows-amd64.msi -OutFile "$home\Download\grafana.msi"
apt-get install -y adduser libfontconfig1 musl
-wget https://dl.grafana.com/enterprise/release/grafana-enterprise_10.3.1_amd64.deb
-dpkg -i grafana-enterprise_10.3.1_amd64.deb
-systemctl start grafana-server
-systemctl status grafana-serverapt install influxdb-client
-influx
-influx --host 192.168.3.102 --username admin --password password
$influx_client_exec = "$home\Documents\influxdb-1.8.10-1\influx.exe"
-& $influx_client_exec -host 192.168.3.102 -port 8086
-help
-show databases
-use PowerShell
-SELECT * FROM "HardwareMonitor" WHERE time > now() - 5mSHOW USERS отобразить пользователей и их права
-доступа
-CREATE USER admin WITH PASSWORD 'password' WITH ALL PRIVILEGES
-создать пользователя
-GRANT ALL PRIVILEGES TO "admin" предоставить права
-доступа
-GRANT READ ON "database" TO "admin" доступ на чтение для БД
-или запись (WRITE)
-REVOKE ALL PRIVILEGES FROM "admin" отозвать права
-доступа
-SHOW GRANTS FOR "admin" БД и привелегии доступа для
-указанного пользователя
-SET PASSWORD FOR "admin" = 'new_password' изменить
-пароль
-DROP USER "admin" удалить пользователя
CREATE DATABASE powershell создать БД
-SHOW DATABASES отобразить список БД
-DROP DATABASE powershell удалить БД
-USE powershell
-SHOW measurements отобразить все таблицы
-INSERT performance,host=console,counter=CPU value=0.88
-записать данные в таблицу performance
SHOW TAG KEYS FROM "HardwareMonitor" отобразить все тэги
-в таблице
-SHOW TAG VALUES FROM "HardwareMonitor" WITH KEY = "HardwareName"
-отобразить все значения указанного тэга
-SHOW FIELD KEYS FROM "HardwareMonitor" отобразить все Field
-Tags и их тип данных
-SHOW SERIES FROM "HardwareMonitor" отобразить список всех
-уникальных серий в указанной таблице. Серия - это набор точек данных,
-которые имеют одинаковые значения для всех тегов, за исключением
-времени.
-DROP SERIES FROM "HardwareMonitor" очистить все данные в
-таблице
-DROP MEASUREMENT "HardwareMonitor" удалить таблицу
SELECT * FROM performance отобразить все данные в
-таблице
-SELECT value FROM performance отфильтровать по столбцу
-value (только Field Keys)
-SELECT * FROM performance limit 10 отобразить 10 единиц
-данных
-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 * FROM "win_pdisk" WHERE instance =~/.*C:/ and time > now() - 5m
-и
-SELECT * FROM "win_pdisk" WHERE instance =~/.*E:/ or instance =~ /.*F:/
-или
-SELECT * FROM "win_pdisk" WHERE instance !~ /.*Total/ не
-равно (исключить)
-SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /Intel/
-приблизительно равно
-SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /Intel.+i7/
-эквивалент 12th_Gen_Intel_Core_i7-1260P
-SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /^Intel/
-начинается на Intel
-SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /00$/
-заканчивается на 00
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and SensorName = 'Temperature' GROUP BY HardwareName
-создать уникальные группы по тэгу HardwareName
-SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and SensorName = 'Temperature' GROUP BY Host,HardwareName
-больше групп по двум тэгаам
SELECT instance,LAST(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance
-отфильтровать вывод по последнему/текущему значению
-SELECT instance,FIRST(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance
-отфильтровать вывод по первому значению за весь или указанный отрезок
-времени
-SELECT instance,MIN(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance
-отфильтровать вывод с отображением минимального значения
-SELECT instance,MAX(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance
-отфильтровать вывод с отображением максимального значения
-SELECT SUM(Bytes_Received_persec) FROM "win_net" GROUP BY instance
-суммах всех значений
-SELECT COUNT(Bytes_Received_persec) FROM "win_net" WHERE Bytes_Received_persec >= 0 GROUP BY instance
-кол-во данных, где значение выше или равно 0
-SELECT MEAN(Bytes_Received_persec) FROM "win_net" WHERE Bytes_Received_persec < 1000 GROUP BY instance
-среднее значение данных с показателем от 0 до 1000 (509)
SELECT *,MAX(Value) FROM "HardwareMonitor" WHERE time > now() -1h GROUP BY SensorName,Host
-создать группы для выявления максимального значения значения стобца
-Value каждого тэга SensorName и хоста за последний час
-SELECT *,MAX(Value) FROM "HardwareMonitor" WHERE time > now() -1h and SensorName = 'CPU_Package' GROUP BY Host
-масимальное значение CPU_Package за последний час для каждого
-хоста
-SELECT MEAN(Value) FROM "HardwareMonitor" WHERE time > now() -1h and SensorName = 'CPU_Package' GROUP BY Host
-среднее значение CPU_Package за последний час
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 удаление политики
-хранения приводит к безвозвратному удалению всех измерений (таблиц) и
-данных, хранящихся в политике хранения
-SHOW RETENTION POLICIES ON PowerShell отобразить
-действующие политики базы данных PowerShell
$data = Invoke-RestMethod http://192.168.3.102:8086/query?q="SHOW RETENTION POLICIES ON PowerShell"
-$col = $data.results.series.columns
-$val = $data.results.series.values
-$mass = @()
-$mass += [string]$col
-foreach ($v in $val) {
- $mass += [string]$v
-}
-$mass = $mass -replace '^','"'
-$mass = $mass -replace '$','"'
-$mass = $mass -replace '\s','","'
-$mass | ConvertFrom-CsvВместо таблиц в InfluxDB имеются измерения. Вместо столбцов в ней -есть теги и поля.
- Table Tag (string/int) Field (double/int) TIMESTAMP
-measurement,Tag_Keys1=Tag_Values1,Tag_Keys2=Tag_Values2 Field_Keys1="Values",Field_Keys2="Values" 0000000000000000000
- 1 2 3
-
-$ip = "192.168.3.104"
-$port = "8086"
-$db = "powershell"
-$table = "speedtest"
-$ipp = $ip+":"+$port
-$url = "http://$ipp/write?db=$db"
-$user = "admin"
-$pass = "password" | ConvertTo-SecureString -AsPlainText -Force
-$cred = [System.Management.Automation.PSCredential]::new($user,$pass)
-$unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End (Get-Date)).TotalSeconds
-$timestamp = ([string]$unixtime -replace "\..+") + "000000000"
-
-Invoke-RestMethod -Method POST -Uri $url -Body "$table,host=$(hostname) download=200000,upload=300000,ping=3 $timestamp"
-curl http://192.168.3.104:8086/query --data-urlencode "q=SHOW DATABASES"
-pwsh7 (ConvertFrom-Json) and bash
$dbs = irm "http://192.168.3.104:8086/query?q=SHOW DATABASES"
-$dbs = irm "http://192.168.3.104:8086/query?epoch=ms&u=admin&p=password&q=SHOW DATABASES"
-$dbs.results.series.values
$ip = "192.168.3.104"
-$port = "8086"
-$db = "powershell"
-$table = "speedtest"
-$query = "SELECT * FROM $table"
-$ipp = $ip+":"+$port
-$url = "http://$ipp/query?db=$db&q=$query"
-$data = Invoke-RestMethod -Method GET -Uri $url` -Credential $cred
-$data.results.series.name ` имя таблицы
-$data.results.series.columns` столбцы/ключи
-$data.results.series.values ` данные построчно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.uptimehttp://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
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
while ($true) {
- $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
- $RTime = $tnc.PingReplyDetails.RoundtripTime
- Invoke-RestMethod -Method POST -Uri "http://192.168.3.104:8086/write?db=powershell" -Body "ping,host=$(hostname) status=$status,rtime=$RTime $timestamp"
- sleep 1
-}SELECT * FROM ping WHERE status = false
function ConvertTo-Encoding ([string]$From, [string]$To) {
- Begin {
- $encFrom = [System.Text.Encoding]::GetEncoding($from)
- $encTo = [System.Text.Encoding]::GetEncoding($to)
- }
- Process {
- $bytes = $encTo.GetBytes($_)
- $bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes)
- $encTo.GetString($bytes)
- }
-}
-
-$localization = (Get-Culture).LCID` текущая локализация
-if ($localization -eq 1049) {
- $performance = "\\$(hostname)\Процессор(_Total)\% загруженности процессора" | ConvertTo-Encoding UTF-8 windows-1251` декодировать кириллицу
-} else {
- $performance = "\Processor(_Total)\% Processor Time"
-}
-
-$tz = (Get-TimeZone).BaseUtcOffset.TotalMinutes
-while ($true) {
- $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"
- sleep 5
-}$powershell_Path = (Get-Command powershell).Source
-$NSSM_Path = "C:\NSSM\NSSM-2.24.exe"
-$Script_Path = "C:\NSSM\PerformanceTo-InfluxDB.ps1"
-$Service_Name = "PerformanceTo-InfluxDB"
-& $NSSM_Path install $Service_Name $powershell_Path -ExecutionPolicy Bypass -NoProfile -f $Script_Path
-Get-Service $Service_Name | Start-Service
-Get-Service $Service_Name | Set-Service -StartupType AutomaticPlugins: -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:\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"]
- database = "telegraf_nt"
- username = "user"
- password = "pass"
-[[inputs.cpu]]
- percpu = false
- totalcpu = true
-[[inputs.dns_query]]
- servers = ["8.8.8.8"]
- network = "udp"
- domains = ["."]
- record_type = "A"
- port = 53
- timeout = "2s"
-.\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
Install-Module -Name Elastic.Console -AllowPrerelease
-https://github.com/elastic/powershell/blob/master/Elastic.Console/README.md
-Get-Command -Module Elastic.Console
-Get-ElasticsearchVersion
-Set-ElasticsearchVersion 7.3.0
-Invoke-Elasticsearch REST API запросы
https://www.powershellgallery.com/profiles/CData
-https://www.cdata.com/kb/tech/elasticsearch-ado-powershell.rst
Install-Module ElasticsearchCmdlets
-https://www.powershellgallery.com/packages/ElasticsearchCmdlets/23.0.8565.1
-Import-Module ElasticsearchCmdlets
-Get-Command -Module ElasticsearchCmdlets
$elasticsearch = Connect-Elasticsearch -Server "$Server" -Port "$Port" -User "$User" -Password "$Password"
-$shipcity = "New York"
-$orders = Select-Elasticsearch -Connection $elasticsearch -Table "Orders" -Where "ShipCity = `'$ShipCity`'"` поиск и получение данных
-$orders = Invoke-Elasticsearch -Connection $elasticsearch -Query 'SELECT * FROM Orders WHERE ShipCity = @ShipCity' -Params @{'@ShipCity'='New York'}` SQL запросыInstall-Package CData.Elasticsearch
-https://www.nuget.org/packages/CData.Elasticsearch
-[Reflection.Assembly]::LoadFile("C:\Program Files\PackageManagement\NuGet\Packages\CData.Elasticsearch.23.0.8565\lib\net40\System.Data.CData.Elasticsearch.dll")
$connect = New-Object System.Data.CData.Elasticsearch.ElasticsearchConnection("Server=127.0.0.1;Port=9200;User=admin;Password=123456;")
-$connect.Open()
-$sql = "SELECT OrderName, Freight from Orders"
-$da = New-Object System.Data.CData.Elasticsearch.ElasticsearchDataAdapter($sql, $conn)
-$dt = New-Object System.Data.DataTable
-$da.Fill($dt)
-$dt.Rows | foreach {
-Write-Host $_.ordername $_.freight
-}Update-Elasticsearch -Connection $Elasticsearch -Columns @('OrderName','Freight') -Values @('MyOrderName', 'MyFreight') -Table Orders -Id "MyId"
-
-$cmd = New-Object System.Data.CData.Elasticsearch.ElasticsearchCommand("UPDATE Orders SET ShipCity='New York' WHERE Id = @myId", $conn)
-$cmd.Parameters.Add(new System.Data.CData.Elasticsearch.ElasticsearchParameter("@myId","10456255-0015501366"))
-$cmd.ExecuteNonQuery()Add-Elasticsearch -Connection $Elasticsearch -Table Orders -Columns @("OrderName", "Freight") -Values @("MyOrderName", "MyFreight")
-
-$cmd = New-Object System.Data.CData.Elasticsearch.ElasticsearchCommand("INSERT INTO Orders (ShipCity) VALUES (@myShipCity)", $conn)
-$cmd.Parameters.Add(new System.Data.CData.Elasticsearch.ElasticsearchParameter("@myShipCity","New York"))
-$cmd.ExecuteNonQuery()Remove-Elasticsearch -Connection $Elasticsearch -Table "Orders" -Id "MyId"
-
-$cmd = New-Object System.Data.CData.Elasticsearch.ElasticsearchCommand("DELETE FROM Orders WHERE Id=@myId", $conn)
-$cmd.Parameters.Add(new System.Data.CData.Elasticsearch.ElasticsearchParameter("@myId","001d000000YBRseAAH"))
-$cmd.ExecuteNonQuery()Get-Command -Module Wdac
-Get-OdbcDriver | ft список установленных драйверов
https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-client-apps-ps1.html
-$connectstring = "DSN=Local Elasticsearch;"
-$sql = "SELECT * FROM library"
-$conn = New-Object System.Data.Odbc.OdbcConnection($connectstring)
-$conn.open()
-$cmd = New-Object system.Data.Odbc.OdbcCommand($sql,$conn)
-$da = New-Object system.Data.Odbc.OdbcDataAdapter($cmd)
-$dt = New-Object system.Data.datatable
-$null = $da.fill($dt)
-$conn.close()
-$dtСкачать и установить драйвер: -https://www.postgresql.org/ftp/odbc/versions/msi/
-$dbServer = "192.168.3.101"
-$port = "5432"
-$dbName = "test"
-$dbUser = "admin"
-$dbPass = "admin"
-$szConnect = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=$port;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
-
-$cnDB = New-Object System.Data.Odbc.OdbcConnection($szConnect)
-$dsDB = New-Object System.Data.DataSet
-try {
- $cnDB.Open()
- $adDB = New-Object System.Data.Odbc.OdbcDataAdapter
- $adDB.SelectCommand = New-Object System.Data.Odbc.OdbcCommand("SELECT id, name, age, login FROM public.users" , $cnDB)
- $adDB.Fill($dsDB)
- $cnDB.Close()
-}
-catch [System.Data.Odbc.OdbcException] {
- $_.Exception
- $_.Exception.Message
- $_.Exception.ItemName
-}
-foreach ($row in $dsDB[0].Tables[0].Rows) {
- $row.login
- $row.age
-}Get-WmiObjec -ComputerName localhost -Namespace root -class "__NAMESPACE" | select name,__namespace
-отобразить дочернии Namespace (логические иерархические группы)
-Get-WmiObject -List отобразить все классы пространства имен
-“root” (по умолчанию), свойства (описывают конфигурацию и текущее
-состояние управляемого ресурса) и их методы (какие действия позволяет
-выполнить над этим ресурсом)
-Get-WmiObject -List | Where-Object {$_.name -match "video"}
-поиск класса по имени, его свойств и методов
-Get-WmiObject -ComputerName localhost -Class Win32_VideoController
-отобразить содержимое свойств класса
gwmi -List | where name -match "service" | ft -auto если
-в таблице присутствуют Methods, то можно взаимодействовать
-{StartService, StopService}
-gwmi -Class win32_service | select * отобразить список всех
-служб и всех их свойств
-Get-CimInstance Win32_service обращается на прямую к
-“root”
-gwmi win32_service -Filter "name='Zabbix Agent'"
-отфильтровать вывод по имени
-(gwmi win32_service -Filter "name='Zabbix Agent'").State
-отобразить конкретное свойство
-gwmi win32_service -Filter "State = 'Running'"
-отфильтровать запущенные службы
-gwmi win32_service -Filter "StartMode = 'Auto'"
-отфильтровать службы по методу запуска
-gwmi -Query 'select * from win32_service where startmode="Auto"'
-WQL-запрос (WMI Query Language)
-gwmi win32_service | Get-Member -MemberType Method
-отобразить все методы взаимодействия с описание применения (Delete,
-StartService)
-(gwmi win32_service -Filter 'name="Zabbix Agent"').Delete()
-удалить службу
-(gwmi win32_service -Filter 'name="MSSQL$MSSQLE"').StartService()
-запустить службу
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)
-завершение сеанса пользователя
$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 @{
-Label="Value"; Expression={$_.DeviceID}}, @{Label="AllSize"; Expression={
-[string]([int]($_.Size/1Gb))+" GB"}},@{Label="FreeSize"; Expression={
-[string]([int]($_.FreeSpace/1Gb))+" GB"}}, @{Label="Free%"; Expression={
-[string]([int]($_.FreeSpace/$_.Size*100))+" %"}}
-(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").UserAuthenticationRequired
-(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").SetUserAuthenticationRequired(1)
-включить NLA
-Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer
-отобразить значение (2)
-Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication
-отобразить значение (1)
-Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer -Value 0
-изменить значение
-Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication -Value 0
-REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters /v AllowEncryptionOracle /t REG_DWORD /d 2
-отключить на клиентском компьютере проверку версии CredSSP, если на
-целевом комьютере-сервере не установлены обновления KB4512509 от мая
-2018 года
Get-PSDrive список всех доступных дисков/разделов, их
-размер и веток реестра
-cd HKLM:\ HKEY_LOCAL_MACHINE
-cd HKCU:\ HKEY_CURRENT_USER
-Get-Item получить информацию о ветке реестра
-New-Item создать новый раздел реестра
-Remove-Item удалить ветку реестра
-Get-ItemProperty получить значение ключей/параметров
-реестра (это свойства ветки реестра, аналогично свойствам файла)
-Set-ItemProperty изменить название или значение параметра
-реестра
-New-ItemProperty создать параметр реестра
-Remove-ItemProperty удалить параметр
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select DisplayName
-список установленных программ
-Get-Item HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002
-посмотреть содержимое Items
-(Get-ItemProperty HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002)."New Signature"
-отобразить значение (Value) свойства (Property) Items
-$reg_path = "HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002"
-$sig_name = "auto"
-Set-ItemProperty -Path $reg_path -Name "New Signature" -Value $sig_name
-изменить или добавить в корне ветки (Path) свойство (Name) со значением
-(Value)
-Set-ItemProperty -Path $reg_path -Name "Reply-Forward Signature" -Value $sig_name
Windows Registry Editor Version 5.00
-[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe]
-"Debugger"="\"C:\\Windows\\System32\\Taskmgr.exe\""
-lodctr /R пересоздать счетчиков производительности из
-системного хранилища архивов (так же исправляет счетчики для CIM,
-например, для cpu Win32_PerfFormattedData_PerfOS_Processor и iops
-Win32_PerfFormattedData_PerfDisk_PhysicalDisk)
-(Get-Counter -ListSet *).CounterSetName вывести список всех
-доступных счетчиков производительности в системе
-(Get-Counter -ListSet *memory*).Counter поиск по
-wildcard-имени во всех счетчиках (включая дочернии)
-Get-Counter "\Memory\Available MBytes" объем свободной
-оперативной памяти
-Get-Counter -cn $srv "\LogicalDisk(*)\% Free Space" %
-свободного места на всех разделах дисков
-(Get-Counter "\Process(*)\ID Process").CounterSamples
-Get-Counter "\Processor(_Total)\% Processor Time" –ComputerName $srv -MaxSamples 5 -SampleInterval 2
-5 проверок каждые 2 секунды
-Get-Counter "\Процессор(_Total)\% загруженности процессора" -Continuous
-непрерывно
-(Get-Counter "\Процессор(*)\% загруженности процессора").CounterSamples
(Get-Counter -ListSet *интерфейс*).Counter найти все
-счетчики
-Get-Counter "\Сетевой интерфейс(*)\Всего байт/с" отобразить
-все адаптеры (выбрать действующий по трафику)
$WARNING = 25
-$CRITICAL = 50
-$TransferRate = ((Get-Counter "\\huawei-mb-x-pro\сетевой интерфейс(intel[r] wi-fi 6e ax211 160mhz)\всего байт/с"
-).countersamples | select -ExpandProperty CookedValue)*8
-$NetworkUtilisation = [math]::round($TransferRate/1000000000*100,2)
-if ($NetworkUtilisation -gt $CRITICAL){
-Write-Output "CRITICAL: $($NetworkUtilisation) % Network utilisation, $($TransferRate.ToString('N0')) b/s"
-#exit 2
-}
-if ($NetworkUtilisation -gt $WARNING){
-Write-Output "WARNING: $($NetworkUtilisation) % Network utilisation, $($TransferRate.ToString('N0')) b/s"
-#exit 1
-}
-Write-Output "OK: $($NetworkUtilisation) % Network utilisation, $($TransferRate.ToString('N0')) b/s"
-#exit 0Install-WindowsFeature SNMP-Service,SNMP-WMI-Provider -IncludeManagementTools
-установить роль SNMP и WMI провайдер через Server Manager
-Get-WindowsFeature SNMP*
-Add-WindowsCapability -Online -Name SNMP.Client~~~~0.0.1.0
-установить компонент Feature On Demand для Windows
-10/11\Get-Service SNMP\Get-NetFirewallrule
--DisplayName snmp* | ft\Get-NetFirewallrule
--DisplayName snmp | Enable-NetFirewallRule`
Agent:
-New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysContact" -Value "lifailon-user"
-создать (New) или изменить (Set)
-New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysLocation" -Value "plex-server"
Security:
-New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\public"
-создать новый community string
-New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ValidCommunities" -Name "public" -Value 16
-назначить права на public
-1 — NONE
-2 — NOTIFY позволяет получать SNMP ловушки
-4 — READ ONLY позволяет получать данные с устройства
-8 — READ WRITE позволяет получать данные и изменять
-конфигурацию устройства
-16 — READ CREATE позволяет читать данные, изменять и
-создавать объекты
-New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\PermittedManagers" -Name "1" -Value "192.168.3.99"
-от кого разрешено принимать запросы
-Get-Service SNMP | Restart-Service
snmpwalk -v 2c -c public 192.168.3.100
-snmpwalk -v 2c -c public -O e 192.168.3.100
Install-Module -Name SNMP
-Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0 -UDPport 161 -Community public
-(Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0).Data
-Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.1
-пройтись по дереву OID
-Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.6.3.1.2
-список установленного ПО
-Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.2.3.1
-список разделов и памяти (C: D: Virtual Memory и Physical Memory)
-Set-SnmpData изменение данных на удаленном устройстве
Install-Module -Name SNMPv3
-Invoke-SNMPv3Get получение данных по одному OID
-Invoke-SNMPv3Set изменение данных
-Invoke-SNMPv3Walk обход по дереву OID
-Invoke-SNMPv3Walk -UserName lifailon -Target 192.168.3.100 -AuthSecret password -PrivSecret password -OID 1.3.6.1.2.1.1 -AuthType MD5 -PrivType AES128
https://api.nuget.org/v3-flatcontainer/lextm.sharpsnmplib/12.5.2/lextm.sharpsnmplib.12.5.2.nupkg
-Add-Type -LiteralPath "$home\Desktop\lextm.sharpsnmplib-12.5.2\net471\SharpSnmpLib.dll"
$port = 161
-$OID = "1.3.6.1.2.1.1.4.0"
-$variableList = New-Object Collections.Generic.List[Lextm.SharpSnmpLib.Variable]
-$variableList.Add([Lextm.SharpSnmpLib.Variable]::new([Lextm.SharpSnmpLib.ObjectIdentifier]::new($OID)))
-$timeout = 3000
-[Net.IPAddress]$ip = "192.168.3.100"
-$endpoint = New-Object Net.IpEndPoint $ip, $port
-$Community = "public"
-[Lextm.SharpSnmpLib.VersionCode]$Version = "V2"
-
-$message = [Lextm.SharpSnmpLib.Messaging.Messenger]::Get(
-$Version,
-$endpoint,
-$Community,
-$variableList,
-$TimeOut
-)
-$message.Data.ToString()[Lextm.SharpSnmpLib.ObjectIdentifier]$OID = "1.3.6.1.2.1.1" # дерево или конечный OID
-$WalkMode = [Lextm.SharpSnmpLib.Messaging.WalkMode]::WithinSubtree # режим обхода по дереву
-$results = New-Object Collections.Generic.List[Lextm.SharpSnmpLib.Variable]
-$message = [Lextm.SharpSnmpLib.Messaging.Messenger]::Walk(
- $Version,
- $endpoint,
- $Community,
- $OID,
- $results,
- $TimeOut,
- $WalkMode
-)
-$results
-
-$results2 = @()
-foreach ($d in $results) {
-$results2 +=[PSCustomObject]@{'ID'=$d.id.ToString();'Data'=$d.Data.ToString()} # перекодировать вывод построчно в строку
-}
-$results2$url = "https://cdn.zabbix.com/zabbix/binaries/stable/6.4/6.4.5/zabbix_agent2-6.4.5-windows-amd64-static.zip"
-$path = "$home\Downloads\zabbix-agent2-6.4.5.zip"
-$WebClient = New-Object System.Net.WebClient
-$WebClient.DownloadFile($url, $path)` скачать файл
-Expand-Archive $path -DestinationPath "C:\zabbix-agent2-6.4.5\"` разархивировать
-Remove-Item $path` удалить архив
-New-NetFirewallRule -DisplayName "Zabbix-Agent" -Profile Any -Direction Inbound -Action Allow -Protocol TCP -LocalPort 10050,10051` открыть порты в FW
-
-$Zabbix_Server = "192.168.3.102"
-$conf = "C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.conf"
-$cat = cat $conf
-$rep = $cat -replace "Server=.+","Server=$Zabbix_Server"
-$rep | Select-String Server=
-$rep > $conf
-
-$exe = "C:\zabbix-agent2-6.4.5\bin\zabbix_agent2.exe"
-.$exe --config $conf --install` установить службу
-Get-Service *Zabbix*Agent* | Start-Service` запустить службу
-#.$exe --config $conf --uninstall` удалить службуСоздать host - задать произвольное имя (powershell-host) и добавить в
-группу
-Создать Items:
-Name: Service Count
-Type: Zabbix trapper
-Key: service.count
-Type of Information: Numeric
$path = "C:\zabbix-agent2-6.4.5\bin"
-$scount = (Get-Service).Count
-.$path\zabbix_sender.exe -z 192.168.3.102 -s "powershell-host" -k service.count -o $scountapt install zabbix-get
-nano /etc/zabbix/zabbix_agentd.conf
-Server=127.0.0.1,192.168.3.102,192.168.3.99 добавить
-сервера для получения данных zabbix_get с агента (как их запрашивает
-сервер)
.$path\zabbix_get -s 192.168.3.101 -p 10050 -k agent.version
-проверить версию агента
-.$path\zabbix_get -s 192.168.3.101 -p 10050 -k agent.ping 1
-- ok
-.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.discovery
-список сетевых интерфейсов
-.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.in["ens33"]
-.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.out["ens33"]
UserParameter=process.count,powershell -Command "(Get-Process).Count"
-UserParameter=process.vm[*],powershell -Command "(Get-Process $1).ws"
Test:
-C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.count
-C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.vm[zabbix_agent2]
-C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.vm[powershell]
Создать новые Items:
-key: process.count
-key: process.vm[zabbix_agent2]
Добавить параметр Include для включения конфигурационных файлов
-подключаемых плагинов
-'Include=.\zabbix_agent2.d\plugins.d\*.conf' >> C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.conf
Создать конфигурационный файл с пользовательскими параметрами в
-каталоге, путь к которому указан в zabbix_agentd.conf
-'UserParameter=Get-Query-Param[*],powershell.exe -noprofile -executionpolicy bypass -File C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\scripts\User-Sessions\Get-Query-Param.ps1 $1' > C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\plugins.d\User-Sessions.conf
Поместить скрипт Get-Query-Param.ps1 в каталог, путь к которому -указан в User-Sessions.conf. Скрипт содержим пользовательские параметры, -которые он принимает от Zabbix сервера для передачи их в функции -скрипта.
Param([string]$select)
-if ($select -eq "ACTIVEUSER") {
-(Get-Query | where status -match "Active").User
-}
-if ($select -eq "INACTIVEUSER") {
-(Get-Query | where status -match "Disconnect").User
-}
-if ($select -eq "ACTIVECOUNT") {
-(Get-Query | where status -match "Active").Status.Count
-}
-if ($select -eq "INACTIVECOUNT") {
-(Get-Query | where status -match "Disconnect").Status.Count
-}$path = "C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\scripts\User-Sessions"
-.$path\Get-Query-Param.ps1 ACTIVEUSER
-.$path\Get-Query-Param.ps1 INACTIVEUSER
-.$path\Get-Query-Param.ps1 ACTIVECOUNT
-.$path\Get-Query-Param.ps1 INACTIVECOUNT
Get-Query-Param[ACTIVEUSER] Type: Text
-Get-Query-Param[INACTIVEUSER] Type: Text
-Get-Query-Param[ACTIVECOUNT] Type: Int
-Get-Query-Param[INACTIVECOUNT] Type: Int
{$ACTIVEMAX} = 16
-{$ACTIVEMIN} = 0
last(/Windows-User-Sessions/Get-Query-Param[ACTIVECOUNT])>{$ACTIVEMAX}
-min(/Windows-User-Sessions/Get-Query-Param[ACTIVECOUNT],24h)={$ACTIVEMIN}
# Агент может работать в пассивном (сервер забирает сам информацию) и активном режиме (агент сам отправляет):
-Server=192.168.3.102
-ServerActive=192.168.3.102
-# Требуется указать hostname для ServerActive:
-Hostname=huawei-book-01
-# Если не указано, используется для генерации имени хоста (игнорируется, если имя хоста определено):
-# HostnameItem=system.hostname
-# Как часто обновляется список активных проверок, в секундах (Range: 60-3600):
-RefreshActiveChecks=120
-# IP-адрес источника для исходящих соединений:
-# SourceIP=
-# Агент будет слушать на этом порту соединения с сервером (Range: 1024-32767):
-# ListenPort=10050
-# Список IP-адресов, которые агент должен прослушивать через запятую
-# ListenIP=0.0.0.0
-# Агент будет прослушивать этот порт для запросов статуса HTTP (Range: 1024-32767):
-# StatusPort=
-ControlSocket=\\.\pipe\agent.sock
-# Куда вести журнал (file/syslog/console):
-LogType=file
-LogFile=C:\zabbix-agent2-6.4.5\zabbix_agent2.log
-# Размер лога от 0-1024 MB (0 - отключить автоматическую ротацию логов)
-LogFileSize=100
-# Уровень логирования. 4 - для отладки (выдает много информации)
-DebugLevel=4
-https://www.zabbix.com/documentation/current/en/manual/api/reference
-$ip = "192.168.3.102"
-$url = "http://$ip/zabbix/api_jsonrpc.php"
$data = @{
- "jsonrpc"="2.0";
- "method"="user.login";
- "params"=@{
- "username"="Admin";` в версии до 6.4 параметр "user"
- "password"="zabbix";
- };
- "id"=1;
-}
-$token = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result$token = "2eefd25fdf1590ebcdb7978b5bcea1fff755c65b255da8cbd723181b639bb789"
-сгенерировать токен в UI
-(http://192.168.3.102/zabbix/zabbix.php?action=token.list)
$data = @{
- "jsonrpc"="2.0";
- "method"="user.get";
- "params"=@{
- };
- "auth"=$token;
- "id"=1;
-}
-$users = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result$data = @{
- "jsonrpc"="2.0";
- "method"="problem.get";
- "params"=@{
- };
- "auth"=$token;
- "id"=1;
-}
-(Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").ResultПолучить список всех хостов (имя и id)
-https://www.zabbix.com/documentation/current/en/manual/api/reference/host
-host.create - creating new hosts
-host.delete - deleting hosts
-host.get - retrieving hosts
-host.massadd - adding related objects to hosts
-host.massremove - removing related objects from hosts
-host.massupdate - replacing or removing related objects from hosts
-host.update - updating hosts
$data = @{
- "jsonrpc"="2.0";
- "method"="host.get";
- "params"=@{
- "output"=@(` отфильтровать вывод
- "hostid";
- "host";
- );
- };
- "id"=2;
- "auth"=$token;
-}
-$hosts = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result
-$host_id = $hosts[3].hostid` забрать id хоста по индексуПолучить id элементов данных по наименованию ключа для конкретного -хоста
-$data = @{
- "jsonrpc"="2.0";
- "method"="item.get";
- "params"=@{
- "hostids"=@($host_id);` отфильтровать по хосту
- };
- "auth"=$token;
- "id"=1;
-}
-$items = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result
-$items_id = ($items | where key_ -match system.uptime).itemid` забрать id элемента данныхПолучить всю историю элемента данных по его id
-$data = @{
- "jsonrpc"="2.0";
- "method"="history.get";
- "params"=@{
- "hostids"=@($host_id); ` фильтрация по хосту
- "itemids"=@($items_id);` фильтрация по элементу данных
- };
- "auth"=$token;
- "id"=1;
-}
-$items_data_uptime = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result` получить все данные по ключу у конкретного хоста$sec = $items_data_uptime.value
function ConvertSecondsTo-TimeSpan {
- param (
- $insec
- )
- $TimeSpan = [TimeSpan]::fromseconds($insec)
- "{0:dd' day 'hh\:mm\:ss}" -f $TimeSpan
-}$UpTime = ConvertSecondsTo-TimeSpan $sec[-1]
$time = $items_data_uptime.clock
function ConvertFrom-UnixTime {
- param (
- $intime
- )
- $EpochTime = [DateTime]"1/1/1970"
- $TimeZone = Get-TimeZone
- $UTCTime = $EpochTime.AddSeconds($intime)
- $UTCTime.AddMinutes($TimeZone.BaseUtcOffset.TotalMinutes)
-}$GetDataTime = ConvertFrom-UnixTime $time[-1]
($hosts | where hostid -eq $host_id).host получить имя
-хоста
-$UpTime последнее полученное значение времени работы
-хоста
-$GetDataTime время последнего полученного значения
New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "Test Certificate" -NotAfter (Get-Date).AddYears(5)
-создать самоподписанный сертификат (в LocalMachine- Сертификаты
-компьютера) с сроком действия 5 лет
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
Invoke-WebRequest -Uri https://slproweb.com/download/Win64OpenSSL_Light-3_1_1.msi -OutFile $home\Downloads\OpenSSL-Light-3.1.1.msi
-Start-Process $home\Downloads\OpenSSL-Light-3.1.1.msi -ArgumentList '/quiet' -Wait` установить msi пакет в тихом режиме (запуск от имени Администратора)
-rm $home\Downloads\OpenSSL-Light-3.1.1.msi
-cd "C:\Program Files\OpenSSL-Win64\bin"Изменить пароль для PFX
-openssl pkcs12 -in "C:\Cert\domain.ru.pfx" -out "C:\Cert\domain.ru.pem" -nodes
-экспортируем имеющийся сертификат и закрытый ключ в .pem-файл без пароля
-с указанием текущего пароля
-openssl pkcs12 -export -in "C:\Cert\domain.ru.pem" -out "C:\Cert\domain.ru_password.pfx" -nodes
-конвертируем .pem обратно в .pfx c указанием нового пароля
Конвертация из закрытого и открытого ключа PEM в PFX
-openssl pkcs12 -export -in "C:\tmp\vpn\vpn.itproblog.ru-crt.pem" -inkey "C:\tmp\vpn\vpn.itproblog.ru-key.pem" -out "C:\tmp\vpn\vpn.iiproblog.ru.pfx"
-in – путь до файла с открытым ключом
-inkey – путь до файла с закрытым ключом
-out – путь до файла, в который будет конвертирован сертификат
-(pfx)
Конвертация PFX в CRT
-openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -clcerts -out "C:\OpenSSL-Win64\bin\_.domain.ru.crt"
-указывается текущий и 2 раза новый пароль PEM pass phrase (файл содержит
-EGIN CERTIFICATE и BEGIN ENCRYPTED PRIVATE KEY)
-openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -clcerts -nokeys -out "C:\OpenSSL-Win64\bin\_.domain.ru.crt"
-без ключа, получить открытую часть (файл содержит только EGIN
-CERTIFICATE)
Конвертация PFX в KEY
-openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -nocerts -out "C:\OpenSSL-Win64\bin\_.domain.ru.key"
-файл содержит только BEGIN ENCRYPTED PRIVATE KEY
Снять пароль к закрытого ключа .key
-openssl rsa -in "C:\OpenSSL-Win64\bin\_.domain.ru.key" -out "C:\OpenSSL-Win64\bin\_.domain.ru-decrypted.key"
CRT и KEY в PFX:
-openssl pkcs12 -inkey certificate.key -in certificate.crt -export -out certificate.pfx
Invoke-WebRequest -Uri https://swupdate.openvpn.org/community/releases/OpenVPN-2.6.5-I001-amd64.msi -OutFile $home\Downloads\OpenVPN-2.6.5.msi
-Start-Process $home\Downloads\OpenVPN-2.6.5.msi -ArgumentList '/quiet /SELECT_OPENSSL_UTILITIES=1' -Wait
-msiexec /i $home\Downloads\OpenVPN-2.6.5.msi ADDLOCAL=EasyRSA /passive /quiet # установить отдельный компонент EasyRSA Certificate Management Scripts
-# msiexec /i $home\Downloads\OpenVPN-2.6.5.msi ADDLOCAL=OpenVPN.Service,Drivers,Drivers.Wintun,OpenVPN,OpenVPN.GUI,OpenVPN.GUI.OnLogon,EasyRSA /passive
-выборочная установка
-# Invoke-WebRequest -Uri https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.5/EasyRSA-3.1.5-win64.zip -OutFile $home\Downloads\EasyRSA-3.1.5.zip
-скачать отдельный пакет EasyRSA
-rm $home\Downloads\OpenVPN-2.6.5.msi
cd "C:\Program Files\OpenVPN\easy-rsa"
-Copy-Item vars.example vars файл конфигурации для
-EasyRSA
set_var EASYRSA_TEMP_DIR "$EASYRSA_PKI"
-set_var EASYRSA_REQ_COUNTRY "RU"
-set_var EASYRSA_REQ_PROVINCE "MSK"
-set_var EASYRSA_REQ_CITY "MSK"
-set_var EASYRSA_REQ_ORG "FAILON.NET"
-set_var EASYRSA_REQ_EMAIL "lifailon@domain.ru"
-set_var EASYRSA_REQ_OU "IT"
-#set_var EASYRSA_KEY_SIZE 2048
-#set_var EASYRSA_CA_EXPIRE 3650
-#set_var EASYRSA_CERT_EXPIRE 825
-.\EasyRSA-Start.bat среда EasyRSA Shell
-easyrsa init-pki инициализация PKI, создает директорию:
-C:Files-rsaи читает переменные файла -rsa
-easyrsa build-ca генерация корневого CA с указанием пароля
-и произвольное имя сервера (.crt и .key)
-easyrsa gen-req server nopass генерация запроса сертификата
-и ключ для сервера OpenVPN - yes (.req и .key)
-easyrsa sign-req server server подписать запрос на выпуск
-сертификата сервера с помощью CA - yes (.crt)
-easyrsa gen-dh создать ключ Диффи-Хеллмана (.pem)
-easyrsa gen-req client1
-nopassгенерация запроса сертификата и ключ для клиента OpenVPN (\pki\reqs\client1.req и \pki\private\client1.key)
-easyrsa sign-req client client1 подписать запрос на выпуск
-сертификата клиента с помощью CA - yes (1.crt)
-easyrsa revoke client1 отозвать сертификат
-пользователя
-openssl rsa -in "C:\Program Files\OpenVPN\easy-rsa\pki\private\client1.key" -out "C:\Program Files\OpenVPN\easy-rsa\pki\private\client1_nopass.key"
-снять защиту паролем для ключа (BEGIN ENCRYPTED PRIVATE KEY -> BEGIN
-PRIVATE KEY)
-exit
-cd "C:\Program Files\OpenVPN\bin"
-.\openvpn --genkey secret ta.key генерация ключа tls-auth
-(.key)
-Move-Item "C:\Program Files\OpenVPN\bin\ta.key" "C:\Program Files\OpenVPN\easy-rsa\pki\"
# Copy-Item "C:\Program Files\OpenVPN\sample-config\server.ovpn" "C:\Program Files\OpenVPN\config-auto\server.ovpn"
-New-Item -ItemType File -Path "C:\Program Files\OpenVPN\config-auto\server.ovpn"
port 1194
-proto udp
-# Что именно инкапсулировать в туннеле (ethernet фреймы - tap или ip пакеты - tun)
-dev tun
-ca "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ca.crt"
-cert "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\issued\\server.crt"
-key "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\private\\server.key"
-dh "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\dh.pem"
-server 192.168.4.0 255.255.255.0
-# Хранит список сопоставления ip для клиентов, что бы назначить тот же адрес при перезапуске сервера
-# ifconfig-pool-persist "C:\\Program Files\\OpenVPN\\dhcp-client-list.txt"
-# Разрешить клиентам подключаться под одним ключом
-# duplicate-cn
-# max-clients 30
-# Разрешить обмен трафиком между клиентами
-client-to-client
-# compress
-tls-auth "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ta.key" 0
-cipher AES-256-GCM
-keepalive 20 60
-# Не перечитавать файлы ключей при перезапуске туннеля
-persist-key
-# Оставляет без изменения устройства tun/tap при перезапуске OpenVPN
-persist-tun
-status "C:\\Program Files\\OpenVPN\\log\\status.log"
-log "C:\\Program Files\\OpenVPN\\log\\openvpn.log"
-verb 3
-mute 20
-windows-driver wintun
-# Открыть доступ к подсети за сервером
-push "route 192.168.3.0 255.255.255.0"
-push "route 192.168.4.0 255.255.255.0"
-# Завернуть все запросы клиента (в том числе Интернет трафик) на OpenVPN сервер
-# push "redirect-gateway def1"
-# push "dhcp-option DNS 192.168.3.101"
-# push "dhcp-option DOMAIN failon.net"
-New-NetFirewallRule -DisplayName "AllowOpenVPN-In" -Direction Inbound -Protocol UDP –LocalPort 1194 -Action Allow
-на сервере
-New-NetFirewallRule -DisplayName "AllowOpenVPN-Out" -Direction Outbound -Protocol UDP –LocalPort 1194 -Action Allow
-на клиенте
-Get-Service *openvpn* | Restart-Service
# Copy-Item "C:\Program Files\OpenVPN\sample-config\client.ovpn" "C:\Program Files\OpenVPN\config-auto\client.ovpn"
-New-Item -ItemType File -Path "C:\Program Files\OpenVPN\config-auto\client.ovpn"
client
-dev tun
-proto udp
-remote 26.115.154.67 1194
-resolv-retry infinite
-nobind
-persist-key
-persist-tun
-ca ca.crt
-cert client1.crt
-key client1.key
-remote-cert-tls server
-tls-auth ta.key 1
-cipher AES-256-GCM
-connect-retry-max 25
-# Использовать драйвер wintun и полный путь до сертификатов при использовании openvpn gui
-windows-driver wintun
-verb 3
-iwr -Uri https://openvpn.net/downloads/openvpn-connect-v3-windows.msi -OutFile "$home\downloads\OpenVPN-Connect-3.msi"
-Передать конфигурацию и ключи:
-client.ovpn
-ca.crt
-dh.pem
-ta.key
-client1.crt
-client1.key
Get-Service RemoteAccess | Stop-Service
-Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "IPEnableRouter" -Value 1
-включает IP маршрутизацию
-(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters").IPEnableRouter
-Get-NetIPInterface | select ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | ft
-отобразить сетевые интерфейсы
-Set-NetIPInterface -ifIndex 13 -Forwarding Enabled включить
-переадресацию на интерфейсе
sysctl net.ipv4.ip_forward=1
-echo "sysctl net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
Get-NetRoute
-New-NetRoute -DestinationPrefix "192.168.3.0/24" -NextHop "192.168.4.1" -InterfaceIndex 8
-route -p add 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 1
-route -p change 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 2
-route -p add 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 1 if 7
-указать номер сетевого интерфейса на который необходимо посылать пакет
-(Wintun Userspace Tunnel)
-route print -4
-route delete 192.168.3.0
tracert 192.168.3.101 с 192.168.4.6
1 17 ms * 22 ms 192.168.4.1
-2 12 ms 13 ms 14 ms 192.168.3.101
-route add -net 192.168.4.0 netmask 255.255.255.0 gw 192.168.3.100
-route -e
traceroute 192.168.4.6 с 192.168.3.101
1 192.168.3.100 (192.168.3.100) 0.148 ms 0.110 ms 0.106 ms
-2 192.168.4.6 (192.168.4.6) 14.573 ms * *
-ping 192.168.3.101 -t с 192.168.4.6
-tcpdump -n -i ens33 icmp на 192.168.3.101
14:36:34.533771 IP 192.168.4.6 > 192.168.3.101: ICMP echo request, id 1, seq 2962, length 40 # отправил запрос
-14:36:34.533806 IP 192.168.3.101 > 192.168.4.6: ICMP echo reply, id 1, seq 2962, length 40 # отправил ответ
-Get-Command -Module NetNat
-New-NetNat -Name LocalNat -InternalIPInterfaceAddressPrefix "192.168.3.0/24"
-Add-NetNatStaticMapping -NatName LocalNat -Protocol TCP -ExternalIPAddress 0.0.0.0 -ExternalPort 80 -InternalIPAddress 192.168.3.102 -InternalPort 80
-Remove-NetNatStaticMapping -StaticMappingID 0
-Remove-NetNat -Name LocalNat
Invoke-WebRequest "https://download.wireguard.com/windows-client/wireguard-amd64-0.5.3.msi" -OutFile "$home\Downloads\WireGuard-Client-0.5.3.msi"
-msiexec.exe /i "$home\Downloads\WireGuard-Client-0.5.3.msi" DO_NOT_LAUNCH=1 /qn
-Invoke-WebRequest "http://www.wiresock.net/downloads/wiresock-vpn-gateway-x64-1.1.4.1.msi" -OutFile "$home\Downloads\WireSock-VPN-Gateway-1.1.4.1.msi"
-msiexec.exe /i "http://www.wiresock.net/downloads/wiresock-vpn-gateway-x64-1.1.4.1.msi" /qn
-$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
-wg-quick-config -add -start
-26.115.154.67:8181
-192.168.21.4/24
-Successfully saved client configuration: C:\ProgramData\NT KERNEL\WireSock VPN Gateway\wsclient_1.conf
-Successfully saved server configuration: C:\ProgramData\NT KERNEL\WireSock VPN Gateway\wiresock.conf
-get-service *wire*
-wg show
-wg-quick-config -add -restart add client
wiresock.conf
-[Interface]
-PrivateKey = gCHC0g2JPwr6sXPiaOL4/KTkMyjN9TculrJUA/GORV8=
-Address = 192.168.21.5/24
-ListenPort = 8181
-
-[Peer]
-PublicKey = NoSxjew2RCHiUzI6mlahjd4I+0EcLsoYom/H01z91yU=
-AllowedIPs = 192.168.21.6/32
-wsclient_1.conf (добавить маршруты для клиента в AllowedIPs)
-[Interface]
-PrivateKey = yIpRQRmaGrrk9Y+49E8JhEpFmKzSeecvUAdeNgf1hUM=
-Address = 192.168.21.6/24
-DNS = 8.8.8.8, 1.1.1.1
-MTU = 1420
-
-[Peer]
-PublicKey = Fp7674VSYeGj8CYt6RCKR7Qz1y/IKUXCw8ImOFhX3hk=
-AllowedIPs = 192.168.21.0/24, 192.168.3.0/24
-Endpoint = 26.115.154.67:8181
-PersistentKeepalive = 25
-Get-Command -Module VpnClient
-Add-VpnConnection -Name "vpn-failon" -ServerAddress "26.115.154.67" -TunnelType L2TP -L2tpPsk "123098" -EncryptionLevel "Required" -AuthenticationMethod MSChapv2 -RememberCredential -AllUserConnection –PassThru -Force
--TunnelType PPTP/L2TP/SSTP/IKEv2/Automatic
--L2tpPsk использовать общий ключ для аутентификации (без
-параметра, для L2TP аутентификации используется сертификат)
--AuthenticationMethod Pap/Chap/MSChapv2/Eap/MachineCertificate
--EncryptionLevel NoEncryption/Optional/Required/Maximum/Custom
--SplitTunneling заворачивать весь трафик через VPN-туннель
-(включение Use default gateway on remote network в настройках параметра
-VPN адаптера)
--UseWinlogonCredential использовать учетные данные текущего
-пользователя для аутентификации на VPN сервере
--RememberCredential разрешить сохранять учетные данные для
-VPN подключения (учетная запись и пароль сохраняются в диспетчер учетных
-данных Windows после первого успешного подключения)
--DnsSuffix domain.local
--AllUserConnection разрешить использовать VPN подключение
-для всех пользователей компьютера (сохраняется в конфигурационный файл:
-C:.pbk)
Install-Module -Name VPNCredentialsHelper модуль для
-сохранения логина и пароля в Windows Credential Manager для VPN
-подключения
-Set-VpnConnectionUsernamePassword -connectionname vpn-failon -username user1 -password password
rasdial "vpn-failon" подключиться
-Get-VpnConnection -AllUserConnection | select * список VPN
-подключения, доступных для всех пользователей, найстройки и текущий
-статус подключения (ConnectionStatus)
-Add-VpnConnectionRoute -ConnectionName vpn-failon -DestinationPrefix 192.168.3.0/24 –PassThru
-динамически добавить в таблицу маршрутизации маршрут, который будет
-активен при подключении к VPN
-Remove-VpnConnection -Name vpn-failon -AllUserConnection -Force
-удалить
Set-VpnConnection -Name "vpn-failon" -SplitTunneling $True
-включить раздельное тунеллирование
-Add-VpnConnectionRoute -ConnectionName "vpn-failon" -DestinationPrefix 172.22.22.0/24
-настроить маршрутизацию к указанной подсети через VPN-соединение
-(Get-VpnConnection -ConnectionName "vpn-failon").routes
-отобразить таблицу маршрутизации для указанного соединения
-Remove-VpnConnectionRoute -ConnectionName "vpn-failon" -DestinationPrefix "172.22.23.0/24"
$user = "lifailon"
-$pass = "Proxy"
-$SecureString = ConvertTo-SecureString $pass -AsPlainText -Force
-$Credential = New-Object System.Management.Automation.PSCredential($user, $SecureString)
-[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy("http://192.168.3.100:9090")
-[System.Net.Http.HttpClient]::DefaultProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
-[System.Net.Http.HttpClient]::DefaultProxy.Credentials = $Credential
-Invoke-RestMethod http://ifconfig.me/ip
-Invoke-RestMethod https://kinozal.tv/rss.xml
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:.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
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 удалить сессию
-Import-Module -Name ActiveDirectory -PSSession $srv
-импортировать модуль с удаленного компьютера в локальную сессию
winrm quickconfig -quiet изменит запуск службы WinRM на
-автоматический, задаст стандартные настройки WinRM и добавить исключения
-для портов в fw
-Enable-PSRemoting –Force включить PowerShell Remoting,
-работает только для доменного и частного сетевых профилей Windows
-Enable-PSRemoting -SkipNetworkProfileCheck -Force для
-настройки компьютера в общей (public) сети (работает с версии powershell
-6)
$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)
$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 *
-информация о сертификате
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
-настройки в реестре (например, для включения аудентификации в _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 сети)
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
-
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 системе
.\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)
Import-Module PackageManagement импортировать
-модуль
-Get-Module PackageManagement информация о модуле
-Get-Command -Module PackageManagement отобразить все
-командлеты модуля
-Get-Package отобразить все установленные пакеты
-PowerShellGallery
-Get-Package -ProviderName msi,Programs список установленных
-программ
-[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
-включить использование протокол TLS 1.2 (если не отключены протоколы TLS
-1.0 и 1.1)
-Find-PackageProvider поиск провайдеров
-Install-PackageProvider PSGallery -force установить
-источник
-Install-PackageProvider NuGet -force
-Install-PackageProvider Chocolatey -force
-Get-PackageSource источники установки пакетов
-Set-PackageSource -Name PSGallery -Trusted по
-умолчанию
-Find-Package -Name *Veeam* -Source PSGallery поиск пакетов
-с указанием источника
-Install-Package -Name VeeamLogParser -ProviderName PSGallery -scope CurrentUser
-Get-Command *Veeam*
-Import-Module -Name VeeamLogParser загрузить модуль
-Get-Module VeeamLogParser | select -ExpandProperty ExportedCommands
-отобразить список функций
winget list список установленных пакетов
-winget search VLC найти пакет
-winget show VideoLAN.VLC информация о пакете
-winget show VideoLAN.VLC --versions список доступных версий
-в репозитории
-winget install VideoLAN.VLC установить пакет
-winget uninstall VideoLAN.VLC удалить пакет
-winget download jqlang.jq загрузкить пакет
-(https://github.com/jqlang/jq/releases/download/jq-1.7/jq-windows-amd64.exe)
-winget install jqlang.jq добавляет в переменную среду и
-псевдоним командной строки jq
-winget uninstall jqlang.jq
[uri]$url = $($(irm https://api.github.com/repos/jqlang/jq/releases/latest).assets.browser_download_url -match "windows-amd64").ToString() # получить версию latest на GitHub
-irm $url -OutFile "C:\Windows\System32\jq.exe" # загрузить jq.exeSet-ExecutionPolicy RemoteSigned -Scope CurrentUser
-irm get.scoop.sh | iex установка
-scoop help
-scoop search jq
-scoop info jq
-(scoop info jq).version
-scoop cat jq
-scoop download jq C:
-scoop install jq C:\1.7
-scoop list
-(scoop list).version
-scoop uninstall jq
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))choco -v
-choco -help
-choco list
-choco install adobereader
Invoke-RestMethod https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile "$home\Documents\nuget.exe"
-Invoke-Expression "$home\Documents\nuget.exe search Selenium.WebDriver"
-Invoke-Expression "$home\Documents\nuget.exe install Selenium.WebDriver"
-Get-Item $home\Documents\*Selenium*
& "$home\Documents\nuget.exe" list console-translate
-$nuget_api_key = "<API-KEY>"
-$source = "https://api.nuget.org/v3/index.json"
-$Name = "Console-Translate"
-$path = "$home\Documents\$Name"
-New-Item -Type Directory $path
-Copy-Item "$home\Documents\Git\$Name\$Name\0.2\*" "$path\"
-Copy-Item "$home\Documents\Git\$Name\LICENSE" "$path\"
-Copy-Item "$home\Documents\Git\$Name\README.md" "$path\"
'<?xml version="1.0"?>
-<package >
- <metadata>
- <id>Console-Translate</id>
- <version>0.2.2</version>
- <authors>Lifailon</authors>
- <owners>Lifailon</owners>
- <description>Cross-platform client for translating text in the console, uses API Google (edded public free token), MyMemory and DeepLX (no token required)</description>
- <tags>PowerShell, Module, Translate, api</tags>
- <projectUrl>https://github.com/Lifailon/Console-Translate</projectUrl>
- <contentFiles>
- <files include="Console-Translate.psm1" buildAction="Content" />
- <files include="Console-Translate.psd1" buildAction="Content" />
- <files include="lang-iso-639-1.csv" buildAction="Content" />
- <files include="README.md" buildAction="Content" />
- <files include="LICENSE" buildAction="Content" />
- </contentFiles>
- </metadata>
-</package>' > "$path\$Name.nuspec"Set-Location $path
-& "$home\Documents\nuget.exe" pack "$path\$Name.nuspec"
-& "$home\Documents\nuget.exe" push "$path\$Name.0.2.2.nupkg" -ApiKey $nuget_api_key -Source $source
-& "$home\Documents\nuget.exe" push "$path\$Name.0.2.2.nupkg" -ApiKey $nuget_api_key -Source $source -SkipDuplicate
Install-Package Console-Translate -Source nuget.org
-Get-Package Console-Translate | select *
Register-PSRepository -Name "NuGet" -SourceLocation "https://www.nuget.org/api/v2" -InstallationPolicy Trusted
-Get-PSRepository
-Find-Module -Name Console-Translate
-Install-Module Console-Translate -Repository NuGet
& "$home\Documents\nuget.exe" delete Console-Translate 0.2.0 -Source https://api.nuget.org/v3/index.json -ApiKey $nuget_api_key -NoPrompt
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
-удалить все коммиты до указанного (и откатиться до него)
Import-Module PSDesiredStateConfiguration
-Get-Command -Module PSDesiredStateConfiguration
-(Get-Module PSDesiredStateConfiguration).ExportedCommands
-Get-DscLocalConfigurationManager
Get-DscResource
-Get-DscResource -Name File -Syntax
-https://learn.microsoft.com/ru-ru/powershell/dsc/reference/resources/windows/fileresource?view=dsc-1.1
Ensure = Present настройка должна быть включена (каталог
-должен присутствовать, процесс должен быть запущен, если нет – создать,
-запустить)
-Ensure = Absent настройка должна быть выключена (каталога
-быть не должно, процесс не должен быть запущен, если нет – удалить,
-остановить)
Configuration TestConfiguraion
-{
- Ctrl+Space
-}
-
-Configuration DSConfigurationProxy
-{
- Node vproxy-01
- {
- File CreateDir
- {
- Ensure = "Present"
- Type = "Directory"
- DestinationPath = "C:\Temp"
- }
- Service StopW32time
- {
- Name = "w32time"
- State = "Stopped"` Running
- }
- WindowsProcess RunCalc
- {
- Ensure = "Present"
- Path = "C:\WINDOWS\system32\calc.exe"
- Arguments = ""
- }
- Registry RegSettings
- {
- Ensure = "Present"
- Key = "HKEY_LOCAL_MACHINE\SOFTWARE\MySoft"
- ValueName = "TestName"
- ValueData = "TestValue"
- ValueType = "String"
- }
-# WindowsFeature IIS
-# {
-# Ensure = "Present"
-# Name = "Web-Server"
-# }
- }
-}$Path = (DSConfigurationProxy).DirectoryName
-Test-DscConfiguration -Path $Path | select *
-ResourcesInDesiredState - уже настроено, ResourcesNotInDesiredState - не
-настроено (не соответствует)
-Start-DscConfiguration -Path $Path
-Get-Job
-$srv = "vproxy-01"
-Get-Service -ComputerName $srv | ? name -match w32time # Start-Service
-icm $srv {Get-Process | ? ProcessName -match calc} | ft # Stop-Process -Force
-icm $srv {ls C:\ | ? name -match Temp} | ft
-rm```PowerShell Configuration InstallPowerShellCore { Import-DscResource -ModuleName PSDesiredStateConfiguration Node localhost { Script InstallPowerShellCore { GetScript = { return @{ GetScript = $GetScript } } SetScript = { [string]$url = $(Invoke-RestMethod https://api.github.com/repos/PowerShell/PowerShell/releases/latest).assets.browser_download_url -match "win-x64.zip" $downloadPath = "$home\Downloads\PowerShell.zip" $installPath = "$env:ProgramFiles\PowerShell\7" Invoke-WebRequest -Uri $url -OutFile $downloadPath Expand-Archive -Path $downloadPath -DestinationPath $installPath -Force } TestScript = { return Test-Path "$env:ProgramFiles\PowerShell\7\pwsh.exe" } } } } ```$Path
-=
-(InstallPowerShellCore).DirectoryName\Test-DscConfiguration
--Path $Path\Start-DscConfiguration -Path $path -Wait
--Verbose\Get-Job`
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-book-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-book-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) с просмотром все применяемых
-переменных
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 setup собрать подробную информацию о
-системе
-ansible ws -m win_whoami информация о правах доступах,
-группах доступа
-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"
nano /etc/ansible/PowerShell-Vars.yml
- hosts: ws
- ` Указать коллекцию модулей
- collections:
- - ansible.windows
- ` Задать переменные
- vars:
- SearchName: PermitRoot
- tasks:
- - name: Get port ssh
- win_shell: |
- Get-Content "C:\Programdata\ssh\sshd_config" | Select-String "{{SearchName}}"
- ` Передать вывод в переменную
- register: command_output
- - name: Output port ssh
- ` Вывести переменную на экран
- debug:
- var: command_output.stdout_lines
-ansible-playbook /etc/ansible/PowerShell-Vars.yml
-ansible-playbook /etc/ansible/PowerShell-Vars.yml --extra-vars "SearchName='LogLevel|Syslog'"
-передать переменную
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
nano /etc/ansible/setup-adobe-acrobat.yml
- hosts: ws
- tasks:
- - name: Install Acrobat Reader
- win_chocolatey:
- name: adobereader
- state: present
-ansible-playbook /etc/ansible/setup-adobe-acrobat.yml
nano /etc/ansible/setup-openssh.yml
- hosts: ws
- tasks:
- - name: install the Win32-OpenSSH service
- win_chocolatey:
- name: openssh
- package_params: /SSHServerFeature
- state: present
-ansible-playbook /etc/ansible/setup-openssh.yml
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
nano /etc/ansible/win-service.yml
- hosts: ws
- tasks:
- - name: Start service
- win_service:
- name: sshd
- state: started
-# state: stopped
-# state: restarted
-# start_mode: auto
-ansible-playbook /etc/ansible/win-service.yml
nano /etc/ansible/get-service.yml
- hosts: ws
- tasks:
- - name: Get info for a single service
- win_service_info:
- name: sshd
- register: service_info
- - name: Print returned information
- ansible.builtin.debug:
- var: service_info.services
-ansible-playbook /etc/ansible/get-service.yml
nano /etc/ansible/copy-from-win-to-local.yml
- hosts: ws
- tasks:
- - name: Retrieve remote file on a Windows host
-# Скопировать файл из Windows-системы
- ansible.builtin.fetch:
-# Прочитать файл (передать в память в формате Base64)
-# ansible.builtin.slurp:
- src: C:\Telegraf\telegraf.conf
- dest: /root/telegraf.conf
- flat: yes
- register: telegraf_conf
- - name: Print returned information
- ansible.builtin.debug:
- msg: "{{ telegraf_conf['content'] | b64decode }}"
-ansible-playbook /etc/ansible/copy-from-win-to-local.yml
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
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
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
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
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
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
nano /etc/ansible/creat-win-user.yml
- hosts: ws
- tasks:
- - name: Creat user
- win_user:
- name: test
- password: 123098
- state: present
- groups:
- - deploy
-ansible-playbook /etc/ansible/creat-win-user.yml
nano /etc/ansible/delete-win-user.yml
- hosts: ws
- tasks:
- - name: Delete user
- ansible.windows.win_user:
- name: test
- state: absent
-ansible-playbook /etc/ansible/delete-win-user.yml
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
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
nano /etc/ansible/win-ls.yml
- hosts: ws
- tasks:
- - name: Find files in multiple paths
- ansible.windows.win_find:
- paths:
- - D:\Install\OpenSource
- patterns: ['*.rar','*.zip','*.msi']
- ` Файл созданный менее 7 дней назад
- age: -7d
- ` Размер файла больше 10MB
- size: 10485760
- ` Рекурсивный поиск (в дочерних директориях)
- recurse: true
- register: command_output
- - name: Output
- debug:
- var: command_output
-ansible-playbook /etc/ansible/win-ls.yml
nano /etc/ansible/rest-get.yml
- hosts: ws
- tasks:
- - name: REST GET request to endpoint github
- ansible.windows.win_uri:
- url: https://api.github.com/repos/Lifailon/pSyslog/releases/latest
- register: http_output
- - name: Output
- debug:
- var: http_output
-ansible-playbook /etc/ansible/rest-get.yml
nano /etc/ansible/win-update.yml
- hosts: ws
- tasks:
- - name: Install only particular updates based on the KB numbers
- ansible.windows.win_updates:
- category_names:
- - SecurityUpdates
- - CriticalUpdates
- - UpdateRollups
- - Drivers
- ` Фильтрация
- ` accept_list:
- ` - KB2267602
- ` Поиск обновлений
- ` state: searched
- ` Загрузить обновления
- ` state: downloaded
- ` Установить обновления
- state: installed
- log_path: C:\Ansible-Windows-Upadte-Log.txt
- reboot: false
- register: wu_output
- - name: Output
- debug:
- var: wu_output
-ansible-playbook /etc/ansible/win-update.yml
https://chocolatey.org/install
-https://community.chocolatey.org/api/v2/package/chocolatey
-https://docs.chocolatey.org/en-us/guides/organizations/organizational-deployment-guide
- name: Ensure Chocolatey installed from internal repo
- win_chocolatey:
- name: chocolatey
- state: present
- # source: URL-адрес внутреннего репозитория
- source: https://community.chocolatey.org/api/v2/ChocolateyInstall.ps1
-Invoke-WebRequest "https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt" -OutFile "$home\Downloads\russian_trusted_root_ca.cer"
-скачать сертификат минцифры
-Invoke-WebRequest "https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt" -OutFile "$home\Downloads\russian_trusted_sub_ca.cer"
-Import-Certificate -FilePath "$home\Downloads\russian_trusted_root_ca.cer" -CertStoreLocation "Cert:\CurrentUser\Root"
-установить сертификат минцифры
-Import-Certificate -FilePath "$home\Downloads\russian_trusted_sub_ca.cer" -CertStoreLocation "Cert:\CurrentUser\CA"
$Client_ID = "7e6d2f9f-825e-49b7-98f4-62fbb7506427" # [System.Guid]::Parse("7e6d2f9f-825e-49b7-98f4-62fbb7506427")
-$Client_Secret = "c35113ee-6757-47ba-9853-ea1d0d9db1ef" # [System.Guid]::Parse("c35113ee-6757-47ba-9853-ea1d0d9db1ef")
-$Client_Join = $Client_ID+":"+$Client_Secret # объединяем два UUID в одну строку, разделяя их символом ':'
-$Bytes = [System.Text.Encoding]::UTF8.GetBytes($Client_Join) # преобразуем строку в массив байт
-$Cred_Base64 = [Convert]::ToBase64String($Bytes) # кодируем байты в строку Base64$Cred_Base64 = "N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ=="
-$UUID = [System.Guid]::NewGuid() генерируем UUID для
-журналирования входящих вызовов и разбора инцидентов
$url = "https://ngw.devices.sberbank.ru:9443/api/v2/oauth"
-$headers = @{
- "Authorization" = "Basic $Cred_Base64"
- "RqUID" = "$UUID"
- "Content-Type" = "application/x-www-form-urlencoded"
-}
-$body = @{
- scope = "GIGACHAT_API_PERS"
-}
-$GIGA_TOKEN = $(Invoke-RestMethod -Uri $url -Method POST -Headers $headers -Body $body).access_token[string]$content = "Посчитай сумму чисел: 22+33"
-[string]$role = "user" # роль автора сообщения (user/assistant/system)
-[float]$temperature = 0.7 # температура выборки в диапазоне от 0 до 2. Чем выше значение, тем более случайным будет ответ модели.
-[float]$top_p = 0.1 # используется как альтернатива temperature и изменяется в диапазоне от 0 до 1. Задает вероятностную массу токенов, которые должна учитывать модель. Так, если передать значение 0.1, модель будет учитывать только токены, чья вероятностная масса входит в верхние 10%.
-[int64]$n = 1 # количество вариантов ответов (1..4), которые нужно сгенерировать для каждого входного сообщения
-[int64]$max_tokens = 512 # максимальное количество токенов, которые будут использованы для создания ответов
-[boolean]$stream = $false # передавать сообщения по частям в потоке$url = "https://gigachat.devices.sberbank.ru/api/v1/chat/completions"
-$headers = @{
- "Authorization" = "Bearer $GIGA_TOKEN"
- "Content-Type" = "application/json"
-}
-
-$(Invoke-RestMethod -Uri "https://gigachat.devices.sberbank.ru/api/v1/models" -Headers $headers).data # список доступных моделей
-
-$body = @{
- model = "GigaChat:latest"
- messages = @(
- @{
- role = $role
- content = $content
- }
- )
- temperature = $temperature
- n = $n
- max_tokens = $max_tokens
- stream = $stream
-} | ConvertTo-Json
-$Request = Invoke-RestMethod -Method POST -Uri $url -Headers $headers -Body $body
-$Request.choices.message.contentwget https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt
-wget https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt
-mkdir /usr/local/share/ca-certificates/russian_trusted
-cp russian_trusted_root_ca_pem.crt russian_trusted_sub_ca_pem.crt /usr/local/share/ca-certificates/russian_trusted
-update-ca-certificates -v
-wget -qS --spider --max-redirect=0 https://www.sberbank.ru
Cred_Base64="N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ=="
-UUID=$(uuidgen)
-GIGA_TOKEN=$(curl -s --location --request POST "https://ngw.devices.sberbank.ru:9443/api/v2/oauth" \
---header "Authorization: Basic $Cred_Base64" \
---header "RqUID: $UUID" \
---header "Content-Type: application/x-www-form-urlencoded" \
---data-urlencode 'scope=GIGACHAT_API_PERS' | jq -r .access_token)curl -s --location "https://gigachat.devices.sberbank.ru/api/v1/models" --header "Authorization: Bearer $GIGA_TOKEN" | jq .
-для проверки
request=$(curl -s https://gigachat.devices.sberbank.ru/api/v1/chat/completions \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer $GIGA_TOKEN" \
- -d '{
- "model": "GigaChat:latest",
- "messages": [
- {
- "role": "user",
- "content": "Когда уже ИИ захватит этот мир?"
- }
- ],
- "temperature": 0.7
-}')
-echo $request | jq -r .choices[].message.contenthttps://cloud.yandex.ru/ru/docs/iam/operations/iam-token/create время
-жизни IAM-токена не больше 12 часов
-yandexPassportOauthToken="y0_AgAAAAAGaLFLAATuwQAAAAD3xtRLQE4hvlazQ5euKO43XXXXXXXXXXX"
-для bash
-$yandexPassportOauthToken = "y0_AgAAAAAGaLFLAATuwQAAAAD3xtRLQE4hvlazQ5euKO43XXXXXXXXXXX"
-для PowerShell
IAM_TOKEN=$(curl -s -d "{\"yandexPassportOauthToken\":\"$yandexPassportOauthToken\"}" "https://iam.api.cloud.yandex.net/iam/v1/tokens" | jq -r .iamToken)
-$IAM_TOKEN = $(Invoke-RestMethod -Method POST -Uri "https://iam.api.cloud.yandex.net/iam/v1/tokens" -Body $(@{yandexPassportOauthToken = "$yandexPassportOauthToken"} | ConvertTo-Json -Compress)).iamToken
CLOUD_ID=$(curl -s -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/clouds | jq -r .clouds[].id) # получить cloud id
-curl -s --request GET -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders -d "{\"cloudId\": \"$CLOUD_ID\"}" # получить список директорий в облаке
-curl -s --request POST -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders -d "{\"cloudId\": \"$CLOUD_ID\", \"name\": \"test\"}" # создать директорию в облаке
-FOLDER_ID=$(curl -s --request GET -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders -d '{"cloudId": "b1gf9n6heihqj0pt5piu"}' | jq -r '.folders[] | select(.name == "test") | .id') # забрать id директории$CLOUD_ID = $(Invoke-RestMethod -Method Get -Uri "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/clouds" -Headers @{"Authorization"="Bearer $IAM_TOKEN"; "Content-Type"="application/json"}).clouds.id
-$FOLDER_ID = $(Invoke-RestMethod -Method Get -Uri "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders" -Headers @{"Authorization"="Bearer $IAM_TOKEN"; "Content-Type"="application/json"} -Body (@{"cloudId"= $CLOUD_ID} | ConvertTo-Json)).folders | Where-Object name -eq test | Select-Object -ExpandProperty idmodel="gpt://$FOLDER_ID/yandexgpt/latest" # https://cloud.yandex.ru/ru/docs/yandexgpt/concepts/models
-body=$(cat <<EOF
-{
- "modelUri": "$model",
- "completionOptions": {
- "stream": false,
- "temperature": 0.6,
- "maxTokens": 2000
- },
- "messages": [
- {
- "role": "user",
- "text": "Посчитай сумму 22+33"
- }
- ]
-}
-EOF)
-curl --request POST \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer $IAM_TOKEN" \
- -H "x-folder-id: $FOLDER_ID" \
- -d "$body" \
- "https://llm.api.cloud.yandex.net/foundationModels/v1/completion"$model = "gpt://$FOLDER_ID/yandexgpt/latest"
-$body = @"
-{
- "modelUri": "$model",
- "completionOptions": {
- "stream": false,
- "temperature": 0.6,
- "maxTokens": 2000
- },
- "messages": [
- {
- "role": "user",
- "text": "Посчитай сумму 22+33"
- }
- ]
-}
-"@
-Invoke-RestMethod -Method POST -Uri "https://llm.api.cloud.yandex.net/foundationModels/v1/completion" -Headers @{"Content-Type"="application/json"; "Authorization"="Bearer $IAM_TOKEN"; "x-folder-id"="$FOLDER_ID"} -Body $bodyhttps://github.com/TransformerOptimus/SuperAGI
-https://models.superagi.com/playground/generate
-https://documenter.getpostman.com/view/30119783/2s9YR3cFJG
SUPERAGI_API_KEY="31f72164129XXXXX"
-prompt="посчитай сумму 22+33, дай только ответ без лишнего текста"
-request=$(curl -s -X POST 'https://api.superagi.com/v1/generate/65437cbf227a4018516ad1ce' \
--H 'Content-Type: application/json' \
--H "Authorization: Bearer $SUPERAGI_API_KEY" \
--d '{
- "prompt": ["$prompt"],
- "max_tokens": 500,
- "temperature": 0.9,
- "top_p": 0.15,
- "repetition_penalty": 0,
- "best_of": 1.05,
- "top_k": 50,
- "stream": false
-}')
-echo $request | sed "s/data: //" | jq -r .choices[].text$SUPERAGI_API_KEY = "31f72164129XXXXX"
-$prompt = "посчитай сумму 22+33, дай только ответ без лишнего текста"
-$request = Invoke-RestMethod -Method Post -Uri 'https://api.superagi.com/v1/generate/65437cbf227a4018516ad1ce' -Headers @{
- 'Content-Type' = 'application/json'
- 'Authorization' = "Bearer $SUPERAGI_API_KEY"
-} -Body (@{
- prompt = @($prompt)
- max_tokens = 500
- temperature = 0.9
- top_p = 0.15
- repetition_penalty = 0
- best_of = 1.05
- top_k = 50
- stream = $false
-} | ConvertTo-Json)
-$($request -replace "^data: " | ConvertFrom-Json).choices.texthttps://replicate.com/stability-ai/stable-diffusion/examples?input=http
-REPLICATE_API_TOKEN="r8_STyeUNXiGonkLfxE1FSKaqll26lXXXXXXXXXX"
-prompt="Жираф в полоску зебры"
-request=$(curl -s -X POST \
- -H "Authorization: Token $REPLICATE_API_TOKEN" \
- -H "Content-Type: application/json" \
- -d $'{
- "version": "ac732df83cea7fff18b8472768c88ad041fa750ff7682a21affe81863cbe77e4",
- "input": {
- "prompt": "$prompt"
- }
- }' \
- https://api.replicate.com/v1/predictions)
-request_url=$(echo $request | jq -r .urls.get)
-response_status=$(curl -s -H "Authorization: Token $REPLICATE_API_TOKEN" $request_url | jq -r .status)
-while [[ $response_status != succeeded ]]; do
- response_status=$(curl -s -H "Authorization: Token $REPLICATE_API_TOKEN" $request_url | jq -r .status)
-done
-curl -s -H "Authorization: Token $REPLICATE_API_TOKEN" $request_url | jq -r .output[]$REPLICATE_API_TOKEN = "r8_STyeUNXiGonkLfxE1FSKaqll26lXXXXXXXXXX"
-$prompt = "Жираф в полоску зебры"
-$body = @{
- version = "ac732df83cea7fff18b8472768c88ad041fa750ff7682a21affe81863cbe77e4"
- input = @{
- prompt = $prompt
- }
-} | ConvertTo-Json
-$headers = @{
- "Authorization" = "Token $REPLICATE_API_TOKEN"
- "Content-Type" = "application/json"
-}
-$request = Invoke-RestMethod -Uri "https://api.replicate.com/v1/predictions" -Method POST -Body $body -Headers $headers
-$response = Invoke-RestMethod $($request.urls.get) -Headers @{"Authorization" = "Token $REPLICATE_API_TOKEN"}
-while ($response.status -ne "succeeded") {
- $response = Invoke-RestMethod $($request.urls.get) -Headers @{"Authorization" = "Token $REPLICATE_API_TOKEN"}
-}
-$response.output$Key = "<TOKEN_API>" # получить токен: https://console.cloud.google.com/apis/credentials
-$Text = "You can see in the right corner how long each translation request takes (this does not depend on the amount of text being transferred)."
-$LanguageTarget = "RU"
-$LanguageSource = "EN"
-$url = "https://translation.googleapis.com/language/translate/v2?key=$key"
-$Header = @{
- "Content-Type" = "application/json"
-}
-$Body = @{
- "q" = "$Text"
- "target" = "$LanguageTarget"
- "source" = "$LanguageSource"
-} | ConvertTo-Json
-$WebClient = New-Object System.Net.WebClient
-foreach ($key in $Header.Keys) {
- $WebClient.Headers.Add($key, $Header[$key])
-}
-$Response = $WebClient.UploadString($url, "POST", $Body) | ConvertFrom-Json
-$Response.data.translations.translatedText$Key = "<TOKEN_API>" # получить токен: https://developers.google.com/custom-search/v1/overview?hl=ru (пользовательский поиск JSON API предоставляет 100 поисковых запросов в день бесплатно)
-$cx = "35c78340f49eb474a" # создать поисковую систему https://programmablesearchengine.google.com/controlpanel/all
-$Query = "как создать бота discord"
-$Lang = "ru"
-$Num = 10
-$Start = 0
-$response = Invoke-RestMethod "https://www.googleapis.com/customsearch/v1?q=$Query&key=$Key&cx=$cx&lr=lang_$Lang&num=$Num&$start=$Start"
-$response.items | Select-Object title,snippet,displayLink,link | Format-Listhttps://rapidapi.com/ru/neoscrap-net/api/google-search72
-$Key = "<TOKEN_API>"
-$headers=@{}
-$headers.Add("X-RapidAPI-Key", "$Key")
-$headers.Add("X-RapidAPI-Host", "google-search72.p.rapidapi.com")
-$query = "как создать бота discord"
-$response = Invoke-RestMethod "https://google-search72.p.rapidapi.com/search?q=$query%20gitgub&gl=us&lr=lang_ru&num=20&start=0" -Method GET -Headers $headers
-$response.items | Select-Object title,snippet,displayLink,link | Format-Listhttps://rapidapi.com/apidojo/api/imdb8
-$key = "<TOKEN_API>" # 500 запросов в месяц
-$query="Break"
-$headers=@{}
-$headers.Add("X-RapidAPI-Key", "$key")
-$headers.Add("X-RapidAPI-Host", "imdb8.p.rapidapi.com")
-$response = Invoke-RestMethod "https://imdb8.p.rapidapi.com/title/find?q=$query" -Method GET -Headers $headers
-$response.results | select title,titletype,year,runningTimeInMinutes,id | Format-Table
-"https://www.imdb.com$($response.results.id[0])"
-$response.results.principals # актеры
-$response.results.imagehttps://rapidapi.com/SAdrian/api/moviesdatabase
-$key = "<TOKEN_API>"
-$imdb_id = "tt0455275"
-$headers=@{}
-$headers.Add("X-RapidAPI-Key", "$key")
-$headers.Add("X-RapidAPI-Host", "moviesdatabase.p.rapidapi.com")
-$response = Invoke-RestMethod "https://moviesdatabase.p.rapidapi.com/titles/$imdb_id" -Method GET -Headers $headers
-$response.resultshttps://developer.themoviedb.org/reference/intro/getting-started
-$TOKEN = "548e444e7812575caa0a7eXXXXXXXXXX"
-$Endpoint = "search/tv" # поиск сериала (tv) и фильма (movie) по названию
-$Query = "зимородок"
-$url = $("https://api.themoviedb.org/3/$Endpoint"+"?api_key=$TOKEN&query=$Query")
-$(Invoke-RestMethod -Uri $url -Method Get).results
-$id = $(Invoke-RestMethod -Uri $url -Method Get).results.id # забрать id сериала (210865) https://www.themoviedb.org/tv/210865
-
-$Endpoint = "tv/$id" # получение информации о сериале по его ID
-$url = $("https://api.themoviedb.org/3/$Endpoint"+"?api_key=$TOKEN")
-$(Invoke-RestMethod -Uri $url -Method Get) # список сезонов (.seasons), количество эпизодов (.seasons.episode_count)
-
-(Invoke-RestMethod -Uri "https://api.themoviedb.org/3/tv/$id/season/2?api_key=$Token" -Method Get).episodes # вывести 2 сезон
-Invoke-RestMethod -Uri "https://api.themoviedb.org/3/tv/$id/season/2/episode/8?api_key=$Token" -Method Get # вывести 8 эпизодhttps://ask.ivi.ru/knowledge-bases/10/articles/51697-dokumentatsiya-dlya-api-ivi
-Invoke-RestMethod https://api.ivi.ru/mobileapi/categories
-список категорий и жанров (genres/meta_genres)
-Invoke-RestMethod https://api.ivi.ru/mobileapi/collections
-подборки
(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons.number
-кол-во сезонов
-(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons[1].episode_count
-кол-во серий во втором сезоне
-(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons[1].ivi_release_info.date_interval_min
-дата выхода следующей серии
-(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.kp_rating
-рейтинг в Кинопоиск (8.04)
$id = (Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.kp_id
-получить id в Кинопоиск (5106881)
-id=$(curl -s https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok | jq .result[].kp_id)
-получить id в Кинопоиск
id=5106881
-get=$(curl -s https://www.kinopoisk.ru/film/$id/episodes/)
-printf "%s\n" "${get[@]}" | grep -A 1 "Сезон 2" | grep "эпизодов" | sed -r "s/^.+\: //" # количество эпиздовод во втором сезоне (8)https://t.me/kinopoiskdev_bot - получить токен
-https://kinopoisk.dev/documentation - документация по API в формате
-OpenAPI
GET /v1.4/movie/{id} поиск по id
$id = 5106881
-$API_KEY = "ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"
-
-$Header = @{
- "accept" = "application/json"
- "X-API-KEY" = "$API_KEY"
-}
-$irm = Invoke-RestMethod "https://api.kinopoisk.dev/v1.4/movie/$id" -Method GET -Headers $Header
-$irm.rating.kp # рейтинг в Кинопоиск (8,079)
-$irm.seasonsInfo # количество сезонов и эпизодов в нихid=5106881
-API_KEY="ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"
-get=$(curl -s -X GET \
- "https://api.kinopoisk.dev/v1.4/movie/$id" \
- -H "accept: application/json" \
- -H "X-API-KEY: $API_KEY")
-echo $get | jq .rating.kp # рейтинг в Кинопоиск (8,079)
-echo $get | jq .seasonsInfo[1].episodesCount # количество эпизодов во втором [1] сезоне (6)GET /v1.4/movie/search
query="zimorodok"
-page=1 # кол-во страниц для выборки
-limit=1 # кол-во элементов на странице
-curl -s -X GET \
- "https://api.kinopoisk.dev/v1.4/movie/search?page=$page&limit=$limit&query=$query" \
- -H "accept: application/json" \
- -H "X-API-KEY: $API_KEY" | jq .
-
-limit=5
-request=$(curl -s -X GET \
- "https://api.kinopoisk.dev/v1.4/movie/search?page=$page&limit=$limit&query=%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA" \
- -H "accept: application/json" \
- -H "X-API-KEY: $API_KEY" | jq .)
-echo $request | jq '.docs[] | select(.year == 2022)' # отфильтровать вывод по году выхода$API_KEY = "ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"
-$page = 1
-$limit = 5
-$query = "%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"
-$request = Invoke-RestMethod -Uri "https://api.kinopoisk.dev/v1.4/movie/search?page=$page&limit=$limit&query=$query" -Headers @{"accept"="application/json"; "X-API-KEY"="$API_KEY"}
-$request.docs | Where-Object year -eq 2022function Get-PercentEncode ($str) {
- $bytes = [System.Text.Encoding]::UTF8.GetBytes($str)
- ($bytes | ForEach-Object { "{0:X2}" -f $_ }) -join '%' -replace "^","%"
-}
-Get-PercentEncode "зимородок"function Get-UrlEncode($str) {
- [System.Web.HttpUtility]::UrlEncode($str)
-}
-UrlEncode "зимородок"percent-encode() {
- str=$1
- echo -n "$1" | iconv -t utf8 | od -An -tx1 | tr ' ' % | tr -d '\n'
-}
-percent-encode "зимородок"function Get-UrlDecode($encoded) {
- [System.Uri]::UnescapeDataString($encoded)
-}
-Get-UrlDecode "%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"percent-decode() {
- encoded=$1
- local url_encoded="${1//+/ }"
- printf '%b' "${url_encoded//%/\\x}"
-}
-percent-decode "%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"https://github.com/notssh/videocdn-api
-https://github.com/API-Movies/videocdn
-https://api-movies.github.io/videocdn/index.json
$kp_id = 5106881
-$token = "YfTWH2p3Mai7ziqDoGjS3yXXXXXXXXXX"
-$ep = "tv-series"
-$(Invoke-RestMethod $("https://videocdn.tv/api/$ep"+"?api_token=$token&field=kinopoisk_id&query=$kp_id")).data.episodes | Where-Object season_num -eq 2 | Select-Object @{Name="Episode"; Expression={$_.num}}, @{Name="Voice"; Expression={$_.media.translation.title}} # отфильтровать серии по второму сезону и отобразить все озвучки к сериямkp_id=5106881
-token="YfTWH2p3Mai7ziqDoGjS3yXXXXXXXXXX"
-ep="tv-series"
-curl -s "https://videocdn.tv/api/$ep?api_token=$token&field=kinopoisk_id&query=$kp_id" | jq ".data[].episodes | length" # количество серий
-curl -s "https://videocdn.tv/api/$ep?api_token=$token&field=kinopoisk_id&query=$kp_id" | jq ".data[].episodes[] | select(.season_num == 2) | {episode: .ru_title, voice: .media[].translation.title}" # отфильтровать параметры вывода@BotFather -(https://t.me/BotFather) /newbot
-https://api.telegram.org/bot
https://core.telegram.org/bots/api#getupdates
-function Get-FromTelegram {
- param (
- $Token = "687...:AAF...",
- [switch]$Date,
- [switch]$Last,
- [switch]$ChatID
- )
- $endpoint = "getUpdates"
- $url = "https://api.telegram.org/bot$Token/$endpoint"
- $result = Invoke-RestMethod -Uri $url
- if ($Date) {
- $Collections = New-Object System.Collections.Generic.List[System.Object]
- foreach ($r in $($result.result)) {
- $EpochTime = [DateTime]"1/1/1970"
- $TimeZone = Get-TimeZone
- $UTCTime = $EpochTime.AddSeconds($r.message.date)
- $d = $UTCTime.AddMinutes($TimeZone.BaseUtcOffset.TotalMinutes)
- $Collections.Add([PSCustomObject]@{
- Message = $r.message.text;
- Date = $d
- })
- }
- $Collections
- }
- else {
- if ($Last) {
- $result.result.message.text[-1]
- }
- elseif ($ChatID) {
- $Collections = New-Object System.Collections.Generic.List[System.Object]
- foreach ($r in $($result.result)) {
- $Collections.Add([PSCustomObject]@{
- Message = $r.message.text;
- UserName = $r.message.chat.username;
- ChatID = $r.message.chat.id;
- ChatType = $r.message.chat.type
- })
- }
- $Collections
- }
- else {
- $result.result.message.text
- }
- }
-}Get-FromTelegram
-Get-FromTelegram -Last
-Get-FromTelegram -Date
-Get-FromTelegram -ChatID
https://core.telegram.org/bots/api#sendmessage
-function Send-ToTelegram {
-param (
- [Parameter(Mandatory = $True)]$Text,
- $Token = "687...:AAF...",
- $Chat = "125468108",
- $Keyboard
-)
- $endpoint = "sendMessage"
- $url = "https://api.telegram.org/bot$Token/$endpoint"
- $Body = @{
- chat_id = $Chat
- text = $Text
- }
- if ($keyboard -ne $null) {
- $Body += @{reply_markup = $keyboard}
- }
- Invoke-RestMethod -Uri $url -Body $Body
-}Send-ToTelegram -Text "Send test from powershell"
$LastDate = (Get-FromTelegram -date)[-1].Date
-while ($true) {
- $LastMessage = (Get-FromTelegram -date)[-1]
- Start-Sleep 1
- $LastDateTest = $LastMessage.Date
- if (($LastMessage.Message -match "/Service") -and ($LastDate -ne $LastDateTest)) {
- $ServiceName = $($LastMessage.Message -split " ")[-1]
- $Result = $(Get-Service $ServiceName -ErrorAction Ignore).Status
- if ($Result) {
- Send-ToTelegram -Text $Result
- } else {
- Send-ToTelegram -Text "Service not found"
- }
- $LastDate = $LastDateTest
- }
-}/Service vpnagent
-/Service WinRM
-/Service test
$keyboard = '{
- "inline_keyboard":[[
- {"text":"Uptime","callback_data":"/Uptime"},
- {"text":"Test","callback_data":"/Test"}
- ]]
-}'
-Send-ToTelegram -Text "Test buttons" -Keyboard $keyboard
-$request = (Invoke-RestMethod -Uri "https://api.telegram.org/bot$Token/getUpdates").result.callback_query
-$request.data # прочитать callback_data нажатой кнопки
-$request.message.datehttps://discord.com/developers/applications
-Создаем Applications (General Information). В Bot привязываем к -Application и копируем токен авторизации. В OAuth2 - URL Generator -выбираем bot и права Administrator и копируем созданный URL для -добавления на канал. Переходим по url и добавляем бота на сервер. -Получаем ID канала на сервере (текстовые каналы, правой кнопкой мыши -копируем ссылку и забираем последний id в url).
-DISCORD_TOKEN="MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
-DISCORD_CHANNEL_ID="119403124XXXXXXXXXX"
-TEXT="test from bash"
-URL="https://discordapp.com/api/channels/$DISCORD_CHANNEL_ID/messages"
-curl -s -X POST $URL \
- -H "Authorization: Bot $DISCORD_TOKEN" \
- -H "Content-Type: application/json" \
- -d "{\"content\": \"$TEXT\"}"$DISCORD_TOKEN = "MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
-$DISCORD_CHANNEL_ID = "119403124XXXXXXXXXX"
-$TEXT = "test from PowerShell"
-$URL = "https://discordapp.com/api/channels/$DISCORD_CHANNEL_ID/messages"
-$Body = @{
- content = $TEXT
-} | ConvertTo-Json
-curl -s $URL -X POST -H "Authorization: Bot $DISCORD_TOKEN" -H "Content-Type: application/json" -d $Bodycurl -s -X GET $URL \
- -H "Authorization: Bot $DISCORD_TOKEN" \
- -H "Content-Type: application/json" | jq -r .[0].content$messages = (curl -s -X GET $URL -H "Authorization: Bot $DISCORD_TOKEN" -H "Content-Type: application/json" | ConvertFrom-Json)
-$messages | Select-Object content,timestamp,{$_.author.username}$DISCORD_TOKEN = "MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
-$DISCORD_CHANNEL_ID = "119403124XXXXXXXXXX"
-$URL = "https://discordapp.com/api/channels/$DISCORD_CHANNEL_ID/messages"
-$HttpClient = New-Object System.Net.Http.HttpClient
-$HttpClient.DefaultRequestHeaders.Authorization = "Bot $DISCORD_TOKEN"
-$response = $HttpClient.GetAsync($URL).Result
-$messages = $response.Content.ReadAsStringAsync().Result
-($messages | ConvertFrom-Json).contentcurl -X POST $URL \
- -H "Content-Type: application/json" \
- -H "Authorization: Bot $DISCORD_TOKEN" \
- -d '
- {
- "content": "Test text for button",
- "components": [
- {
- "type": 1,
- "components": [
- {
- "type": 2,
- "label": "Button",
- "style": 1,
- "custom_id": "button_click"
- }
- ]
- }
- ]
- }'Add-Type -Path $(ls "$home\Documents\Discord.NET\*.dll").FullName
-# https://discordapp.com/api/webhooks/<webhook_id>/<webhook_token> (Настроить канал - Интеграция)
-$webhookId = 1197577280000000000
-$webhookToken = "rs8AA-XXXXXXXXXXX_Vk5RUI4A6HuSGhpCCTepq25duwCwLXasfv6u23a7XXXXXXXXXX"
-$messageContent = "Test dotNET"
-$client = New-Object Discord.Webhook.DiscordWebhookClient($webhookId, $webhookToken)
-$client.SendMessageAsync($messageContent).Wait()$DiscordAssemblies = $(ls "$home\Documents\Discord.NET\*.dll").FullName
-foreach ($assembly in $DiscordAssemblies) {
- Add-Type -Path $assembly
-}
-$DISCORD_TOKEN = "MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
-$Client = New-Object Discord.WebSocket.DiscordSocketClient
-$Client.Add_MessageReceived({
- param($message)
- if ($message.Author.Id -ne $Client.CurrentUser.Id) {
- Write-Host ("Received message from " + $message.Author.Username + ": " + $message.Content)
- if ($message.Content.Contains("ping")) {
- $message.Channel.SendMessageAsync("pong").GetAwaiter().GetResult()
- }
- }
-})
-$Client.LoginAsync([Discord.TokenType]::Bot, $DISCORD_TOKEN).GetAwaiter().GetResult()
-#$Client.StartAsync().Wait()
-$Client.StartAsync().GetAwaiter().GetResult()
-$Client.ConnectionState
-
-[console]::ReadKey($true)
-$Client.LogoutAsync().GetAwaiter().GetResult()
-$Client.Dispose()winget install JanDeDobbeleer.OhMyPosh -s winget
-choco install oh-my-posh -y
-scoop install https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/oh-my-posh.json
-Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://ohmyposh.dev/install.ps1'))
Get-PoshThemes
-oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/di4am0nd.omp.json" | Invoke-Expression
-oh-my-posh init pwsh --config "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/cert.omp.json" | Invoke-Expression
New-Item -Path $PROFILE -Type File -Force
-notepad $PROFILE
-oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/di4am0nd.omp.json" | Invoke-Expression
Install-Module themes-performance -Repository NuGet
-Import-Module themes-performance
-Set-PoshTheme -Theme System-Sensors # -Save
-Set-PoshTheme -Theme System-Performance # -Save
-Set-PoshTheme -Theme Pwsh-Process-Performance # -SaveInstall-Module -Name Terminal-Icons -Repository PSGallery
-scoop bucket add extras
-scoop install terminal-icons
notepad $PROFILE
-Import-Module -Name Terminal-Icons
Использует шрифты, которые необходимо установить и настроить в
-параметрах профиля PowerShell: Nerd Fonts
-Список шрифтов: https://www.nerdfonts.com/font-downloads
-Скачать и установить шрифт похожий на Cascadia Code - CaskaydiaCove
Source: Pester
-Install-Module -Name Pester -Repository PSGallery -Force -AllowClobber
-Import-Module Pester
-$(Get-Module Pester -ListAvailable).Version
.Tests.ps1
function Add-Numbers {
- param (
- [int]$a,
- [int]$b
- )
- $a + $b
-}
-Describe "Add-Numbers" {
- Context "При сложении двух чисел" {
- It "Должна вернуться правильная сумма" {
- $result = Add-Numbers -a 3 -b 4
- $result | Should -Be 7
- }
- }
- Context "При сложении двух чисел" {
- It "Должна вернуться ошибка (5+0 -ne 4)" {
- $result = Add-Numbers -a 5 -b 0
- $result | Should -Be 4
- }
- }
-}
-
-function Get-RunningProcess {
- return Get-Process | Select-Object -ExpandProperty Name
-}
-Describe "Get-RunningProcess" {
- Context "При наличии запущенных процессов" {
- It "Должен возвращать список имен процессов" {
- $result = Get-RunningProcess
- $result | Should -Contain "svchost"
- $result | Should -Contain "explorer"
- }
- }
- Context "Когда нет запущенных процессов" {
- It "Должен возвращать пустой список" {
- # Замокать функцию Get-Process, чтобы она всегда возвращала пустой список процессов
- Mock Get-Process { return @() }
- $result = Get-RunningProcess
- $result | Should -BeEmpty
- }
- }
-}$release_latest = Invoke-RestMethod "https://api.github.com/repos/BtbN/FFmpeg-Builds/releases/latest"
-$url = $($release_latest.assets | Where-Object name -match "ffmpeg-master-latest-win64-gpl.zip").browser_download_url
-Invoke-RestMethod $url -OutFile $home\Downloads\ffmpeg-master-latest-win64-gpl.zip
-Expand-Archive -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl.zip" -DestinationPath "$home\Downloads\"
-Copy-Item -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe" -Destination "C:\Windows\System32\ffmpeg.exe"
-Remove-Item "$home\Downloads\ffmpeg-*" -Force -Recurseffmpeg -i input.mp4 output.gif конвертировать mp4 в
-gif
-ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" output.gif
-изменить разрешение на выходе
-ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" -r 10 output.gif
-изменить количество кадров в секунду на выходе
-ffmpeg -i input.mp4 -filter_complex "fps=5,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=32[p];[s1][p]paletteuse=dither=bayer" output.gif
-сжатие за счет цветовой политры
-ffmpeg -i input.mp4 -ss 00:00:10 -frames:v 1 -q:v 1 output.jpg
-вытащить скриншот из видео на 10 секунде
-ffmpeg -i input.mp4 -ss 00:00:05 -to 00:00:10 -c copy output.mp4
-вытащить кусок видео
-ffmpeg -i "%d.jpeg" -framerate 2 -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4
-создать видео из фото (1.jpeg, 2.jpeg и т.д.) с framerate (частотой
-кадров) в создаваемом видео 2 кадра в секунду
-ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental output.mp4
-запись без перекодирования (copy) RTSP-потока с камеры видеонаблюдения
-(+ аудио в кодеке AAC) в файл
-ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental -movflags +faststart+frag_keyframe+empty_moov output.mp4
-переместить метаданные в начало файла, что позволяет начать
-воспроизведение файла в видеоплеере до его полной загрузки
-ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -frames:v 1 -c:v mjpeg output.jpg
-сделать скриншот
$release_latest = Invoke-RestMethod "https://api.github.com/repos/jgm/pandoc/releases/latest"
-$url = $($release_latest.assets | Where-Object name -match "windows-x86_64.zip").browser_download_url
-Invoke-RestMethod $url -OutFile $home\Downloads\pandoc.zip
-Expand-Archive -Path "$home\Downloads\pandoc.zip" -DestinationPath "$home\Downloads\"
-$path = $(Get-ChildItem "$home\Downloads\pandoc-*\*.exe").FullName
-Copy-Item -Path $path -Destination "C:\Windows\System32\pandoc.exe"
-Remove-Item "$home\Downloads\pandoc*" -Force -Recursepandoc -s README.md -o PS-Commands.html конвертировать
-из Markdown в HTML
-pandoc -s PS-Commands.html -o README.md конвертировать из
-HTML в Markdown