Вводное:
powershell = командная оболочка, язык сценариев
1. Глагол - существительное
(действие) - (объект)
2. Все время работаем с объектами
Начало работы:
Клавиша "TAB" авто дополнение ввода команд.
Get-Service - показать службы
Get-Process - показать процессы
history - показать историю команд
Начало работы со справкой:
Get-help - справка общая
Get-Command - справка по команде
-Verb - глагол / действие
Get-Command -Verb Get - покажет команды начинающиеся на Get
-Noun - существительное / объект
Get-Command -Noun service - покажет команды управления службами
Get-Command -Noun Module - покажет команды управления модулями
Get-Help Get-Module - показать справку по команде Get-Module где мы увидим интересный ключ -ListAvailable
Get-Module -ListAvailable - покажет все доступные команды модуля Get-Module
Get-Command -Module NetTCPIP - покажет информацию по функции NetTCPIP
Get-Command -Module NetAdapter - покажет информацию по функции NetAdapter
Help - помощь алиас команды Get-Help
Update-Help - обновление справочника команд
Get-Help Get-NetIPAddress - получить справку по модулю Get-NetIPAddress
Get-Help Get-NetIPAddress -Detailed - получить справку по модулю Get-NetIPAddress, подробнее
Get-Help Get-NetIPAddress -Full - получить справку по модулю Get-NetIPAddress, все что есть
Get-Help Get-NetIPAddress -Examples - получить примеры использования команды
Get-Help *IPaddress* - будет показано все команды где встречается *IPaddress*
Get-Help about* - будут показаны файлы abaut, они не связаны с конкретным модулем или функциями но в них есть интересная информация.
Get-Help about_aliases - будет показана справка по about_aliases
Get-Alias - показать все синонимы команд
Поиск команд кратко:
Update-Help
Get-Command
-Verb
-Noun
-Module
Get-Module
-ListAvailable
Get-Help
"Название команды"
-Detailed
-Full
-Examples
-Online
Пример поиска команды создания директории:
Get-Help mkdir - я помню что в cmd команда звучит как mkdir, ищу и нахожу команду New-Item
Get-Help New-Item - получаю справку по команде New-Item
Get-Help New-Item -Examples - получаю примеры использования
New-Item -Path .\zxc1234 -ItemType Directory - создаю директорию zxc1234 в текущем каталоге
Конвейер:
!!! В powershell самая важная часть это конвейеры!
Get-Service | Sort-Object Status | Select-Object -First 10 - нам покажут следующие:
Get-Service выведет список сервисов и передаст дальше по конвейеру,
Sort-Object примет данные, отсортирует по Status и отправит далее,
Select-Object выберет первые 10 объектов и выведет результат на экран.
Для использования конвейера нужно понимать следующие:
0. Какие объекты передаются
- свойства
- методы
1. Какие свойства у объектов
Get-Member - полезная команда позволяет узнать свойства объекта и методы, параметры
Get-Service | Get-Member - узнаем какие есть методы и свойства у команды Get-Service
Get-Service | Get-Member -MemberType Properties - узнаем какие есть свойства у команды Get-Service
dir - алиас команды Get-ChildItem
dir c:\
Get-ChildItem c:\
dir c:\ | Get-Member
dir c:\windows | Get-Member -MemberType Property
Get-Process
Get-Process |Get-Member
Get-Process | Sort-Object -Property CPU
По умолчанию отображается по возрастанию а параметр "-Descending" позволяет отсортировать с большего к меньшему.
Get-Process | Sort-Object -Property CPU -Descending
Что бы показать последние первые пять можно сделать выборку Select-Object -First 5
Get-Process | Sort-Object -Property CPU -Descending |Select-Object -First 5
-Property - это свойство объекта
-Method - это действие над объектом
Get-Service | Get-Member -MemberType Method - покажет доступны методы для Get-Service
Get-Service | Select-Object -First 3 - покажет первые три службы
Для выполнения метода есть специальная конструкция "ForEach-Object метод"
Get-Service | Select-Object -First 3 | ForEach-Object Stop
Get-Service | Out-File "xxx.txt" - перенаправить вывод команды в файл
Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 10 | Out-File "ten_process_use_cpu.txt" - сохранит в файл ten_process_use_cpu.txt вывод команд в конвейере, там будет 10 процессов использующих больше всех CPU.
Out-File - это перенаправление вывода, и подходит для чтения человеком
Export-CSV - это специальный формат csv удобно читаемы для машины
Get-Service | Export-Csv "get_service.csv"
Get-Process |Sort-Object -Property CPU -Descending | Select-Object -First 10 | Export-CSV "ten_process_use_cpu.csv"
Import-Csv .\get_service.csv - выведет на экран содержимое CSV файла
Import-Csv .\get_service.csv | Get-Member - спросим у Get-Member что это
Import-Csv .\get_service.csv | Select-Object -First 1
Format-Table - выполнит форматирование отображения в виде таблицы
Format-Wide - выведет форматирование отображения в сокращенном виде
Import-Csv .\get_service.csv | Select-Object -First 1 | Format-Table
Import-Csv .\get_service.csv | Select-Object -First 1 | Format-Wide
Import-Csv .\get_service.csv | Select-Object -First 1 | ForEach-Object start
Import-Csv .\get_service.csv | Select-Object -First 1 | ForEach-Object stop
Абстракция файловой системы
Get-ChildItem
...-item
...-Content
...-ItemProperty
+
...-PSDrive
...-PSProvider
dir
Get-Alias dir
Get-ChildItem
Get-Command -Noun ChildItem
Get-Help Get-ChildItem
Get-Alias md - cоздать директорию md алиас mkdir
Get-Alias rd - удалить директорию rd алиас Remove-Item
В powershell для работы с файловыми системами(AD, SQL бд, фс, реестр, и т.д.) microsoft придумал специальный драйвер PSProviders
Get-PSProvider - покажет доступные psproviders
Get-PSDrive - покажет доступные подключенные диски\разделы диска
Dir C:\ - показать содержимое диска c:\
Dir HKCU:\ - показать содержимое реестра HKCU
Dir HKLM:\ - показать содержимое реестра HKLM
Dir Env:\ - показать переменные окружения
Get-Command -Noun PSDrive - смотрим что мы можем делать с PSdrive
Get-Help New-PSDrive - смотрим что может делать команда New-PSDrive
New-PSDrive [-Name] [-PSProvider] [-Root] - синтаксис из Get-Help, требуется указать -Name Имя_точки_монтирования, -PSProvider испозуемый_провайдер, -Root Что_монтируем
New-PSDrive Power -PSProvider Registry -Root "HKCU:\Control Panel\Powercfg" - монтирование ветки реестра HKCU:\Control Panel\Powercfg в Power
Get-PSDrive - смотрим доступные провайдеры
Dir Power:\ - показываем содержимое
Get-Command -Noun Item - смотрим что мы можем делать с объектами
Get-Help New-Item - смотрим справку по New-Item, из справки узнаем что команда служит для создания объектов
New-Item ".\myfile.txt" -ItemType File - создаем файл myfile.txt в текущем каталоге
New-Item "C:\\myfile.txt" -ItemType File - создаем файл myfile.txt в корне диска C: (!!! нужны права на запись, ps должен быть запущен от админа)
Get-Command -Noun Content - узнаем о командах Content
Get-Help Set-Content - узнаем что команда Set-Content позволяет записать в файл
Set-Content [-Path] [-Value] - синтаксис команды Set-Content, требуется -Path путь_к_файлу, и -Value что_нужно_записать_в_файл
Set-Content ".\myfile.txt" -Value "Моя первая запись в файл"
Get-Content .\myfile.txt - смотрим что в файле
Get-Help Add-Content - смотрим что умеет делать Add-Content, читаем умеет добавлять запись в объект
Add-Content ".\myfile.txt" -Value "Моя вторая запись"
Get-Content .\myfile.txt - читаем файл
Get-Command -Noun ItemProperty - смотрим что такое ItemProperty и какие команды доступны
Get-Help Get-ItemProperty - узнаем подробнее про команду Get-ItemProperty, команда позволяет посмотреть свойства объекта
Get-ItemProperty .\myfile.txt - посмотреть свойства объекта myfile.txt
Get-ChildItem Power: - посмотреть содержимое объекта Power: (где-то выше монтировали куст реестра)
New-Item Power:\Test1 -ItemType "Folder" - создадим папку Power:\Test1
New-item Power:\Test1\Test2 -ItemType "Folder" - создадим папку Power:\Test1\Test2
dir Power: - посмотреть содержимое объекта Power:
Get-Help New-Item -Online - посмотрим онлайн справку по New-Item
dir "c:\" | Get-Member - смотрим структуру объектов в c:\
dir "Power:\" | Get-Member - смотрим структуру объектов в Power:\
Get-Help New-PSDrive -Examples
New-PSDrive -Name "P" -Root \\www\img\c -PSProvider "FileSystem" - примонтировать сетевой диск \\www\img\c использовать букву "P" для точки монтирования
Get-PSDrive - посмотреть что мы там примонтировали
Remove-PSDrive "P"
New-PSDrive -Name "zabir" -Root \\www\img\c -PSProvider "FileSystem" - небольшой прикол :)
Get-PSDrive - посмотреть что мы там примонтировали
dir zabir:\
Remove-PSDrive "zabir"
Простые операции в конвейере
Get-Command -Noun Object - посмотреть доступные команды для работы с объектами
Select-Object
-Property
-Descending
Sort-Object
-Property
@{n="...", e={...}}
-First
-Last
-Skip
Where-Object
-EQ, -NE, -GT, -Like...
-FilterScript {...}
Group-Object
-Property
Measure-Object
ForEach-Object
-MemberName
Compare-Object
-Property - этот параметр применяется по умолчанию.
dir C:\Windows - посмотрим содержимое каталога windows
dir C:\Windows | Get-Member - посмотрим доступные свойства, методы и т.д.
dir C:\Windows\ | Sort-Object Length - сортируем объекты (по умолчанию сортировка по возрастанию)
dir C:\Windows\ | Sort-Object Length -Descending - сортируем объекты по убыванию
New-Item zxc1.txt -ItemType File - создадим файл zxc1.txt в текущем каталоге
New-Item zxc2.txt -ItemType File - создадим файл zxc2.txt в текущем каталоге
New-Item zxc10.txt -ItemType File - создадим файл zxc10.txt в текущем каталоге
dir . | Sort-Object Length - попробуем отсортировать файлы по размеру
dir . | Sort-Object -Property Length, Name - сортируем объекты по размеру и имени
dir C:\Windows | Get-Member -MemberType Properties - посмотреть какие есть параметры для дальнейшей обработки
Select-Object - команда Select-Object позволяет делать выборку объектов, сверху, снизу, показывать нужное
dir C:\Windows | Select-Object -Property FullName, Extension
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 | Select-Object Handles, Name, VM, CPU
$PSItem - текущий элемент списка
@{n="Size in KB"; e={$PSItem.Length}} - создание своего свойства
@{n="Size in KB"; e={$_.Length / 1024}} - выполняем действие со свойством $_.Length / 1024
dir C:\Windows | Select-Object -Property FullName, Length, @{n="Size in KB"; e={$PSItem.Length}} - пример использования своего свойства
dir C:\Windows | Select-Object -Property FullName, Length, @{n="Size in KB"; e={$_.Length}} - пример использования своего свойства
dir C:\Windows | Select-Object -Property FullName, Length, @{n="Size in KB"; e={$_.Length / 1024}} | Sort-Object -Property "Size in KB" -Descending - пример использования своего свойства
dir C:\Windows | Select-Object -Property FullName, Length, @{n="Size in KB"; e={$_.Length / 1024}} | Sort-Object -Property "Size in KB" -Descending | Select-Object -First 10
Get-Help Where-Object -Examples - получили справку по команде Where-Object
dir c:\windows | Where-Object Length -GT 100000 - показать файлы больше 100000
dir C:\Windows | Where-Object Extension -EQ ".EXE" - показать файлы с расширением EXE
dir C:\Windows | Where-Object Extension -CEQ ".exe" - показать файлы с расширением exe, CEQ говорит о том что ищем exe с соблюдением регистра
Get-Process | Where-Object Name -EQ "Chrome" - показать все процессы с именем Chrome
dir C:\Windows | Where-Object Name -Like "e*" - показать файл который начинается на букву "e" в каталоге C:\Windows
dir C:\Windows | Where-Object Name -Like "*e" - показать файл который заканчиваются на букву "e" в каталоге C:\Windows
dir C:\Windows | Where-Object -FilterScript {$_.Extension -Like ".exe" -and $_.Name -like "h*" -and $_.Length -ge 100000 } - показать файл ".exe", имя начинается на "h", размером больше 100000
dir C:\Windows | Where {$_.Extension -Like ".exe" -and $_.Name -like "h*" -and $_.Length -ge 100000 } - показать файл ".exe", имя начинается на "h", размером больше 100000
Get-Process | sort CPU -Descending | select Name, CPU, VM , Path | Where-Object Name -Like "chrome" - показать отсортированные процессы с именем "chrome"
dir C:\Windows | Where-Object Extension -Like ".exe" | Measure-Object -Property Length -Sum - показать какой размер у объектов exe
dir C:\Windows | Where-Object Extension -Like ".exe" | Measure-Object -Property Length -Sum -Maximum -Minimum -Average - показать какой размер у объектов exe, минимальные и максимальные размеры объектов
Get-Process | sort CPU -Descending | select Name, CPU, VM , Path | Where-Object Name -Like "chrome" | Measure-Object -Property CPU -SUM - посчитать какое потребление CPU у процессов с именем "chrome"
Get-Process | sort CPU -Descending | select Name, CPU, VM , Path | Where-Object Name -Like "chrome" | Measure-Object -Property VM -SUM - посчитать какое потребление VM у процессов с именем "chrome"
dir C:\Windows | Group-Object -Property Extension - сгруппировать и показать количество объектов по их расширению, в каталоге C:\Windows
dir C:\Windows -Recurse | Group-Object -Property Extension - сгруппировать и показать количество объектов по их расширению, включая вложенные папки
Get-Service | group status - сгруппировать и показать статус служб
Get-Process -IncludeUserName | Sort-Object cpu -Descending | select Name, cpu, vm, username - показать процессы, отсортировать по CPU, выполнить выборку по: Name, cpu, vm, username
Get-Process -IncludeUserName | Sort-Object cpu -Descending | select Name, cpu, vm, username | Group-Object username - показать процессы, отсортировать по CPU, выполнить выборку по "Name, cpu, vm, username", сгруппировать и показать процессы по пользователям.
dir C:\Windows\ | Where-Object Length -ge 100 | Group-Object Extension | Where-Object Count -Ge 3 - по итогу покажет группы в которых файлов больше 3
dir C:\Windows | Where-Object Extension -EQ ".log" | Get-Member -MemberType Method - показать какие методы мы можем применить к объектам
New-Item test111 -ItemType Directory - создаем директорию test111 в текущем каталоге
New-Item .\test111\zxc.txt -ItemType File - создаем файл zxc.txt в каталоге test111
New-Item .\test111\zxc1.txt -ItemType File - создаем файл zxc1.txt в каталоге test111
New-Item .\test111\zxc2.txt -ItemType File - создаем файл zxc2.txt в каталоге test111
dir .\test111 | Where-Object Extension -eq ".txt" | Get-Member - показать какие методы мы можем применить к объектам
dir .\test111\zxc.txt | Get-Member - показать какие методы мы можем применить к объектам
dir .\test111\zxc.txt | ForEach-Object -MemberName Delete - удалит файл
dir .\test111 | Where-Object Extension -EQ ".txt" | ForEach-Object -MemberName Delete - из каталога test111 будут удалены все файл c расширением ".txt"
dir .\test111 | Where-Object Extension -EQ ".txt" | ForEach-Object Delete - из каталога test111 будут удалены все файл c расширением ".txt"
dir C:\Windows | Where-Object Extension -EQ ".txt" | ForEach-Object {$_.Delete()} - из каталога C:\Windows будут удалены все файл c расширением ".txt" (для вложенных каталогов нужно использовать параметр -Recurse)
Remove-Item .\test111 - удалить каталог test111
Форматирование результатов
Get-Command -Verb Format
dir c:\windows | Format-Table
dir c:\windows | Get-Member
dir c:\windows | Format-Table -Property Name, Extension, Length
Get-Service | Get-Member
Get-Service | FT Name, Status, CanStop, Canshutdown
Get-Service | FT Name, Status, CanStop, CanShutdown -AutoSize
Get-Service | sort Status | FT Name, Status, CanStop, CanShutdown -AutoSize -GroupBy Status
Get-Process | Sort-Object CPU -Descending |FT ProcessName, CPU -AutoSize
Get-Process | Sort-Object CPU -Descending | FT CPU, @{n="Name"; e={$_.ProcessName}; align="right"}
Get-Service | FT Status, @{n="Name"; e={$_.Name}; align="right"}
Get-Service | Format-List -Property Name, Status
Get-Service | sort Status| Format-Wide -Property Name -column 5 -GroupBy Status
Начало и конец конвейера в powershell
Get-Command -Verb Export
Get-Command -Verb Export -Module Microsoft.PowerShell.Utility
Get-Command -Verb ConvertTo
Get-Command -Verb Out
!!! Разница между Export и ConverTo следующая:
!!! Export завершает конвейер
!!! ConvertTo конвейер не завершает и может передать дальше
Get-Service | Out-GridView
Get-Process | Out-GridView
Get-Service | ConvertTo-Html | Out-File "xxx.html" - получаем список служб, конвертируем в html и сохраняем в файл xxx.html
Get-Service | ConvertTo-Html -Title "Список служб" -PreContent "Мои службы" | Out-File "xxx.html" - получаем список служб, конвертируем в html и сохраняем в файл xxx.html, украшаем html заголовком и т.д.
Get-Service | ConvertTo-Json | Out-File "xxx1.Json" - получаем список служб, конвертируем в Json и сохраняем в файл xxx1.Json
Get-Service | Export-Csv "zxc2.csv" - получаем список служб и экспортируем в файл zxc2.csv
Get-Content "xxx1.json" | ConvertFrom-Json - читаем файл и передаем его в конвейер
Get-Command -Verb Import - получаем документацию по Import
Передача параметров в powershell
Классический способ
Get-Process -Name *a* - выполняем команду "Get-Process" с параметром "-Name" и значением "*a*"
Get-Process | Sort-Object -Property Name - передаем список процессов в "Sort-Object" с параметром "-Property" и значением "Name"
() - вход конвейера
dir C:\Windows\ | Sort-Object -Property Length -Descending
Sort-Object -Property Length -Descending -InputObject (dir c:\windows)
Get-Service | Format-Wide
Format-Wide -InputObject (Get-Service)
Get-Help Get-Service -Full
Get-Service -Name *win*
"*win*" | Get-Service
-ComputerName - в powershell всегда указывает на удаленный ПК (для работы должен быть включен winrm, у пользователя должны быть права Администратора на удаленном ПК)
Get-Service -ComputerName pdc | Measure-Object
Get-Service -ComputerName ts | Measure-Object
Get-Service -ComputerName pdc,ts | Sort-Object MachineName | FT -GroupBy MachineName
Get-Service -ComputerName pdc,ts | Sort-Object MachineName | FT -GroupBy MachineName MachineName,Name,Status
Get-Service
-Name (ByValue, ByPropertyName) - ByValue - string
-ComputerName (ByPropertyName)
-InputObject (ByValue) - ByValue - service-controller
"что то в кавычках" - для powershell это строка
Переменные
Объявление переменной
Инициализация переменной
Использование переменной
Get-Command -Noun Variable - смотрим справка по переменным
Clear-Variable
Get-Variable
New-Variable
Remove-Variable
Set-Variable
New-Variable - объявление переменной
Set-Variable - инициализация переменной / задать значение
Get-Variable - использование значение переменной
Get-Variable - без параметров покажет все доступные переменные
Get-Variable -Name PSVersionTable - покажет значение переменной PSVersionTable
Переменные могут быть разных типов, содержать разные данные, числа, строки
Get-Variable -Name PSVersionTable | Get-Member - посмотреть что можно сделать с переменной PSVersionTable
Get-Help New-Variable - показать по команде New-Variable
New-Variable -Name Test - создать переменную Test
New-Variable -Name Test1 - создать переменную Test1
Get-Variable - показать все переменные, и убедимся что переменная Test и Test1 создались
Get-Variable -Name Test - проверим что переменная Test создалась
Get-Variable -Name Test1 - проверим что переменная Test1 создалась
New-Variable -Name Test2 -Value 2015 - создадим переменную Test2 и зададим для нее значение 2015 (число)
Get-Variable - показать все переменные
New-Variable -Name Test3 -Value "Superpuper" - создадим переменную Test3 и зададим для нее значение Superpuper (строка)
Get-PSDrive - показать точки монтирования
dir Env: - показать системные переменные
dir Variable: - показать переменны пользователя
dir Variable:\Test3 - показать значение переменной Test3
!!! Короткое обращение к переменным осуществляется с помощью символа доллар "$"
$Test3
$Test2
$Test1
$Test
$PSVersionTable
$PSVersionTable | Get-Member - мы увидим что тип данных тут Hashtable (TypeName: System.Collections.Hashtable - сложный)
$Test2 | Get-Member - мы увидим что тип данных тут Int32 (TypeName: System.Int32 - числовой)
$Test3 | Get-Member - мы увидим что тип данных тут String (TypeName: System.String - строка)
!!! Для использования метода в конце метода обязательно должны быть скобки"()" Пример: $переменная.GetType()
!!! Для использования свойства скобок нет. Пример: $переменная.Length
$Test2.GetType() - посмотреть тип используя метод (Int32)
$Test3.GetType() - посмотреть тип используя метод (String)
$Test3.Length - посмотреть свойство Length переменной $Test3, получим количество символов в строке
$Test3.Substring(2, 7) - применить метод Substring(), обрезать значение переменной первые два символа и начиная с 7 символа получим
$Test3.Substring(0, 7) - применить метод Substring(), обрезать значение переменной начиная с 7 символа
$Test3.Substring(3) - применить метод Substring(), обрезать значение переменной первые три символа
$Test4 = 100 - простое объявление переменной, задали значение равное 100
$Test4.GetType() - посмотреть тип используя метод, Int32
$Test4 = 100.25 - простое объявление переменной, задали значение равное 100.25
$Test4.GetType() - посмотреть тип используя метод, стало Double
$Test4 = "xxx xxx xxx xxxx xxx" - простое объявление переменной, задали значение равное строке "xxx xxx xxx xxxx xxx"
$Test4.GetType() - посмотреть тип используя метод, стало String
Get-PSDrive - показать точки монтирования
dir Variable:\Test? - показать значение переменной Test? Test1,Test2, Test3...
[int]$Test5 = 100 - объявление переменной, тип данных int, значение 100
$Test5 - посмотрели значение переменной, равно 100
$Test5.GetType() - посмотреть тип используя метод, тип данных int
$Test5 = 100.25 - команда выполнится, но запишется значение равное 100, так как ранее тип данных был объявлен ([int]$Test5)
$Test5.GetType() - убедимся что тип данных не изменился
$Test5 = "eewewew-123" - команда не выполнится и вернет ошибку, так как ранее тип данных был объявлен ([int]$Test5)
$Test5 = "11213" - попробуем задать вот такую строку состоящею из цифр, powershell увидел что в строке цифры и добавил значение переменной
$Test5.GetType() - убедимся что тип данных не изменился
Использование переменных
[int]$Test6 = 3 - объявили переменную $Test6, тип данных int, значение переменной равно 3
$Test6 = убедились что значение переменной Test6 равно 3
dir C:\Windows | Select-Object -First 3 - посмотрим в каталоге первые три файла
dir C:\Windows | Select-Object -First $Test6 - посмотрим в каталоге первые файлы используя переменную $Test6
$Test6 = 15 - переназначили значение переменной Test6
dir C:\Windows | Select-Object -First $Test6 - посмотрим в каталоге первые файлы используя переменную $Test6
Пример скрипта поиска большого файла по размеру и подсчета количества символов в нем
[string]$test8 = dir C:\Windows | Where-Object -FilterScript {$_.Extension -Like ".exe" -and $_.Name -like "h*" -and $_.Length -ge 100000 } | select -Property Name
$Test9 = $test8.Substring(7)
$Test10 = $test9.TrimEnd(".exe}")
$Test10.Length
Пример в одну строку
dir C:\Windows | Where-Object -FilterScript {$_.Extension -Like ".exe" -and $_.Name -like "h*" -and $_.Length -ge 100000 } | select -Property Name | foreach {($_.Name.TrimEnd(".exe")).Length}
Массивы \ Словари
$Test7 = 10, 20, 30, 40, 50 - создать массив
dir Variable:\test? - посмотреть значение массива
$Test7[0] - показать первое значение массива
$Test7[2] - показать третье значение массива
$Test7[$Test7.Count -1] - показать последнее значение массива
$Test7[-1] - показать последнее значение массива
$Test7.Count - показать количество значений в массиве
$Test7[2].GetType()
$Test7.GetType()
$srvlist = Get-Service - создать массив вывода команды Get-Servivce
$srvlist - показать все значение массива
$srvlist[0] - показать первое значение массива
$srvlist[4] - показать пятое значение массива
$srvlist[10] - показать десятое значение массива
$srvlist[10].Status - посмотреть свойства Status значение [10] массива
$srvlist[10].Status.ToString().Length - посмотреть свойство Status,применить метод ToString() - превратить вывод в строку, посмотреть свойство - количество символов
$srvlist[10].Name.ToString().Length - посмотреть свойство Name, применить метод ToString() - превратить вывод в строку, посмотреть свойство - количество символов
$ldw = dir C:\Windows - создать массив команды dir C:\Windows
$ldw - посмотреть содержимое массива
$ldw[7].BaseName.ToString()
$ldw[7].BaseName.ToString().Length
$MyFolder = "C:"
$MyFiles = Dir $MyFolder
$MyFiles.Count
Программные конструкции \ Программирование Powershell
Программирование:
1. Переменные
+ массивы
2. Циклы
while
do ... while
do ... until
for
4. Переборы
ForEach
5. Условие
if
if ... else
if ... ifelse ... else
Пример цикла while
[int]$Index = 8
while ($Index -GT 0) # Условие продолжения цикла
{
$Index; # Полезная нагрузка в цикле
$Index = $Index -1;
}
Пример цикла do while
[int]$Index = 8
Do
{
$Index; # Полезная нагрузка в цикле
$Index = $Index -1;
}
while ($Index -GT 0) # Условие продолжения цикла
Пример цикла do Until
[int]$Index = 8
Do
{
$Index; # Полезная нагрузка в цикле
$Index = $Index -1;
}
Until ($Index -GT 0) # Условие окончания цикла
Пример цикла For
cls
For (
[int]$Index = 8; # Выполняется один раз при входе в цикл
$Index -GT 0; # Условие продолжения цикла
$Index = $Index -1 # Выполняется после каждого повторения
)
{
$Index # Полезная нагрузка
}
Пример цикла For
cls
[int]$Index = 8
For (
[int]$ForIndex = $Index; # Выполняется один раз при входе в цикл
$ForIndex -GT 0; # Условие продолжения цикла
$ForIndex = $ForIndex -1 # Выполняется после каждого повторения
)
{
$ForIndex # Полезная нагрузка
}
Цикл For, пример бреда, введение в переборы
cls
$srvl = Get-Service
for (
[int]$i = 0;
$i -LT $srvl.Count;
$i = $i + 1
)
{
$srvl[$i].Name
}
Перебор ForEach
cls
$srv = Get-Service
ForEach ($s in $srv)
{
$s.Name
}
Цикл IF
cls
[int]$Test9 =5
$Test9
if ($Test9 -GT 3)
{
Write-Host "Больше трех"
}
Цикл IF ELSE
cls
[int]$Test9 =2
$Test9
if ($Test9 -GT 3)
{
Write-Host "Больше трех"
}
else
{
Write-Host "Не больше трех"
}
Цикл IF ELSEIF ELSE
cls
[int]$Test9 = Get-Random -Maximum 5 -Minimum -5
$Test9
if ($Test9 -GT 4)
{
Write-Host "число больше 4"
}
elseif ($Test9 -GT 3)
{
Write-Host "число больше 3"
}
elseif ($Test9 -GT 0)
{
Write-Host "больше 0"
}
else
{
Write-Host "число отрицательное"
}
Пример цикла
cls
#Показать название каталога в корневой папке диска c:, в котором больше всего вложенных каталогов.
$Rootc = dir "c:\" -directory # Это массив папок верхнего уровня. Будем их перебирать
$MaxCount = 0 #Тут будем запоминать максимальное найденное число
$FName = "" # Тут будем запоминать название папки с максимальным числом подкаталогов
foreach ($F in $Rootc) # Перебираем все каталоги верхнего уровня
{
$SubF = Dir -Directory $F.FullName # Получаем список вложенных папок
if ($SubF.count -gt $MaxCount) # Сравниваем число подпапок в текущем каталоге с папкой-лидером
{ # Если найден новый лидер, запоминаем его
$MaxCount = $SubF.count; # Число подкаталогов у нового лидера
$MaxName = $F.FullName # Имя лидера
}
}
$MaxName # После перебора всех папок показываем лидера
Сценарии \ запуск сценариев \ настройка политики запуска
*.PS1 - расширение скриптов powershell
Get-Command -Noun ExecutionPolicy - смотри на доступные команды управления безопасностью выполнения powershell скриптов
Get-ExecutionPolicy - показать политику запуска powershell скриптов
Возможны следующие значения: "Unrestricted, RemoteSigned, AllSigned, Restricted, Default, Bypass, Undefined".
Restricted - включена по умолчанию, запуск сценариев запрещен
Unrestricted - разрешен запуск всех сценариев
Get-ExecutionPolicy -List - показать все доступные политики
Set-ExecutionPolicy - изменить настройки политики
Set-ExecutionPolicy Unrestricted - разрешить запуск всех сценариев
Set-ExecutionPolicy Restricted - запретить запуск всех сценариев
Пример сценария
$RootFolderDir = "c:\" # В этой папке будем искать
cls
#Показать название каталога в корневой папке диска c:, в котором больше всего вложенных каталогов.
$Rootc = dir $RootFolderDir -directory # Это массив папок верхнего уровня. Будем их перебирать
$MaxCount = 0 #Тут будем запоминать максимальное найденное число
$FName = "" # Тут будем запоминать название папки с максимальным числом подкаталогов
foreach ($F in $Rootc) # Перебираем все каталоги верхнего уровня
{
$SubF = Dir -Directory $F.FullName # Получаем список вложенных папок
if ($SubF.count -gt $MaxCount) # Сравниваем число подпапок в текущем каталоге с папкой-лидером
{ # Если найден новый лидер, запоминаем его
$MaxCount = $SubF.count; # Число подкаталогов у нового лидера
$MaxName = $F.FullName # Имя лидера
}
}
$MaxName # После перебора всех папок показываем лидера
Сценарии \ параметры сценариев
Параметры в сценарии задаются функцией param()
Используются параметры вот так:
.\myscript.ps1 "c:\"
.\myscript.ps1 -RootFolderDir "c:\"
.\myscript.ps1 -RootFolderDir "c:\Program*"
.\myscript.ps1 -RootFolderDir "c:\" -Ext "exe"
.\myscript.ps1 -RootFolderDir "c:\Windows" -Ext "exe"
.\myscript.ps1 -RootFolderDir "c:\Windows" -Ext "log"
.\myscript.ps1 -RootFolderDir "c:\Windows" -Ext "dll"
.\myscript.ps1 -RootFolderDir "c:\Windows" -Ext "txt"
Пример сценария с простыми параметрами параметрами:
param(
[string]$RootFolderDir,
[string]$Ext
)
#$RootFolderDir = "c:\" # В этой папке будем искать # перенесли в параметр
#Показать название каталога папке $RootFolderDir, в котором больше всего файлов с расширение $Ext
$Rootc = dir $RootFolderDir -directory # Это массив папок верхнего уровня. Будем их перебирать
$MaxCount = 0 #Тут будем запоминать максимальное найденное число
$FName = "" # Тут будем запоминать название папки с максимальным числом подкаталогов
foreach ($F in $Rootc) # Перебираем все каталоги верхнего уровня
{
$SubF = Dir -Directory ($F.FullName + "\*." + $Ext) # Получаем список вложенных файлов
if ($SubF.count -gt $MaxCount) # Сравниваем число подпапок в текущем каталоге с папкой-лидером
{ # Если найден новый лидер, запоминаем его
$MaxCount = $SubF.count; # Число подкаталогов у нового лидера
$MaxName = $F.FullName # Имя лидера
}
}
$MaxName # После перебора всех папок показываем лидера
Пример сценария со сложными параметрами:
[CmdletBinding()] # Включение режима сложных параметров
param(
[Parameter(Mandatory=$true)] # действует для одного следующего параметра #Mandatory - обязательный параметр или нет
[string]$RootFolderDir,
[string]$Ext = "*" # задали значение по умолчанию # значения по умолчанию можно задать и в простом сценарии
)
Write-Host ("Каталог: " + $RootFolderDir)
Write-Host ("Расширение: " + $Ext)
#Показать название каталога папке $RootFolderDir, в котором больше всего файлов с расширение $Ext
$Rootc = dir $RootFolderDir -directory # Это массив папок верхнего уровня. Будем их перебирать
$MaxCount = 0 #Тут будем запоминать максимальное найденное число
$FName = "" # Тут будем запоминать название папки с максимальным числом подкаталогов
foreach ($F in $Rootc) # Перебираем все каталоги верхнего уровня
{
$SubF = Dir -Directory ($F.FullName + "\*." + $Ext) # Получаем список вложенных файлов
if ($SubF.count -gt $MaxCount) # Сравниваем число подпапок в текущем каталоге с папкой-лидером
{ # Если найден новый лидер, запоминаем его
$MaxCount = $SubF.count; # Число подкаталогов у нового лидера
$MaxName = $F.FullName # Имя лидера
}
}
Write-host ("Результат: " + $MaxName) # После перебора всех папок показываем лидера
Пример сценария с параметрами
#Сценарий с параметрами, показывающий список процессов
#1. Строка - фильтр для процессов
#2. Число - фильтр для процессов
#3. Строка - управляет сортировкой
#4. Строка - управляет форматирование результата
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$ProcessNamez,
[Parameter(Mandatory=$true)]
[int]$ColProcess,
[Parameter(Mandatory=$true)]
[string]$SortProcess ,
[Parameter(Mandatory=$true)]
$FormatT
)
if ($ProcessName -EQ 0)
{
$ProcessNamez = "svc*"
}
elseif ($ProcessNamez -EQ 1)
{
$ProcessNamez = "chr*"
}
else
{
$ProcessNamez = "idle*"
}
if ( $SortProcess -EQ 0)
{
$SortProcess = "CPU*"
}
elseif ($ProcessName -EQ 1)
{
$SortProcess = "WS*"
}
else
{
$SortProcess = "ID"
}
if ( $FormatT -EQ 0)
{
$FormatT = "ID"
}
else
{
$FormatT = "ProcessName"
}
Get-Process -Name $ProcessNamez | Select-Object -First $ColProcess | Sort-Object $SortProcess | Format-Table $FormatT
Write-Host "$ProcessNamez"
Write-Host "$ColProcess"
Write-Host "$SortProcess"
Write-host "$FormatT"
Сценарий, используем перебор ForEach, для создания объектов
param (
[string]$FRoot = ".", #Где создаем папки
[string]$FNEw = "zxc" #Имя папки
)
# Для заданной папки создать в каждой из ее подпапок вложенную папку с названием "zxc"
$Dir = Dir $FRoot -Directory
ForEach($F in $Dir)
{
New-Item -name $FNEw -ItemType Directory -Path $F.FullName
}
Конвейер, используем перебор ForEach с методом CreateSubdirectory, для создания объектов
param (
[string]$FRoot = ".", #Где создаем папки
[string]$FNEw = "zxc" #Имя папки
)
# Для заданной папки создать в каждой из ее подпапок вложенную папку с названием "zxc"
Dir $FRoot -Directory | ForEach-Object CreateSubdirectory $FNEw
Обработка ошибок в powershell
Обработка ошибок:
on error resume next
v-------------------
if (... <> 0)
v-------------------
if (...)
v-------------------
if (...)
v-------------------
Обработка исключений:
Try {
Код
}
Catch {
#обработака ошибок
}
Обработка ошибок, пример сценария с обработкой ошибок:
[int]$A = 0
Try {
$A + 1
$A * 2
10 /$A
$A - 1
Write-Host "Ошибок не было"
}
Catch {
Write-Host "Случилась ошибка!"
}
Обработка ошибок, Write сообщения
Get-Command -Verb write - подробная информация по глаголу write
Write-FileSystemCache
Write-DtcTransactionsTraceSession
Write-PrinterNfcTag
Write-VolumeCache
Write-Debug
Write-DfsrHealthReport
Write-DfsrPropagationReport
Write-Error
Write-EventLog
Write-Host
Write-Information
Write-Output
Write-Progress
Write-Verbose
Write-Warning
Обработка ошибок, пример использования Write-Verbose, Write-Debug
#s3.ps1 -A 1 -B 2 -Verbose
#s3.ps1 -A 1 -B 2 -Verbose -Debug
#.\s3.ps1 -A 2 -B 3 -Verbose
#.\s3.ps1 -A 2 -B 3 -C -Verbose
[CmdletBinding()] # Оснащает сценарий дополнительными функциями как Verbose и Debug
Param (
[int]$A,
[int]$B,
[switch]$C # Параметр в виде ключей, ключ без значения
)
cls
#Write-Host ("Параметр A=" + $A)
#Write-Host ("Параметр B=" + $B)
Write-Verbose ("Параметр A=" + $A)
$A | Get-Member | Write-Debug
Write-Verbose ("Параметр B=" + $B)
$B | Get-Member | Write-Debug
Write-Verbose ("Параметр C=" + $C)
#$C | Get-Member | Write-Debug
Обработка ошибок, пример использования «Switch» в сценарии
# pingovator
[CmdletBinding()]
Param (
[switch]$A,
[switch]$B,
[switch]$C
)
$ip_list = @('192.168.15.1', '192.168.15.10', '192.168.15.254')
#$ip_list = "192.168.15.1", "192.168.15.10", "192.168.15.254"
Try {
if ([switch]$A) { # Выполняется если A = True
Write-Host ($ip_list[0])
#ping ($ip_list[0])
Test-Connection ($ip_list[0])
Write-Host "Ошибок не было!"
}
elseif ([switch]$B) { # Выполняется если B = True
Write-Host ($ip_list[1])
Test-Connection ($ip_list[1])
Write-Host "Ошибок не было!"
}
elseif ([switch]$C) { # Выполняется если C = True
Write-Host ($ip_list[2])
Test-Connection ($ip_list[2])
Write-Host "Ошибок не было!"
}
else {
Write-Host "Параметры не указаны"
Write-Host ("Параметр A = " + $A)
Write-Host ("Параметр B = " + $B)
Write-Host ("Параметр C = " + $C)
}
#EndTry
}
Catch {
Write-Host "О Ужас у нас ошибки"
}
Обработка ошибок, встроенная переменная $Error
#cls
[int]$A = 0
Try {
$A + 1
$A * 2
10 / $A
$A - 1
Write-Host "Ошибок не было"
}
Catch {
# Write-Host "Случилась ошибка!"
# Write-Error "Случилась ошибка!"
Write-Warning "Случилась ошибка!"
#$Error | GM
#$Error.ErrorDetails
#$Error.CategoryInfo
}
Удаленное управление \ удаленное исполнение команд
Подготовка компьютера к удаленному управлению.
winrm QuickConfig - подготовка компьютера к удаленному управлению.
Enable-PSRemoting -Force - подготовка компьютера к удаленному управлению.
0. запустится служба WinRM (если запущена перезапустится)
1. служба WinRM перейдет в состояние — автоматический запуск при старте
2. будет создано правило в firewall для WinRM для HTTP трафика на порту 5985 для всех локальных IP адресов
Удаленное управление варианты
1. -ComputerName - специальный параметр для исполнения команд на удаленном ПК
2. PSsession - удаленное управление на основе PSSesion, подходит для подключения к одному пк
3. Invoke-Command - специальная команда для выполнения команд на большом кол-ве компьютеров
winrs –r:computer01 cmd - удаленное управление computer01 с помощью WinRS / оболочка cmd
winrs -r:win10-test1 powershell - удаленное управление win10-test1 с помощью WinRS / оболочка powershell
Как пользоваться -ComputerName:
Get-Service -ComputerName win10-test1 - используя параметр -ComputerName получаем информацию о сервисах с компьютера win10-test1
Использование PSSession
Enter-PSSession win10-test1 - подключаемся к удаленному ПК
Exit-PSSession - завершить удаленную сессию
Get-Command -Noun PSSession - список всех возможных команд с использованием PSSession
Использование Invoke-Command
Invoke-Command pdc1, win10-test1, win10-test2 -ScriptBlock {Get-Service; Get-Process}
Invoke-Command win10-test1 -ScriptBlock {Get-Process}
Invoke-Command win10-test1,ts,pdc -ScriptBlock {dir c:\}
Invoke-Command win10-test1,ts,pdc -ScriptBlock {dir c:\ |Measure-Object}
Фоновое исполнение команд
Get-Command -Noun Job - получаем информацию по командам Job
Get-Job - получить список заданий
Receive-Job - это команда поможет узнать результат выполнения задания
Remove-Job - удалить задание
Resume-Job - возобновить выполнение задания
Start-Job - запуск задания
Stop-Job - остановка задания
Suspend-Job - поставить задание на паузу
Wait-Job - притормозить задание
Start-Job {dir c:\ -Recurse | Measure-Object}
Start-Job -ScriptBlock {dir c:\ -Recurse | Measure-Object}
Start-Job {Get-Service}
Get-Job - показать все задания, заодно ид заданий
Receive-Job 1 - посмотреть результат выполнения задания c id 1
Receive-Job 3 - посмотреть результат выполнения задания c id 3
Пример использования задания:
Start-Job {Get-Service} - создали задание
Get-Job - получить список заданий
$srv = Receive-Job -id 5 - сохранили результат выполнения в переменную
$srv | Select-Object -Property Status, Name | Sort-Object status - выполнили полезную работу с переменной
Планировщик в powershell \ назначенные задания
Get-Command -Noun *Job
Get-Command -Noun ScheduledJob
taskschd.msc
Get-Help Set-ScheduledJob
Get-Help Set-ScheduledJob -Examples
Get-Help Set-ScheduledJob -online
Модули / подготовка
0. Создадим файл script1.ps1:
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True)]
[string]$Filename
)
Get-Content -Path $Filename
2. Создадим файл zxc.txt и добавим в него контент "Hello man":
New-Item zxc.txt -Type File
Set-Content "Hello man" -Path .\zxc.txt
3. Проверим работу скрипта из пункта 0
.\script1.ps1 -Filename .\zxc.txt
Модули / создание функции
Редактируем скрипт script1.ps1
Функцию можно назвать как угодно, но лучше придерживается общепринятому в powershell синтаксису Глагол-Существительное.
В нашем случае назовём ее Get-MyInfo
Function Get-MyInfo
{
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True)]
[string]$Filename
)
Get-Content -Path $Filename
}
###### вызов функции (все еще редактируем файл script1.ps1)
Get-MyInfo -Filename .\zxc.txt
Модули / добавляем еще функций
Function Get-MyInfo {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True)]
[string]$Filename
)
Get-Content -Path $Filename
}
Function Set-MyInfo {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True)]
[string]$Filename,
[Parameter(Mandatory=$True)]
[string]$MyText
)
Set-Content $MyText -Path $Filename
#$MyText | Out-File -FilePath $Filename
}
Function Clear-MyInfo {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True)]
[string]$Filename
)
Remove-Item -Path $Filename
}
# Используем функции
Set-MyInfo -Filename .\zxc.txt -MyText "Halololo lalalala lolo" # создаем файл и записываем текст
Get-MyInfo -Filename .\zxc.txt # Читаем файл
Clear-MyInfo -Filename .\zxc.txt # Удаляем файл
Модули / Сохранение и создание своего модуля
0. Файлы модулей имеют расширение *.psm1
1. Директория модулей для пользователя по умолчанию:
C:\Users\NAME_USER\Documents\WindowsPowerShell\Modules
2. !!! У модуля должна быть своя директория.
!!! Модуль и директория имеют одинаковое имя.
Пример:
C:\Users\NAME_USER\Documents\WindowsPowerShell\Modules\NAMEMODULE_FOLDER\NAMEMODULE.psm1
C:\Users\user\Documents\WindowsPowerShell\Modules\script1\script1.psm1
3. Директория модулей для системы по умолчанию:
C:\Program Files\WindowsPowerShell\Modules
C:\Windows\system32\WindowsPowerShell\v1.0\Modules
C:\Program Files\Microsoft Message Analyzer\PowerShell\
4. Посмотреть все директории где могут быть модули:
dir Env:\PS* | FL
5. Показать все доступные модули в powershell:
Get-Module -ListAvailable
6. Посмотреть справку по модулю:
Get-Command -Module Name_Module
Get-Command -Noun Name_Function
Get-Command -Module Script*
Get-Command -Noun MyInfo
Модули и справка для функции:
Function NAME-FUNCTION {
<#
.Synopsis
что то здесь
.Description
что то тут
.Parameter Start
Описание параметра Start
.Parameter End
Описание параметра End
.Example
Пример
#>
#полезное тело функции
}
wmi \ cim
WMI - позволяет получить информацию о железе
CIM замена WMI
Get-Command -Noun WmiObject
Get-Command -Noun Wmi*
Get-Command -Noun CimInstance
Get-Command -Noun Cim*
Get-CimInstance 'Win32_Bios' | Select-Object SerialNumber - получить серийный номер ПК (работает на брендовых устройствах)
Get-WmiObject win32_computersystem | Select-Object SystemSKUNumber - получить серийный номер ПК (работает на брендовых устройствах)
Get-WmiObject Win32_Bios - показать версию Bios
Get-WmiObject Win32_BaseBoard - показать материнскую плату
Get-WmiObject Win32_IDEcontroler - показать контролер дисков
Get-WmiObject win32_PhysicalMemory - показать информацию об оперативке RAM
Get-WmiObject Win32_Processor - информация о процессоре CPU
Get-WmiObject Win32_USBController - показать информацию об USB
Get-WmiObject Win32_USBControllerDevice - показать информацию об USB
Get-WmiObject Win32_USBHub - показать информацию об USB
Get-WmiObject Win32_DiskDrive - показать информацию о дисках
Get-WmiObject Win32_Printer - показать информацию о принтерах
Get-WmiObject Win32_DesktopMonitor - показать информацию о мониторе по умолчанию
Get-WmiObject Win32_VideoController - показать информацию о видеокарте GPU
Get-WmiObject Win32_NetworkAdapter - показать информацию о сетевых картах NET
!!! При использовании Get-CimInstance отлично работает автодобавление (клавиша TAB)
Get-Help Get-CimInstance -Examples
Get-CimInstance Win32_BaseBoard - показать материнскую плату
Get-CimInstance Win32_Bios - показать версию Bios
Get-CimInstance Win32_Processor - информация о процессоре CPU
AD
Стандартные cmd программы для управления AD:
dsadd /? - добавить объект
dsget /? - посмотреть информацию о объекте
dsmod /? - изменить существующий объект
dsmove /? - переместить объект
dsquery /? - посмотреть объекты, возвращает список
dsrm /? - удалить объект
CN - объект либо встроенная папка
OU - подразделение
Пользователь "zxc" находится в OU "home" в домене "domen.inc"
Читается с права на лево:
CN=zxc,OU=home,DC=domen,DC=inc
OU home:
OU=home,DC=domen,DC=inc
Используем powershell:
Update-Help - обновляем справку
Get-Command -Module ActiveDirectory - показать доступные команды для работы с ActiveDirectory
help New-ADUser -Examples - смотрим справку по New-ADUser
Import-Module ActiveDirectory - импортируем модуль ActiveDirectory (решает проблему с powershell, доступ к точке монтирования AD)
Get-PSProvider - показать доступные провайдеры (провайдер ActiveDirectory должен быть в списке, если его нет то следует выполнить Import-Module ActiveDirectory)
Get-PSDrive - показать точки монтирования (точка монтирования "AD ... //RootDSE/" должна быть в списке, если её нет то следует выполнить Import-Module ActiveDirectory)
dir AD:
cd AD:
cd "DC=vazaraz,DC=inc" перейти в домен "vazaraz.inc"
cd "OU=vazaraz-pc" - перейти OU "vazaraz-pc"
dir -Recurse - показать все вложенные объекты
Get-ADUser "CN=vasya,OU=manager,DC=vazaraz,DC=inc" - показать информацию о пользователе vasya, в домене "azaraz.inc", каталог OU "manager"
dir -Recurse | Sort-Object -Property objectclass | Where-Object -Property ObjectClass -eq "user" - показать всех пользователей
dir -Recurse | Sort-Object -Property objectclass | Where-Object -Property ObjectClass -eq "computer" - показать все компьютеры
dir -Recurse | Sort-Object -Property objectclass | Where-Object -Property ObjectClass -eq "group" - показать все группы
Get-Item "CN=WIN10-TEST0"
Get-Item "CN=wds"
Get-Item "CN=wds" | Get-Member
dir | Select-Object name, objectGuid
New-ADOrganizationalUnit LOLOLOLO - создать OU с именем "LOLOLOLO"
