Нові можливості PowerShell в Windows Server 2016

Доброго часу доби %HabraUser%! Не так давно мені пощастило стати володарем VDS з встановленим Windows Server 2016 для ознайомлення з даною операційною системою і її новими можливостями. У зв'язку з тим, що останні кілька років я є шанувальником адміністрування з використанням PowerShell, в першу чергу мене зацікавив саме він, так як застосовую його в своїй роботі щодня для автоматизації рутинних завдань. У корпоративному середовищі на сьогоднішній день найчастіше остання використовувана версія операційних систем Windows 8.1 і Windows Server 2012 R2, відповідно, я не звертав уваги на зміни, які принесла мені Windows 10 на домашньому комп'ютері, і як виявилося-даремно. Я пропустив повз себе оновлений інструмент, який став набагато краще, зручніше і швидше в порівнянні з попередніми версіями, про цих основних змінах і хотілося б поговорити. Ласкаво просимо під кат.

В початку списку будуть самі незначні зміни які покликані зробити щоденне використання даного продукту комфортніше для адміністратора:

  • Вікна редактора PowerShell тепер можна змінювати розміри, сумнівне досягнення, але тепер вікно можна розгорнути на весь екран;

    Давайте порівняємо:


    PowerShell 2.0


    PowerShell 5.1

  • Наступне явну відмінність яке видно на скріншотах це підсвічування синтаксису — ось це вже дуже великий плюс;

  • За ним слідує ще одне нововведення — відтепер і надалі повинні підтримуватися модулі і командлети різних версій;

    Даний приклад краще розглянути на скріншотах:


    PowerShell 2.0


    PowerShell 5.1

    Як видно з скріншота з'явилася нова команда, яка, так само, як і більш відома раніше Update-Help для поновлення довідки, служить для оновлення версій модулів Update-Module.

  • З'явилися класи, на цю тему є окрема стаття;

  • Зросла швидкість роботи з com-об'єктами.
Про останній пункт хотілося б поговорити окремо. Розмір Active Directory в організаціях різний, були випадки, коли це було 20-60 користувачів, а були і коли більше декількох десятків тисяч і якщо в першому випадку можна обійтися тільки графічним інтерфейсом, то в другому це зробити можна, але досить складно. Мало хто з адміністраторів уявляє собі Active Directory як об'ємну за інформацією базу даних, з якої можна одержувати необхідні для роботи дані в лічені хвилини застосовуючи до цього правильний підхід.

Трохи рекламиОбраз Windows Server 2016 тільки вчора з'явився для завантаження в каталозі партнерів Microsoft, а вже сьогодні можна ознайомитися з усіма його можливостями всього за 250 рублів на vpsville.
Ліричний відступ...Microsoft спочатку підносила Active Directory як інструмент не тільки для системних адміністраторів, але і для співробітників відділу кадрів. Перші повинні містити всі в робочому стані з точки зору серверної програмної архітектури, другі в свою чергу відповідати за коректне заповнення каталогу. Тому як прийнято розуміти з усіх джерел, з яких можна почерпнути інформацію з цього питання, адміністратор не повинен заводити облікові записи користувачів, так і створювати групи по ідеології Active Directory теж, але у наших суворих Російських реаліях трохи зовсім не так.
Замість технічного завдання.Давайте уявимо, що ми працюємо не в самій маленькій організації і маємо під контролем кілька контролерів домену у філіях, розкиданих по всій нашій неосяжній батьківщині, відповідно, кількість співробітників у нас для прикладу буде не менше однієї тисячі осіб. Згадаємо що країна у нас розбита на багато часових поясів і коли деякі тільки приходять на роботу інші вже йдуть спати, тому модель управління Active Directory у нас буде частково централізована, що має на увазі під собою наявність адміністраторів в регіонах, а не тільки в центральному офісі. Так само у нас є внутрішня технічна документація з вимогами ведення Active Directory, щоб все було єдине і зручно ми ж пам'ятаємо, що це крута база даних, а не тяп ляп.
І так у нас є знання, і завдання, яке необхідно вирішити, давайте саме цим і займемося.

У зв'язку з тим, що згідно нашого технічного завдання дані у нас дуже добре структуровані ми можемо звертатися до них, використовуючи стандартні запити, одним з таких прикладів може послужити довідник співробітників, який використовується на кожному підприємстві.

Ось так це виглядає на PowerShell:

Get-ADUser -Filter * -SearchBase "OU=Users,OU=Main Office,DC=MyCompany,DC=ru" -Server 'Domain Controller Name' -Properties displayName, description, physicalDeliveryOfficeName, telephoneNumber, mail, title, department, company, manager |
Select displayName, description, physicalDeliveryOfficeName, telephoneNumber, mail, title, department, company, manager |
Export-CSV "C:\Export\MainOffice.csv" -NoType -UseCulture -Encoding Unicode

Коментарі до кодуGet-ADUser — командлет який отримує масив користувачів з області пошуку (-SearchBase) з зазначеними властивостями через кому після параметра -Properties;
Export-CSV — експортує даний масив у файл.
В результаті ми отримуємо готову таблицю з необхідними полями: Ф. В. О., Номер кабінету, Номер телефону, Адресу електронної пошти, Посада, Найменування відділу, Найменування філії, Ф. В. О. Керівника даного співробітника. Цей скрипт працює кілька секунд і дозволяє нам змінивши два (ім'я файлу) один параметр область пошуку (-SearchBase) і отримати довідник по будь-якій філії в поточний момент часу. Далі ми відкриваємо створений нами файл в Excel, змінюємо назви колонок, форматуємо як нам подобається і зберігаємо вже в рідному для Excel форматі. Зрозумівши, що це баловство і можна зробити щось більш серйозне самим собою прийшов варіант роботи з COM-об'єктом, а саме з Excel.

$Template_Excel = "C:\PS\Шаблон.xlsx"
$SaveAs = "C:\PS\ЗаполненыйШаблон.xlsx"
$AllExcel = @(Get-Process [e]xcel | %{$_.Id})
$MyExcel = New-Object -ComObject Excel.Application
$ExcelId = Get-Process excel | %{$_.Id} | Where {$AllExcel -notcontains $_} 
$MyExcel.Visible = $False
$WorkBook = $MyExcel.workbooks.open($Template_Excel)
$WorkSheet = $WorkBook.sheets.item("Шаблон")
$Users = Get-ADUser -Filter * -SearchBase "OU=Users,OU=Main Office,DC=MyCompany,DC=ru" -Server 'Domain Controller Name' -Properties displayName, 
description, physicalDeliveryOfficeName, telephoneNumber, mail, title, department, company, manager |
Select sAMAccountName, displayName, description, physicalDeliveryOfficeName, telephoneNumber, mail, title, department, company, manager
For($x = 0; $x -le $Users.count; $x++)
{
$WorkSheet.Rows.Item($x+2).Columns.Item(1) = $Users[$x].displayName
$WorkSheet.Rows.Item($x+2).Columns.Item(2) = $Users[$x].description
$WorkSheet.Rows.Item($x+2).Columns.Item(3) = $Users[$x].physicalDeliveryOfficeName
$WorkSheet.Rows.Item($x+2).Columns.Item(4) = $Users[$x].telephoneNumber
$WorkSheet.Rows.Item($x+2).Columns.Item(5) = $Users[$x].mail
$WorkSheet.Rows.Item($x+2).Columns.Item(6) = $Users[$x].title
$WorkSheet.Rows.Item($x+2).Columns.Item(7) = $Users[$x].department
$WorkSheet.Rows.Item($x+2).Columns.Item(8) = $Users[$x].company
$WorkSheet.Rows.Item($x+2).Columns.Item(9)= $Users[$x].manager
}

$Workbook.SaveAs($SaveAs)
$MyExcel.quit()
Stop-Process Id $ExcelId -Force -ErrorAction SilentlyContinue

Коментарі до кодуGet-Process — отримує список процесів, в нашому випадку [e]xcel;
New-Object — створюємо новий COM об'єкт, запускаємо свій процес Excel;
Stop-Process — видаляємо створений об'єкт.

Коду в PowerShell стало трохи більше, але на виході ми отримали вже готовий файл, в якому виправляти нічого не потрібно. Існувало тільки одне велике, АЛЕ даний код в Windows 8.1 працює ~ 25-40 хвилин в залежності від кількості оброблюваних об'єктів, причому основну частину часу займає саме робота з COM-об'єктом. Відповідно даний підхід використовувати до появи в моєму житті PowerShell 5 було незручно через час формування файла. У Windows 10 або Windows Server 2016 даний скрипт відпрацьовує за пару хвилин, що дозволяє розширити рамки можливостей.

** — в коментарях до коду командлети є посиланнями на офіційну документацію.

Спасибі що дочитали до кінця. Чукча не письменник, чукча читач.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.