Рубрики
Powershell

Powershell backup folder

# Переменные
$work_dir="C:\Users\user\Desktop\super_folder\"
$backup_dir="D:\backup_superfolder\"
$remote_dir="\\tsclient\Documents\"
$data_time=$(Get-Date -Format yyyyMMdd_Hm_s)
$name_zip_file="super_folder"


# Архивируем каталог из $work_dir в $backup_dir
Compress-Archive -Path "${work_dir}" -DestinationPath "${backup_dir}${name_zip_file}.${data_time}.zip"


# Если каталог есть производим синхронизацию
# Использую стороннею программу FreeFileSync для синхронизации
if(test-path ${remote_dir})
{
 echo "Отлично каталог ${remote_dir} есть"
 echo "Производим синхронизацию"
 C:\Users\user\script_folder\BatchRun.ffs_batch
}

Рубрики
Powershell Конспект

Конспект: powershell

Вводное:

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"


Рубрики
Powershell

powershell \ скорость сетевого интерфейса \ Get-NetAdapter

Get-NetAdapter -Name "*" |  Select-Object -ExpandProperty LinkSpeed
Рубрики
Powershell

Powershell как работать

0) Нажатие кнопки вверх и вниз позволяет вам прокручивать историю команд,и выбирать ранее набранные команды.
1) Нажатие кнопки вправо, в конце строки, будет посимвольный выбор предыдущей команды.
2) Ctrl+Home — удаляет всё, начиная с текущей позиции курсора до начала строки
3) Ctrl+End — удаляет с курсора и до конца строки
4) F7 — показывает окно со списком набранных команд, и позволяет выбрать одну из них.
5) Для того, чтобы скопировать что-то в буфер, выделите это мышью и нажмите Enter.
6) Для того, чтобы вставить строку из буфера — просто нажмите правую кнопку мыши.
7) Клавиша TAB - Авто подстановка команд/Путей (TAB поможет меньше ошибется)
8) %windir%\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe - GUI Powershell
9) поиск ISE - GUI Powershell
10) sconfig.cmd - стандартная оболочка в которой можно поменять Время, Дату, Имя пк, и тд.
11) * - любой символ в любом кол-ве
12) $ - назначение переменной

!!!) Синтаксис команд в powershell примерно такой:
хочу-получить | действие
update-help
get-Process
set-alias

Get-Process *name* - показать-процесс с именем *name*
Get-Process *name* | Get-Member  - показать что можно сделать с процессом
Get-Process *name* | kill - показать-процесс с именем *name* и убить его

Get-Command -Noun *net* - показать все команды в которых встречается слово *net*

Get-Alias - показать все доступные алиасы

Get-Process *paint* | Stop-Process - найти все процессы paint и остановить их

man Get-NetAdapter - получить помощь по команде Get-NetAdapter

Enter-PSSession -ComputerName lon-svrl - подключится к удаленному ПК к консоли powershell (примерно как ssh  толбко тут winrm)

Рубрики
Powershell

Powershell помощь \ справка

powershell_ise.exe - специальная встроенная в windows программа для создания скриптов с описание всех команд 
Update-Help - обновить справку
Get-Help –Examples - получить справку по Get-Help
Get-Help -ShowWindow - запрашиваем полную справку Get-Help
Get-Help -Full - запрашиваем полную справку Get-Help


Get-Help что_это - получить справку по чему-то (или help что_это)
get-help New-Item -Examples - получить справку с примерами
get-help Registry - получить справку по реестру
get-help files - получить справку по файлам

Get-Help Registry | Set-Content reg.txt - получить справку по реестру и сохранить ее в файл reg.txt
Get-Help command_name - получить справку по определенной команде
Get-Help Get-* - получить справку используя маску Get-*
Get-Help about*  - для просмотра алфавитного списка, содержащих обзоры различных концепций 
Get-Help about_flow_control - справка для считывания файла об управлении потоками данных
Get-Help Get-Process –Examples - получить справку по запрашиваемой функции или командлету с примерами его использования
Get-Help Get-Process -ShowWindow - запрашиваем полную справку по команде
Get-Help Get-Process -Full - запрашиваем полную справку по команде

Get-Help Get-Process -Detailed - выводим описание команды и примеры использования
Get-Help Dir -full | more - выводить на экран информацию по мере необходимости
Get-Help Dir -full > dir-help.txt - сохранить информацию о команде в файл dir-help.txt

Get-Command - запрос списка доступных команд
Get-Command Out* - запрос списка доступных команд Out*
Get-Command Add* - запрос списка доступных команд Add*
Get-Command Get* - запрос списка доступных команд Get*
Get-Command -CommandType alias - запрос списка всех доступных алиасов
Get-Command *help* -CommandType cmdlet - запросить только список командлетов по маске *help*

help about_signing - все про подписание скриптов
Рубрики
Powershell

Powershell алиасы

Алиасы:

Можно применять большинство старых команд windows(cd dir find findstr copy ) 
и использовать команды unix (cd ls ps cp ..... )
Set-Alias - создать новый алиас
Get-Alias - покажет все доступные алиасы 
ls Alias:\ - покажет все доступные алиасы

Примеры:

Очень много команд из linux.
ls, ps, cat, и тд
Get-Alias - покажет все доступные алиасы 
Get-Help ps - получить помощь по команде ps
Рубрики
Powershell

Powershell переменные окружения

Введение:

!!! О переменных окружение не в powershell !!!
Переменные среды бывают двух типов — системные и локальные.
%SYSTEMROOT% - системная переменная. указывает в какой папке установлена Window
%userprofile% - локальные переменная. указывает где профиль пользователя
echo %SYSTEMROOT% - покажет переменную 
echo %USERPROFILE% - покажет переменную 
echo %USERNAME% - покажет переменную 
set - покажет все установленные переменные

Работа:

!!!В PowerShell переменные окружения вынесены на специальный диск Env:
cd env: - перейти на диск с переменными окружениями
dir - показать переменные окружения  (сработает после перехода на диск)
Get-ChildItem Env: - показать переменные окружения
$env:{имя переменной} - вывести значение переменной
$env:temp - вывести значение переменной %TEMP%
${env:CommonProgramFiles(x86)} - вывести значение переменной
${env:ProgramFiles(x86)} - вывести значение переменной
$env:TestVar = "This is a test environment variable." - создание собственных переменных окружения
new-item -path Env: -name TestVa -value  "This is a test environment variable."  - создание собственных переменных окружения
Remove-Item Env:TestVar - удаление переменных окружения
clear-item -path env:TestVar - удаление переменных окружения

Пример скрипта:

Скрипт демонстрирующий работу переменных окружений
$computer = $env:computername
$user = $env:username
cd $env:windir
Write-Host "$user, welcome to $computer!"
Рубрики
Powershell

Powershell управление ОС

Основные команды:

Get-Process - получить список процессов (алиас PS)

Get-PSDrive - покажет все диски системы (реестр алиасы и ...)

ps | ls - покажет откуда запущенны все процессы

ps explorer | ls - покажет откуда запущен процесс explorer

Set-Location HKLM: - перейти в реестр

cd HKLM:  - перейти в реестр

Set-Location HKLM:
Set-Location c: - перейти на диск c:
Get-Location - покажет текущие место положение

Get-Member - показать доступные методы 
Get-Commnad *name* - показать команду в катрой есть *name*

ps notepad | Get-Member - показать доступные методы для notepad (kill start WaitForExit)
(ps notepad).WaitForExit() - перед этой командой откроем notepad. выполнив ее консоль будет не доступна пока не закроем notepad/  
(ps notepad).StartTime - покажет когда был запущен notepad

shutdown /r /f /t 0 - перезагрузить пк
shutdown /s /f /t 0 - выключить пк
shutdown /r /f /m \\HOST_NAME /t 0 - перезагрузить пк с именем HOST_NAME
shutdown /s /f /m \\HOST_NAME /t 0  - выключить пк с именем HOST_NAME

Get-WMIObject -Class Win32_OperatingSystem | Get-Member - источник информации о системе 
(Get-WMIObject -Class Win32_OperatingSystem).Caption - название операционной системы
(Get-WMIObject -Class Win32_OperatingSystem).CSDVersion - установленный сервис пак
(Get-WMIObject -Class Win32_OperatingSystem).CSName - имя компьютера
(Get-WMIObject -Class Win32_OperatingSystem).OSLanguage - язык операционной системы 1033 — английский, 1049 — русский
Get-WmiObject -Class Win32_Product | Sort-Object Vendor, Name | Format-Table Vendor, Name, Version - будет таблица содержащая сведения об установленном ПО
Get-WmiObject -Class Win32_Product -ComputerName . —Filter "Name=’DeviceLock’" | Format-List -Property * -  информация об установленном ПО с именем DeviceLock
Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName "." - информация об установленных обновлениях
Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName "." | where-object {$_.hotfixid -eq "KB2570791"} - находим установлены ли обновление KB2570791
Get-WmiObject Win32_LogicalDisk -ComputerName SRV01 -Filter "DeviceID='C:'" | Select-Object Size,FreeSpace - сколько свободного места на диске C:

hostname - показать имя компьютера

netdom renamecomputer Win01 /newname:SRV01 - переименовать пк с именем win01 в srv01
netdom join SRV01 /Domain:example.org /OU:ou=ouname,dc=example,dc=org /UserD:DomainAdmin /PasswordD:password - добавить пк с именем srv01 в домен example.org

Rename-Computer –NewName SRV01 - переименовать пк с именем win01 в srv01

Add-Computer -domainname example.org -OUPath "OU=ouname=example,DC=org" - добавить пк с именем srv01 в домен example.org

net use E: \\SRV01\users /Persistent:Yes - монтирование сетевых диска ( шара )

New-PSDrive –Name E –PSProvider FileSystem –Root \\SRV01\users –Persist - монтирование сетевых диска ( шара )

diskpart - работы с дисками

fsutil - работы с дисками
fsutil fsinfo statistics C: - информация о партиции С:

Нахождение установленных обновлений:

$a = get-content servers.txt
$a | foreach { if (!(get—hotfix -id KB2570791 -computername $_)) { add-content $_ -path Missing—KB2570791.txt}}

Нахождение обновлений на множестве компьютеров:

$computers = Get-Content "hostlist.txt"
$kb = "KB2570791"
foreach ($computer in $computers) {
Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName $computer | where {$_.hotfixid -like "*$kb*" -OR $_.description -like "*$kb*" }
}

Установка программы:

(Get-WMIObject -ComputerName "host-01" -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install(\\SERVER_NAME\Deploy\Package_01\tools.msi) - установка программы tools.msi на пк host-01

Обновление \ Удаление ПО:


(Get-WmiObject -Class Win32_Product -ComputerName . —Filter  Name=‘OldTools’").Upgrade(\\SERVER_NAME\Deploy\Package_01\OldTools.msi) - обновление по
(Get-WmiObject -Class Win32_Product —Filter "Name=’Devicelock’" -ComputerName "." ).Uninstall() - удаление по
Рубрики
Powershell

Powershell службы

Get-Service - получить список всех сервисов/служб     

Get-Service -Name se* - получить список всех сервисов начинающихся с SE

Get-Service -Name win* -exclude winrm - запросить все сервисы начинающиеся с WIN но исключить названия соответствующие WINRM

Get-Service -DisplayName "Remote Registry", Server - запросить несколько сервисов

(Get-Service -Name bits).status - информация о службе BITS

Get-Service s* | sort-object status - отсортировать сервисы s* по статусу

Get-Service s* | sort-object status -descending - отсортировать сервисы s* по статусу наоборот

Get-Service -Name LanmanWorkstation —RequiredServices - отображения требуемых служб для LanmanWorkstation

Get-Service -Name LanmanWorkstation —DependentServices - отображения зависимых служб для LanmanWorkstation

Get-Service | Where-Object {$_.status -eq "stopped"} - показать службы в состоянии stopped

Get-Service | Where-Object {$_.status -eq "running"} - показать службы в состоянии running

Get-Service -ComputerName Server01 - запросить список служб с удаленного хоста Server01

Get-Service schedule -ComputerName SRV1, SRV2 | Set-Service -Status paused - поставить сервис schedule на паузу на хостах SRV1 и SRV2

Start-Service -Name spooler - запускаем сервер печати

Start-Service -Name spooler -PassThru - запускаем сервер печати с выводом информации на экран

Stop-Service -Name spooler - Остановить службу сервера печати

Stop-Service -Name spooler -Force - Выключить службу сервера печати (методом выстрела в голову :))

Stop-Service -Name spooler -Force -PassThru - Выключить службу сервера печати (методом выстрела в голову :)) и показать статус выполнения.

Suspend-Service -Name spooler - приостановить работу службы spooler

Get-Service | Where-Object {$_.CanPauseAndContinue} - список служб которые можно остановить

Restart-Service -Name spooler - перезапуск службы spooler

Get-WmiObject -Class Win32_Service | format-table Name, StartMode -autosize - вывести список сервисов и их режимом запуска

Get-WmiObject -Class Win32_Service | Where-Object {$_.StartMode -eq ‘Disabled’} - вывести только отключенные сервисы

Set-Service service_name -StartupType Manual - установить типа запуска сервиса вручную для service_name

Set-Service service_name -StartupType Automatic - установить типа запуска сервиса автоматически для service_name

Set-Service service_name -StartupType Disabled - установить типа запуска сервиса отключено для service_name

Get-Service -name Schedule -computername SRV1, SRV2 | Set-Service -Status paused - на нескольких хостах поставить сервис на паузу

Sc config winrm start= auto - включить автозапуск для сервиса winrm

Net start winrm - запустить сервис winrm

Set-Service -name winrm -status Running -StartupType Automatic - включить авто запуск сервиса winrm и запустить.
Рубрики
Powershell

Powershell файлы и папки

Основные команды для работы с файлами:

Get-PSDrive - покажет все диски системы

Set-Location c: - перейти на диск c: (или cd c:)

Get-Content - покажет содержимое объекта (Объектом может быть всё что угодно, например, файл) 

ls -filter "*.bat" | Get-Content - отобразить на экране текст, который содержится во всех файлах формата bat в папке.

Set-Content - записать/сохранить что либо

Get-Childitem c:\distr - отобразит содержимое директории 
Get-ChildItem -Force с:\distr -Recurse - отобразит содержимое директории с:\distr

ls -Recurce c:\distr - отобразит содержимое директории с:\distr  и всех ее каталогов

dir -Recurce c:\distr - отобразит содержимое директории с:\distr и всех ее каталогов

ls -Recurse C:\distr -Filter *.txt - отобразит содержимое директории с:\distr и всех ее каталогов где есть *.txt

Get-ChildItem -Path C:\Windows | Where {$_.extension -eq ".dll"} - покажет из c:\windows все файлы с *.dll

Поиск архивов:

Выполнит поиск архивов в папке D:\Backup, созданных после 1 мая 2011 года, 
размер которых  находится в диапазоне 10-100 Мб.
Опции Include и Exclude работают соответственно своим названиям т.е. 
первая включает а вторая исключает заданный фильтр из поиска.
Get-ChildItem -Path D:\Backup -Recurse -Include *.zip | Where-Object -FilterScript {($_.LastWriteTime -gt "2011-05-01") -and ($_.Length -ge 10mb) -and ($_.Length -le 100mb)}

Удаление \ Создание \ Переименование \Копирование:

Remove-Item - удалить объект (Объектом может быть всё что угодно, например, файл)
Remove-Item c:\trash -Recurse - удалить директорию и все ее содержимое

New-Item - создать новый объект (Объектом может быть всё что угодно, например, файл)
New-Item -Path ‘с:\New Folder’ -ItemType "directory" - создаем директорию
New-Item -Path ‘c:\file.tzt’ -ItemType "file" - создаем файл

Rename-Item - переименовать обьект (Объектом может быть всё что угодно, например, файл)
Rename-Item .\File.txt .\File.txt1 - переименовываем File.txt File.txt1 в текущем каталоге

Copy-Item - копировать объект (Объектом может быть всё что угодно, например, файл)
Copy-Item -Path c:\file.txt -Destination E:\file1.txt - копирование файла file.txt в file1.txt Force
Copy-Item -Path c:\file.txt -Destination E:\file1.txt -Force - копирование с перезаписью файла file.txt в file1.txt 

Пример с копированием:

Например, может быть задача поиска в лог файлах определенного выражения по 
маске ip-адреса «192.168.100.253» с последующим копированием найденного 
в папку D:\TEMP, вариантов множество, вот метод поиска:

$current = Get-Date
$Days = "-30"
$start = $current.AddDays($days)
Get-ChildItem D:\Logs —Filter *.log -Recurse | Where-Object {($_.LastWriteTime.Date -ge $Start.Date) -and ($_.LastWriteTime.Date -le $End.Date)} | Select-String "192.168.100.253" | Copy-Item -Destination D:\TEMP

Пример сценария удаления файла после 30 дней:

Можно придумать сценарий когда на файловой помойке 
требуется из определенной папки удалять все файлы и папки старше 30 дней.

$Path = "C:\temp"
$Days = "-30"
$CurrentDate = Get-Date
$OldDate = $CurrentDate.AddDays($Days)
Get-ChildItem $Path | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Item

Пример сценария удаления файла после 30 дней

Или если вам требуется удалять все что есть в папке и в подпапках т.е. удаление еще и самих папок.

$Path = "C:\temp"
$Days = "-30"
$CurrentDate = Get-Date
$OldDate = $CurrentDate.AddDays($Days)
Get-ChildItem $Path -Recurse | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Ite
Рубрики
Powershell

Powershell пользователи

Управление сеансами пользователей:

quser /SERVER:SERVER_NAME - видим табличку с теми пользователями которые зашли на сервер SERVER_NAME (смотрим ID нужной сессии)

logoff Session_ID /SERVER:SERVER_NAME - завершить сеанс пользователя Session_ID на сервере SERVER_NAME

qwinsta /server:SERVER_NAME - список пользователей и их ID  на сервере SERVER_NAME

rwinsta Session_ID /server:SERVER_NAME - завершить сеанс пользователя Session_ID на сервере SERVER_NAME

Если не работает query:

Последний инструмент две команды которые по умолчанию недоступны, но после регистрации библиотеки query.dll
regsvr32 query.dll - регистрируем библиотеку.

query session /server:SERVER_NAME - список пользователей и их ID  на сервере SERVER_NAME

reset session 4 /server:SERVER_NAME - завершить сеанс пользователя Session_ID на сервере SERVER_NAME

Рубрики
Powershell

Powershell реестр windows

введение:

HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_ MACHINE, HKEY_USERS и HKEY_CURRENT_CONFIG
Файлы находятся в папке %SystemRoot%\System32\Config, 
где %SystemRoot% — папка, куда установлена Windows.

Файл Ntuser.dat создается для каждого пользователя и хранит его настройки 
находится в %SystemDrive%\Documents and Settings\%Username% (Windows XP) 
или %SystemDrive%\Users\%Username% (для систем начиная с Vista), 
где %Username% — имя пользователя.

Реестр Windows состоит из пяти так называемых корневых разделов (root keys)

ФАЙЛ -> КУСТ
SAM	-> HKEY_LOCAL_MACHINE\SAM
SECURITY -> HKEY_LOCAL_MACHINE\SECURITY
SOFTWARE -> HKEY_LOCAL_MACHINE\SOFTWARE
SYSTEM -> HKEY_LOCAL_MACHINE\SYSTEM
SYSTEM -> HKEY_CURRENT_CONFIG
DEFAULT -> HKEY_USERS\.DEFAULT
Ntuser.dat -> HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

Содержит глобальную информацию о компьютерной системе, 
включая такие данные об аппаратных средствах и операционной системе, 
в том числе: тип шины, системная память, драйверы устройств и управляющие данные, 
используемые при запуске системы. Информация, содержащаяся в этом разделе, 
действует применительно ко веем пользователям, регистрирующимся в системе.

HKEY_CLASSES_ROOT

Содержит ассоциации между приложениями и типами файлов (по расширениям имени файла).

HKEY_CURRENT_CONFIG

Содержит конфигурационные данные для текущего аппаратного профиля. 
Аппаратные профили представляют собой наборы изменений, 
внесенных в стандартную конфигурацию сервисов и устройств, 
установленную данными разделов Software и System корневого раздела HKEY_LOCAL_MACHINE. 

В разделе HKEY_CURRENT_CONFIG отражаются только изменения. 

Кроме того, параметры этого раздела появляются также в разделе 
HKEY_LOCAL_MACHINE\System\CurentControlSet\HardwareProfites\Current

HKEY_CURRENT_USER

Содержит, профиль пользователя, на данный момент. 
зарегистрировавшегося в системе, включая переменные окружения, 
настройку рабочего стола, параметры настройки сети, 
принтеров и приложений. 

Этот раздел представляет собой ссылку на раздел HKEY USERS\username, 
где username — имя пользователя, зарегистрировавшегося в системе 
на текущий момент.

HKEY_USERS

Содержит все активно загруженные пользовательские профили, включая HKEY_CURRENT_USER, а также профиль по умолчанию. 

Раздел HKEY_USERS содержит вложенный раздел Default, а также другие разделы, 
определяемые идентификатором безопасности (Security ID) каждого пользователя.

Допустимые для создания элементы:

ItemType -> Description -> DataType
String -> A string -> REG_SZ
ExpandString -> A string with environment variables that are resolved when invoked -> REG_EXPAND_SZ
Binary -> Binary values -> REG_BINARY
DWord -> Numeric values -> REG_DWORD
MultiString -> Text of several lines -> REG_MULTI_SZ
QWord -> 64-bit numeric values -> REG_QWORD

Команды ля работы с реестром:

Get-PSDrive - список дисков
Get-PSDrive -PSProvider Registry - список дисков от провайдера Registry

Set-Location HKLM:\SOFTWARE - перейти HKLM:\SOFTWARE
cd HKLM:\SOFTWARE - перейти HKLM:\SOFTWARE

New-PSDrive -name HKCR -PSProvider registry -root HKLM:\SOFTWARE\ClassesDir HKCR: - создание нового диска HKCR ссылкой на HKEY_LOCAL_MACHINE\SOFTWARE\Classes
Remove-PSDrive HKCR - удаление созданного диска производится командой Remove-PSDrive

Get-ChildItem HKLM: -recurse -include *PowerShell* -поиск в реестре, найдет все где присутствует ключевое слово *PowerShell*

New-Item -Path HKCU:\Environment\NewKey - создаем новый элемент
New-Item —type Directory HKCU:\Environment\NewKey—1 - создаем новый элемент

md HKCU:\Environment\NewKey—2 - создаем новый элемент

Set-Location HKCU:\Environment - переходим в "папку"

Copy-Item -Path HKCU:\Environment\NewKey .\NewKey2 - создаем копию созданного ранее ключа

Rename-Item -Path HKCU:\Environment\NewKey2 -NewName RenameKey2 - переименовываем
Remove-Item -Path HKCU:\Environment\NewKey - удаляем старый

del HKCU:\Environment\NewKey - удаляем старый

New-ItemProperty -PropertyType String -Path HKCU:\Environment -name NewKey -Value "NewParam" - создаем новое значение

Set-ItemProperty -Path  .\ -name "NewParam" -Value "UpdatedParam" - меняем значение у существующего элемента
Rename-ItemProperty -Path  .\ -name "NewParam" -NewName "TestParam" -  переименовываем параметр
Remove-ItemProperty -Path .\ -name newkey - Удаляем параметр

Рубрики
Powershell

Powershell сеть \ Файрвол/Firewall

netsh advfirewall show allprofiles - смотрим настройки по умолчанию
netsh advfirewall set allprofiles state on - активируем профили
netsh advfirewall set domainprofile firewallpolicy blockinbound - для Domain действием по умолчанию установим блокировку

Get-NetFirewallProfile  - смотрим настройки по умолчанию
Set-NetFirewallProfile -All -Enabled True - активируем профили
Set-NetFirewallProfile –Name Domain –DefaultInboundAction Block - для Domain действием по умолчанию установим блокировку
Set-NetFirewallProfile -name Public -DisabledInterfaceAliases Ethernet - можем исключить Ethernet-интерфейс из профиля Public
Set-NetFirewallProfile -name Public -DisabledInterfaceAliases NotConfigured - вернуть настройки по умолчанию 

Get-NetFirewallRule - показать все действующие правила фаервола
Get-NetFirewallRule -Enabled true -Action block  - показать все правила блокировки
Get-NetFirewallRule -DisplayName “*IE*” - показать все правила касающиеся IE

New-NetFirewallRule -Program “C:\Program Files\Internet Explorer\iexplore.exe” -Action Block -Profile Domain, Private -DisplayName “Block IE” -Description “Block IE” -Direction Outbound - создаем

Set-NetFirewallRule -DisplayName “Block IE” -Protocol TCP -RemotePort 80 -RemoteAddress “10.10.10.1-10.10.10.10” -LocalAddress “192.168.1.10” - к правилу "Block IE" добавляем действия (порт и IP)

Disable-NetFirewallRule -DisplayName “Block IE” - отключаем правило "Block IE"

Show-Command Get-NetFirewallRule - показать все доступные команды для Get-NetFirewallRule

Рубрики
Powershell

Powershell сеть \ сетевой интерфейс

ipconfig - показать сетевые интерфейсы

Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE | Select MACAddress,IPAddress - покажет ip и MAC 

netsh interface ipv4 show interfaces - показать сетевые интерфейсы
netsh interface ipv4 set address name="1" source=static address=192.168.1.10 mask=255.255.255.0 gateway=192.168.1.1 - задать настройки для интерфейса IP/MASK/GW
netsh interface ipv4 add dnsserver name="Local" address=8.8.8.8 index=1 - задать настройки для интерфейса DNS

Get-NetIPInterface - показать сетевые интерфейсы

Set-NetIPAddress –InterfaceAlias Ethernet –IPv4Address 192.168.1.10 –PrefixLength 24 –DefaultGateway 192.168.1.1  - задать настройки для интерфейса IP/MASK/GW

Set-DNSClientServerAddress –InterfaceAlias Ethernet -ServerAddresses "192.168.1.10","8.8.8.8" - задать настройки для интерфейса DNS

Get-NetRoute - показать все маршруты (route)

New-NetRoute -DestinationPrefix "0.0.0.0/0" -NextHop "10.10.10.1" -InterfaceAlias Ethernet - установить маршрут

ping ya.ru - проверка хоста 

telnet ya.ru 80 - проверка соединения с ya.ru порт 80  (tcp) 

tnc - новая команда аналог ping  (Test-NetConnection)

tnc ya.ru - проверка хоста 

Test-NetConnection -ComputerName example.org -source localhost, SRV02 - проверка хоста 

(Get-ADComputer -LDAPFilter "(name=office*)").DNSHostName | Test-NetConnection -Port 3389 - проверка хоста 
Рубрики
Powershell

Powershell сеть \ управление разрешениями на общие папки

С помощью ключей -ReadAccess, -ChangeAccess, -FullAccess, -NoAccess - настраиваются права доступа к общей папке.

Get-Command —Module SmbShare - список команд модуля SmbShare

Get-Command *SmbShare* - список команд модуля SmbShare

New—SmbShare -Name Share -Path D:\Share —FullAccess "LAB\Administrators" —ReadAccess "Everyone" - создание общей папки Share

Remove—SmbShare Share - удаление общей папки

Get—SmbShareAccess -Name Share - получаем список с  разрешениями на общую папку Share
Get—SmbShareAccess -Name Share | Grant—SmbShareAccess —AccountName Everyone —AccessRight Full - группе Everyone добавим полный доступ
Get—SmbShareAccess -Name Share | Revoke—SmbShareAccess —AccountName Everyone - запретим доступ к шаре

Block—SmbShareAccess -Name share —AccountName everyone - запретим доступ к шаре

Unblock—SmbShareAccess -Name share —AccountName everyone - восстановление доступа к шаре (Можно использовать после запрета командой Block—SmbShareAccess )
Рубрики
Powershell

Powershell сеть \ wget

wget

Вот так можно замутить  что-то типа wget 
$client = New-Object System.Net.WebClient
$client.DownloadString("http://google.com")
Рубрики
Powershell

Powershell сеть / Windows Server 2012: Установка типа сетевого подключения: частная/общедоступная сеть

с помощью powershell изменить сетевой профиль:

get-NetConnectionProfile - строка InterfaceIndex даст нужную информацию о номере нужного сетевого интерфейса

Set-NetConnectionProfile -InterfaceIndex Номер_интерфейса -NetworkCategory Public - изменить сетевое расположение на «Общедоступная»
Set-NetConnectionProfile -InterfaceIndex Номер_интерфейса -NetworkCategory Private -  изменить сетевое расположение на «Частная»

Get-NetConnectionProfile | Set-NetConnectionProfile -NetworkCategory Private - ну или так 

с помощью изменения в реестре:

1. С помощью изменения в реестре: 
Запустите regedit, найдите ключ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles. 
Этот ключ будет содержать профили сетей вида {93BCDFC1-5C66-420A-A786-85AFBCE1D5E8}, 
в фигурных скобках может быть любой другой номер - найдите среди них вашу сеть по ключу ProfileName (её имя отображается Центре управления сетями) 
и измените значение ключа Category в соответствии с тем типом сети, который вам нужен: 

0 - Общественная сеть (Public Network)
1 - Частная сеть (Private Network)
2 - Доменная сеть (Domain Network)
Рубрики
Powershell

Powershell история посещений сайтов

ipconfig /displaydns | select-string "Имя записи" | Sort >> text.txt
Рубрики
Powershell

Powershell выгрузка списка пользователей из AD

http://blogs.technet.com/b/adpowershell_ru/archive/2009/02/25/active-directory-windows-powershell-quick-start-guide.aspx
http://blogs.technet.com/b/adpowershell_ru/archive/2009/11/30/3297151.aspx


Import-Module ActiveDirectory
Get-ADObject -Filter { ObjectClass -like "*" } | FT DistinguishedName,Name


Рубрики
Powershell

Powershell Завершение удаленного сеанса пользователя

qwinsta /server:имя_сервера - посмотрим все активные удаленные сеансы пользователей (id)
logoff 3 /server:имя_сервера /v - выполнить выход пользователя  id 3