Sunteți pe pagina 1din 10

Introducere în 

PowerShell şi Fundamente
http://itspark.ro/w/wiki/introducere-in-powershell.aspx

PowerShell trebuie văzut ca un pas (uriaş) înainte de la Windows Scripting Host (WSH), VBscript şi good-old MS-DOS batch scripts,
toate fiind folosite pentru a automatiza anumite taskuri având acces la obiectele COM şi WMI din Windows. Altfel zis, Powershell se
poate compara cu Bash de pe sistemele Linux, având foarte multe funcţionalităţi în comun (dar şi multe funcţionalităţi suplimentare
extrem de utile). O comparaţie Bash vs. PowerShell a apărut şi în Linux Magazine şi descrie foarte bine funcţionalităţile de bază
între cele 2 shell-uri. 

Un pic de istorie: Powershell 1.0 a avut o adopţie lentă la început din câteva motive: 

 nu era instalat by-default în Windows, aşadar trebuia făcut deploy manual de PowerShell pe servere/staţii. 
 alte medii de scripting erau deja folosite de administratorii de sistem. 

 fiind un produs nou a durat ceva timp până când comunitatea PowerShell a devenit suficient de matură pentru a demonstra
capabilităţile şi cum se pot face lucruri utile şi interesante în PowerShell pe partea de administrare de servere şi staţii.    

Atitudinea multora a început să se schimbe însă în momentul în care Microsoft a început să includă PowerShell în produse precum
Exchange 2007 şi System Center Operation Manager (SCOM). Acestea au fost urmate la scurt timp de primul tool de management
construit în întregime ca un GUI peste PowerShell, şi anume System Center Virtual Machine Manager (SCVMM). 
   
Lucrurile au avansat foarte mult, iar acum PowerShell 2.0 este o componentă de bază în SQL Server 2008, există suport pentru
Active Directory, Sharepoint Foundation Server, IIS, etc - ajungând să fie inclus până şi în întrebări din examenele de certificare
Microsoft.

Există şi software 3rd party pentru care s-au creat interfeţe şi cmdlet-uri de PowerShell, cateva dintre cele mai importante tooluri
pentru care exista suport se numara VMware vSphere PowerCLI, IBM WebSphere MQ şi unul dintre cei mai activi parteneri care
sprijină PowerShell - Quest Software care au lansat şi câteva tool-uri de PowerShell foarte utile.

La adresa http://blogs.msdn.com/b/powershell/archive/2007/03/19/monad-manifesto-the-origin-of-windows-powershell.aspx
puteţi citi manifestul pentru Powershell aşa cum a fost conceput în 2002 iar cu versiunea 2.0 apărută putem compara acel manifest
cu evoluţia PowerShell.

PowerShell a fost inclus şi în Microsoft Servers Common Engineering Criteria care specifică faptul că orice produs Server
trebuie să respecte o serie de cerinţe. Printre ele se află şi PowerShell, în secţiunea de Management, şi e utilizat pentru a
automatiza diverse componente de la deployment, configurare, până la securitate şi diagnosticare prin intermediul cmdlet-urilor.
 
PowerShell 2.0 a fost gândit să fie cât mai independent de OS, aşa că poate fi instalat pe mai multe versiuni de Windows - atât
Server cât şi Client. Un script care rulează pe Windows Server 2003 rulează şi pe Windows 7 (desigur, dacă nu foloseşte o anumită
componentă care se află doar pe Windows Server).
 
De asemenea, e important de menţionat că PowerShell e construit pe platforma .NET framework, iar comenzile din el (numite
"command-lets") pot să instantieze obiecte .NET direct din linie de comandă şi pot să parseze şi să manipuleze datele între ele prin
intermediul pipe-urilor - un feature foarte util şi pe care o să îl folosim. Mai multe detalii despre commandlets vor veni în articolele
următoare.
 
PowerShell 1.0 a fost inclus ca o componentă care poate fi instalată în Windows Server 2008 iar în Windows 7 şi Server 2008 R2
PowerShell 2.0 este instalat by default.

Versiunea 2.0 de PowerShell îmbunătăţeşte multe din componente din prima versiune, dar adaugă şi noi features bazate pe
feedback-ul din comunitate, http://www.powershellcommunity.org fiind una dintre cele mai mari comunităţi care s-a arătat foarte
interesta de PowerShell şi a contribuit cu foarte mult feedback.

Ca o vedere în ansamblu despre ce e nou în PowerShell 2.0, câteva îmbunătăţiri - features:

 PowerShell remoting - se pot executa scripturi remote - pe alte staţii/servere.


 background jobs - comenzile rulează în background iar shell-ul este disponibil pentru alte taskuri de exemplu

 funcţii avansate - commandlet-urile puteau fi scrise doar în C# sau VB.NET dar acum acetea pot fi scrise direct din
PowerShell, sau se poate rula clase de .NET Framework direct din PowerShell prin intermediul funcţiilor.

 data language - codul poate fi separat de date, făcându-l mai portabil.

 script internationalization - scripturile pot fi ajustate pentru a rula cu divere language packs.

 script debugging - şi scripturile din PowerShell 1.0 puteau fi analizate dar în PowerShell 2.0 capabilităţile de debugging
sunt mult îmbunătăţite, mai ales din ISE...
 Integrated scipting environment (ISE) - este o versiune grafică pentru command shell care suportă taburi şi rularea a mai
multor scripturi simultan.

 API nou - programatorii pot folosi toate featurile din PowerShell folosind direct API-ul.

 Modificări ale commandlet-urilor din versiunea iniţială și noi metode de output şi de sortare a datelor.

În articolele următoare o să vedem ce înseamnă un cmdlet,  ce este Windows PowerShell Integrated Shell Environment (ISE),
câteva note despre regulile de securitate din PowerShell iar apoi o să începem să folosim cmdlet-urile şi să scriem primul script.

Instalare şi configurare PowerShell

http://itspark.ro/w/wiki/instalare-si-configurare-powershell.aspx

http://itspark.ro/default.aspx

În Windows 7 şi Server 2008 R2 PowerShell 2.0 este instalat by


default.
PowerShell 1.0 a fost inclus ca un feature în Windows Server 2008 iar în Windows 7 şi Server 2008 R2 PowerShell 2.0 este
instalat by default.

Ambele versiuni de PowerShell nu pot exista în paralel pe un sistem iar orice versiune anterioară trebuie dezinstalata. PowerShell 2
este disponibil atât pentru x86 (32bit) cât şi pentru 64bit iar sistemele de operare suportate sunt:
Desktop: Windows XP / Vista / 7
Server: Windows Server 2003 / 2008 / 2008 R2.

Cea mai simplă metodă de instalare este prin intermediul Windows Updates. PowerShell 2.0 este oferit ca un update opţional
împreună cu WinRM 2.0, iar acestea vor apărea sub numele de ”Windows Management Framework Core” - acesta fiind de fapt
un Windows update (KB968930).

Tot această variantă va trebui să o folosiţi şi pe Windows Server 2008, deşi ziceam mai sus că este inclus ca feature, versiunea
este 1.0. Chiar dacă acesta este instalat deja, WM Framework Core îl va dezinstala mai întâi.

Windows Management Framework Core poate fi downloadat şi instalat manual de aici.

Dacă doriţi să instalaţi manual fiecare componentă aveţi nevoie de următoarele componente:

 .NET Framework 3.5.1 instalat sau ultima versiune - .NET Framework 4


 Windows Remote Management (WinRM) 2.0 şi BITS 4.0. Aceste componente sunt necesare dacă doriţi să folosiţi partea
de remote şi de background jobs. Linkurile de download pentru cele 2 componente le găsiţi în.

Din descrierea oficială WinRM este implementarea Microsoft a protocolului WS-Management care permite un canal securizat
pentru comunicarea dintre un computer local şi unul remote folosind serviciile web.

Pe Windows Vista este recomandată rularea PowerShell cu drepturi de Administrator pentru a evita erori de access denied în
diferite cmdlet-uri.

Cum putem detecta ce versiune de PowerShell este instalată?


Există cel puţin 3 moduri:
1. Folosind variabila $Host.Version în consola de PowerShell:
2. Variabila $PSVersionTable care oferă informaţii şi despre WinRM şi versiunea de .NET:

3. Din Registry - aceasta este utilă dacă vrem să detectăm dacă PowerShell este instalat în primul rând şi apoi ce versiune este:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
 Value Name: Install
 Value Type: REG_DWORD
 Value Data: 1

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
 Value Name: PowerShellVersion
 Value Type: REG_SZ
 Value Data: <1.0 | 2.0>

Instalarea se face automat în C:\WINDOWS\system32\WindowsPowerShell\v1.0 pe Windows 32-bit iar pe 64-bit în


C:\Windows\SysWOW64\WindowsPowerShell\v1.0 şi această locaţie nu poate fi schimbată. Nu vă lăsaţi derutaţi de folderul
\v1.0\ chiar şi pentru PowerShell 2.0 - locaţia a fost păstrată cred pentru compatibilitatea cu PowerShell 1.0.

Configurare PowerShell
Odată instalat putem rula PS din Start Menu dar există câteva opţiuni care pot fi folosite când se lansează o consola de PowerShell:
1. Fără să afişeze logo/banner folosind parametrul "€œ-nologo”:
2. Putem rula o singură comandă de PS după care acesta să fie închis, folosind parametrul -command “cmdlet”. In exemplul
următor afişăm o listă cu procesele după care se revine la MS-DOS:

3. O consolă de PowerShell poate fi modificată astfel încât să încarce automat snap-in-uri (cmdlet-urile de IIS de exemplu) sau
diferiţi parametri pentru a afişa consola direct de la pornire. Parametrul este ”œ-PSConsoleFile” urmat de numele fişierul de
configurare.
Exemplu: PowerShell -psconsolefile profilChris.psc1

Fişierul profilChris.psc1 poate fi creat dintr-o sesiune de PS rulând comanda: Export-Console profilChris (extensia .psc1 este
adăugată automat) iar fişierul este scris în locaţia curentă.
Conţinutul acestui fişier este în format XML iar pentru un profil generic arată aşa:

  <?xml version="1.0" encoding="utf-8"?>

  <PSConsoleFile ConsoleSchemaVersion="1.0">

   <PSVersion>2.0</PSVersion>

   <PSSnapIns />

  </PSConsoleFile>

Folosind acest tip de fişier de configurare putem să ne facem propriul profil cu diverse alias-uri şi setări care să fie încărcat automat
dar toate acestea într-un articol viitor. :)

PowerShell mai suportă şi alţi parametrii cu care poate fi pornit, într-o consola de MS-DOS rulaţi “€œPowerShell /?” şi o să vedeţi
lista completă cu toţi parametrii suportaţi.

Cmdlets

http://itspark.ro/w/wiki/cmdlets.aspx

Ce este un cmdlet?
Pe lângă programele instalate, cele din Windows (netsh, ipconfig) şi comenzi standard de MS-DOS, în PowerShell mai putem rula şi
alte comenzi numite commandlets (cmdlets) care sunt construite în PowerShell.
 
Cmdlet-urile sunt instanţe de clase .NET Framework care execută o anumită acţiune asupra unui obiect.
Pentru simplitate un cmdlet nu este altceva decât o comandă de PowerShell, dar mult mai complexă decât una e MS-DOS iar orice
developer în .NET Framework poate crea noi module (commandlets-uri).
 
Structura denumirii unui cmdlet este de forma "verb-substantiv" tocmai pentru a arăta tipul de acţiune pe care un cmdlet-ul îl
execută (verb) asupra unui obiect (substantivul).
Cateva exemple:
     Get-Service <- afişează o listă de procese
     Set-Alias <- pentru a crea un Alias
     Write-Host <- cu acest cmdlet afişăm un text
 
După ce am pornit consola de PS (Start -> Accessories-> Windows PowerShell sau mult mai simplu cautam "PowerShell"direct din
Start Menu) putem rula câteva comenzi pe care le ştim deja din MS-DOS: dir / cd / copy.

Un lucru important pentru dir şi cd - dacă o să comparăm output-ul comenzilor în PS cu cel din MS-DOS o să vedem că acesta
diferă iar explicaţia e simplă: cd şi dir sub PS nu mai sunt comenzile native din MS-DOS ci  alias-uri pentru Get-ChildItem si Set-
Location.
 
Există peste 200 de cmdlet-uri pe o instalare simplă de PS dar numărul lor creşte semnificativ pentru fiecare aplicaţie care suportă
PS şi care vin cu propriile cmdleturi. Exchange 2007 vine cu Exchange Management Shell care include un set de cmdlet-uri pentru
toate funcţiile din MS Exchange, iar anumite setări din Exchange 2007 pot fi făcute doar din PS.
Pentru a vedea o listă cu cmdlet-urile disponibile pe un sistem apelăm la cmdlet-ul "Get-Command" dar acesta va afişa o listă
continuă care nu va încăpea pe un screen. O variantă pentru a vedea lista completă este prin parsarea outputului comenzii către
comanda "more" iar astfel puteţi vedea câte un screen pe rând.
 Get-Command | more
Aici am folosit un pipeline simplu (semnul '|') dar în scripturi pipeline-urile sunt des intalnite pentru ca  permit manipularea datelor
între diferite cmdlet-uri .
 
Fiecare cmdlet este foarte bine documentat iar pentru a vedea descrierea completă şi parametrii suportaţi de fiecare cmdlet o să
folosim cmdlet-ul Get-Help:  "Get-Help Get-Alias".
 
"Get-Help * " returnează o listă completă de topicuri dar dacă ne interesează doar un anumit topic (ex. serviciile din Windows) rulăm
"Get-Help *service*".
 
Există 2 variante de a folosi Get-Help pentru a afişa informaţiile despre un cmdlet, inclusiv exemple foarte utile pentru fiecare
cmdlet.

     Get-Help Get-Alias -detailed


     Get-Help Get-Alias -full
 
Dacă vrem să vedem doar o listă de exemple pentru un cmdlet rulăm: "Get-Help Get-Command -Examples"
 
Get-PSDrive
 Un feature foarte interesant în PowerShell este că putem interacţiona cu mai mulţi providers-drives:

  Disk-uri şi share-uri de reţea, inclusiv drive-uri mapate.


  Certificate, Registry şi Alias-uri.

  Alţi providers care pot fi creaţi cu New-PSDrive.


Aşadar, putem accesa şi lucra cu Windows Registry direct din PowerShell:

Tip!

Unele cmdlet-uri pot avea denumiri lungi, dar pentru a evita scrierea manuală a întregii denumiri  putem scrie doar partea de început
a cmdlet-ului iar apoi să apăsăm tasta [Tab]. Acesta este un feature numit 'Tab completion' şi va identifica numele cmdlet-ului
dacă am fost suficienţi de detaliaţi în denumire, iar dacă sunt mai multe cmdlet-uri atunci apăsaţi de mai multe ori Tab până ajungeţi
la cel dorit. Tab completion este disponibil şi pentru parametrii cmdlet-urilor.

Aşadar, în loc să scriem numele complet "Get-ChildItem" tastăm doar "Get-Ch" şi apăsam tasta [Tab] care va completa automat
numele cmdlet-ului.