Fork me on GitHub

PowerShell основы

Полезные ссылки

Безопасность и взлом:

Работа со строками

Install .Net Core in Fedora 25

​ источник: Install .Net Core in Fedora 25

НЕ РАБОТАЕТ: clang --version clang version 3.9.1 (tags/RELEASE_391/final) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /usr/bin

возможное решение проблемы: https://github.com/JetBrains/coreclr/commit/fb08a1cb2e14db90eaee3af56384a54ac540e589

  • Install dependencies
sudo dnf -y install python cmake clang llvm libicu-devel lldb-devel libunwind-devel lttng-ust-devel libuuid-devel zlib-devel libcurl-devel krb5-devel openssl-devel automake libtool
  • Get Rover
git clone https://github.com/dotnet/core
cd core
git checkout bootstrap
git rev-parse HEAD
cd tools/dotnet-bootstrap
  • Get payload SDK - Using Fedora 24 .NET Core 1.1 SDK:
curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=835025
  • Select your branches
mkdir -p fedora.25-x64-dotnet/src                
cd fedora.25-x64-dotnet/src
git clone https://github.com/dotnet/corefx
d corefx
git checkout release/1.1.0
git rev-parse HEAD
cd ..
git clone https://github.com/dotnet/coreclr
cd coreclr
git checkout release/1.1.0
git rev-parse HEAD
cd ../..
  • I let rover pick branches for libuv and core-setup: core-setup at v1.1.0 (928f77c4bc3f49d892459992fb6e1d5542cb5e86) libuv at v1.9.0 (229b3a4cc150aebd6561e6bd43076eafa7a03756)

  • Bootstrap

./dotnet.bootstrap.py -payload dotnet.tar.gz

​ ** ROVER spawned a 'dotnet' in ./fedora.25-x64-dotnet/bin/(enjoy!)

Введение в PowerShell

источник: http://get-powershell.ru/2015/vvedenie-v-powershell/

Область действия переменных

Область действия переменной в PowerShell может быть либо локальной, либо глобальной. По умолчанию переменная имеет локальную область действия и ограничена областью действия, например, доступна только в функции или только в текущем сценарии. Глобальная переменная действует во всём текущем сеансе PowerShell. Для того, чтобы обозначить глобальную переменную, достаточно написать следующую конструкцию: $Global: переменная = значение Например, $Global:var = 12

  • команда Get-ChildItem без параметров выдает содержимое текущего каталога. У некоторых командлетов в PowerShell существуют алиасы, т.е. другой вариант написания того же командлета. Алиасы делают использование PowerShell более простым и легким. Так у командлета Get-ChildItem есть алиасы dir и ls. Кроме того существуют такие алиасы как copy, cp, rm, mkdir и т.д. просмотерть весь список алиасов можно выполнив командлет Get-Alias.

  • поиск нужных команд:
    powershell Get-Command -Name фильтрпоиска

  • Нас интересуют команды относящиеся к модулю DnsServer:* Get-Command -Module DnsServer

  • получить справку о команде: Get-Help названиеКоманды

  • получить справку о команде показать только примеры:* Get-Help Add-DnsServerPrimaryZone -Examples

  • Отображение результатов: http://get-powershell.ru/2015/%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-powershell-where-object/

  • Конструкция If

Это основная конструкция Windows PowerShell для принятия решений. Полная ее форма выглядит так:

               If ($this -eq $that) {               
               # commands               
               } elseif ($those -ne $them) {               
               # commands               
               } elseif ($we -gt $they) {               
               # commands               
               } else {               
               # commands               
               }              

Ключевое слово «If» является обязательной частью конструкции. Результат вычисления следующего за ним выражения должен быть True или False. Windows PowerShell всегда интерпретирует ноль как False, а любое ненулевое значение как True. Windows PowerShell также различает встроенные переменные $True и $False, которые представляют указанные булевы значения.

  • Конструкция Do While

    powershell Do { # commands } While ($this -eq $that)

В этом варианте конструкции команды в фигурных скобках выполнятся по крайней мере один раз. Условие While вычисляется не ранее, чем первый раз выполнится блок команд. Можно перенести While — тогда команды будут выполнены, только если с самого начала условие равно True:

While (Test-Path $path) {             
# commands             
}            

Заметьте, что во втором примере не используется оператор сравнения, например -eq. Причина в том, что командлет Test-Path по определению возвращает True или False, поэтому для нормальной работы выражения эти значения не нужно ни с чем сравнивать.- Конструкция ForEach

Работа этой конструкции похожа на поведение командлета ForEach-Object. Различия только в синтаксисе. Задача ForEach — принять массив (или набор, что в Windows PowerShell равносильно массиву) и выполнить его перечисление, чтобы можно было каждый раз работать с одним объектом:

$services = Get-Service
ForEach ($service in $services) {
$service.Stop()
}
  • For можно заменить ForEach или даже командлетом ForEach-Object. Вот пример цикла, который выполняется ровно десять раз:

powershell 1..10 | ForEach-Object -process { # code here will repeat 10 times # use $_ to access the current iteration # number }

powershell function Mine { Get-Service Get-Process } Mine

Здесь определена новая функция по имени Mine. Это, в сущности, превращает Mine в команду, так как запустить функцию можно, просто указав ее имя. Именно это и происходит в пятой строке.

  • Параметры в сценарииПараметры определяются особым образом вначале сценария. Можно предварить это определение комментарием, но в любом случае это должна быть первая исполняемая строка сценария. В области определения параметров каждый из них отделяется запятой. Для удобства чтения каждый параметр рекомендуется располагать в собственной строке. Вот пример:
param (
[string]$computername,
[string]$logfile,
[int]$attemptcount = 5
)  

​ Здесь определяются три параметра. В сценарии они используются как любые другие переменные. Вы наверняка заметили, что в пятой строке я присвоил параметру $attemptcount значение по умолчанию. Это значение будет заменено значением входного параметра, но если он не будет задан, сценарий будет выполняться со значением по умолчанию.

  • Дополнительные параметры, которые нам упрощают жизнь: Mandatory – Принимает два значения True обязательный для заполнения и False необязательный; - HelpMessage – Справка по переменной;
    - ParameterSetName – Имя переменной к которой относятся данные параметры;
           * Position  Позиция переменной при вызове функции;
    
           ### Вывод информации
    

​ Рассмотрим несколько основных вариантов вывода информации на экран:

  • Запись в файл, используя Out-File
    powershell $str = "Hello Habr!" $str | Out-File D:\out_test1.txt

       или использовать знак ">"
    
       ```powershell
       $str = "Hello Habr!"
       $str > D:\out_test2.txt
       ```
    
  • Экспорт данных в .csv файл, используя Export-Csv

$p = Get-Process
$p | SELECT Name, Path | Export-Csv -Path D:\out_test3.csv
  • Запись в файл HTML, используя ConvertTo-Html*

       ```powershell
       $h = Get-Process 
       $h | ConvertTo-Html -Property Name, Path > D:\out_test4.html & D:\out_test4.html   #Откроем файле после формирования
       ```
    
  • Прочитать файл  -  командлет Get-Content

powershell Get-Content D:\out_test1.txt

### Обработка содержимого веб-страниц и HTML сайтов

источник: http://winitpro.ru/index.php/2014/10/08/obrabotka-soderzhimogo-veb-stranic-i-html-sajtov-v-powershell/

$SiteAdress = "http://ya.ru"
$HttpContent = Invoke-WebRequest -URI $SiteAdress

Отправка почты из PowerShell

источник: http://winitpro.ru/index.php/2011/03/30/otpravka-pochty-iz-powershell/

$EmailTo = "test@test.ru"
$EmailFrom = "test@gmail.com"
$Subject = "Test" 
$Body = "Test Body" 
$SMTPServer = "smtp.google.com" 
# $filenameAndPath = "C:\CDF.pdf"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
# $attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
# $SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 465) 
$SMTPClient.ClientCertificates          
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("user", "password"); 
$SMTPClient.Send($SMTPMessage)

HTML-отчеты в PowerShell

источник: https://technet.microsoft.com/ru-ru/library/hh127059.aspx

Get-WmiObject Class Win32_Service |* 
Select-Object property Name,State |*
Where-Object Filter { $_.StartMode eq 'Auto' and $_.State ne 'Running' } |* 
ConvertTo-HTML |* 
Out-File BadNews.html*

Использование в PowerShell Where, Where-Object, ?

источник: http://get-powershell.ru/2015/%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-powershell-where-object/

Операции сравнения

Прежде всего нужно разобраться с операциями сравнения:

  • -lt – Меньше, чем
  • -le – Меньше или равно
  • -gt – Больше, чем
  • -ge – Больше или равно
  • -eq – Равно
  • -ne – Не равно
  • -like – оператор подобия
  • -notlike – оператор не-подобия

Если подставить к первым 7 в начале символ ‘c’ получатся операции сравнения, чувствительные к регистру. Например, -eq не чувствителен к регистру, а -ceq уже чувствителен к регистру.

Первый вариант.

Get-Vm | Where State -eq Running
Get-Service | ? DisplayName -like '\*dhcp\*'

Второй вариант использования Where — это использования параметра FilterScript. Данный параметр является позиционным и его указание не обязательно.

При использовании данного способа после Where в фигурных скобках указывается условие, которое обращается к свойствам объекта через переменную $.

Переменная $ или ее аналог $PSItem содержит текущий объект просматриваемый в конвейере. Обращение к свойствам текущего объекта осущесвляется через точку.

Get-Service | Where-Object {$_.DisplayName -like '\*dhcp\*'}*

Sort-Object

источник: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/sort-object

Массива (array)

источник: https://www.sysadmins.lv/blog-ru/powershell-massivy-chast-1-sozdanie-massivov.aspx

Variable = Value1, Value2, Value3 <...> ValueN

  • Массив определенного типа:
$a = [int[]](1,2,3)
$a.GetType().FullName
System.Int32[]
  • Пустой массив: @()

  • $a = 5..10

  • Массивы можно увеличивать в размере при помощи математического оператора сложения или умножения команда вида $a += 0 является упрощённой записью простейшего счётчика: $a = $a + 0. То же самое и касается оператора *=. Это равносильно команде $a = $a * 0
  • чтобы создать настоящий массив фиксированного типа следует использовать класс List(T). Такой массив не будет изменять свой тип при изменении размера. И если попытаться в такой массив добавить элемент неправильного типа, вы получите ошибку.

Двумерный массив

$b = New-Object "object[,]" 3,3
$b[0,0] = 1
$b[0,1] = 2
$b[0,2] = 3
$b[1,0] = 4
$b[1,1] = 5
$b[1,2] = 6
$b[2,0] = 7
$b[2,1] = 8
$b[2,2] = 9

Первый индекс указывает на номер столбца, второй индекс указывает номер строки. Однако, двумерные массивы нельзя складывать или умножать. В этом случае PowerShell разбивает этот массив в одномерный путём присоединения каждого последуюшего столбца к предыдущему.

Хеш-таблицы.

[hashtable] System.Collections.Hashtable

Различие между хэш-таблицами и массивами в том, что в массивах используются индексы, а в хэш-таблице именованные ключи. Хеш-таблицы строятся по принципу: @{ ключ = «значение» }

$ht = @{odin="one"; dva="two"; tri="three"}

Чтобы добавить элемент к хеш-таблице, можно или присвоить ей тот ключ, которого ещё нет, или воспользоваться методом Add(). Если присваивание делать к существующему ключу — значение ключа изменится на присваиваемое. Для удаления элемента из хеш-таблицы есть метод Remove().

$ht.Add("chetyre", "four")
$ht.pyat = "five"
$ht.Remove("dva")

Обработка ошибок в PowerShell

  • http://windowsnotes.ru/powershell-2/obrabotka-oshibok-v-powershell-chast-1/
  • http://windowsnotes.ru/powershell-2/obrabotka-oshibok-v-powershell-chast-2/

Справочник команд PowerShell

Удаленное управление на PowerShell

ссылки:http://windowsnotes.ru/powershell-2/udalennoe-upravlenie-s-pomoshhyu-powershell/

PowerShell Remoting   основан на Microsoft реализации протокола Web Services for Management (WS-Management), а для связи использует службу  Windows Remote Management (WinRM). Связь между компьютерами осуществляется по HTTP (по умолчанию) или HTTPS. Весь трафик между двумя компьютерами шифруется на уровне протокола (за исключением случаев, когда используется SSL). Поддерживаются несколько методов аутентификации, включая NTLM и Kerberos. В отличие от утилит, использующих различные программные интерфейсы, PS Remoting работает следующим образом: команды, вводимые на локальном компьютере, передаются на удаленный компьютер и там выполняются, затем результат передается обратно. Поскольку все команды выполняются локально, нет необходимости заботится о совместимости. Кроме того, для работы PS Remoting нужен всего один открытый порт на брандмауэре.Windows PowerShell рассчитан не только на локальное использование, но и на удаленное выполнение команд. Данная возможность необходима, чтобы Вы могли со своего рабочего места управлять удаленными компьютерами, т.е. выполнять команды PowerShell.

Существует несколько способов удаленного управления:

  • С помощью параметра –ComputerName (есть у многих команд). Другими словами Вы передаете имя компьютера, на котором необходимо выполнить команду, в качестве параметра. Способ обладает недостатком, так как ограничивается выполнением одной команды;
  • С помощью сессий. Командлет Enter-PSSession (интерактивный сеанс). Таким способом Вы подключаетесь к удаленному компьютеру и все команды, которые Вы будете набирать в оболочке PowerShell, будут выполняться на удаленном компьютере так же, как если бы Вы набирали команды непосредственно на удаленном компьютере. Способ также обладает недостатком, так как сеанс ограничивается одним компьютером;
  • С помощью командлета Invoke-Command . С помощью данного способа можно выполнять команды или сценарии как на одном компьютере, так и на нескольких.

Например, чтобы подключиться к удаленному компьютеру (в примере ниже ServerName) интерактивным сеансом выполните следующую команду:

Enter-PSSession ServerName

Фоновое исполнение заданий

В Windows PowerShell есть возможность фонового исполнения заданий, она представляет собой механизм, с помощью которого можно запустить на выполнение команду (например, которая долго выполняется) в фоновом режиме, т.е. после запуска Вы возвращаетесь в текущую сессию и можете продолжить работу, не дожидаясь окончания работы команды. Данная возможность Вам понадобится тогда, когда у Вас возникнет необходимость запустить команду, работа которой занимает достаточно продолжительное время, а как Вы знаете, в течение этого времени сессия оболочки PowerShell блокируется до завершения работы команды, а Вам нужно продолжать работать.Всеми заданиями, которые запущенны в фоновом режиме, Вы можете управлять, например, посмотреть список заданий, остановить работу задания, удалить задание, и, конечно же, посмотреть результат работы задания.В Windows PowerShell для работы с фоновыми заданиями есть следующие командлеты:

  • Start-Job – запустить фоновую задачу;

  • Stop-Job – остановить фоновую задачу

  • Get-Job – посмотреть список фоновых задач;

  • Receive-Job – посмотреть результат выполнения фоновой задачи;

  • Remove-Job – удалить фоновую задачу;

  • Wait-Job – перевести фоновую задачу на передний план, для того чтобы дожидаться ее окончания.

Для запуска в фоновом режиме необходимо написать команду Start-Job, а в фигурных скобках {} команду или набор команд, которые необходимо выполнить в фоновом режиме.Например, давайте запустим какую-нибудь задачу (показать список служб) в фоновом режиме, затем посмотрим на список фоновых заданий и выведем на экран результат работы нашего задания (т.е. список служб).

  • Запуск задачи в фоновом режиме

​ Start-Job {Get-Service}

  • Смотрим на список задач запущенных в фоновом режиме Get-Job

  • Отображаем результат работы задания Job1

Receive-Job Job1

Функция PowerShell для проверки доступности компьютеров

Функция PowerShell для проверки доступности компьютеров в диапазоне 10.10.10.1 – 10.10.10.255

function Check-Online {
param(
$computername
)
test-connection -count 1 -ComputerName $computername -TimeToLive 5 -asJob |
Wait-Job |
Receive-Job |
Where-Object { $_.StatusCode -eq 0 } |
Select-Object -ExpandProperty Address
}
$ips = 1..255 | ForEach-Object { "10.10.10.$_" }
$online = Check-Online -computername $ips
$online

social