Windows Powershell : Automatiser votre administration système

Post on 23-Feb-2016

98 views 1 download

description

Windows Powershell : Automatiser votre administration système. Mardi 8 février 2011. Arnaud PETITJEAN Consultant et formateur PowerShell-Scripting.com. Jacques BARATHON Consultant et formateur PowerShell-Scripting.com. Agenda. La Communauté PowerShell francophone - PowerPoint PPT Presentation

Transcript of Windows Powershell : Automatiser votre administration système

2

Windows Powershell : Automatiser votre administration système

Arnaud PETITJEANConsultant et formateur PowerShell-Scripting.com

Mardi 8 février 2011Jacques BARATHON

Consultant et formateur PowerShell-Scripting.com

3

Agenda

• La Communauté PowerShell francophone• Introduction sur Windows PowerShell• Les principaux éléments du langage• Administration de l’Active Directory• Les différentes techniques de Remoting• Q&A

4

La Communauté Francophone

Entrez dans la communauté francophone

• News

• Tutoriaux

• Scripts

• Forum

5

Un forum vivant !

Profitez d’un partage de connaissances avec les plus grands spécialistes français

6

La Galaxie PowerShell

7

Toute l’industrie informatique s’y met !

8

Windows PowerShell• Interpréteur de commandes

• Jeu de commandes normalisé• Jeu de paramètres normalisé

• Langage de scripts• Concision des scripts

• Comparaison avec VBScript• Sécurisé dès la conception

• Règles d’exécution des scripts• S’appuie sur le Framework .NET 2.0

• Manipulation d’objets• Accès aux classes .NET

• Extensibilité du langage : snap-ins, modules

9

Un langage simple et puissantPS> get-process | where {$_.workingset -gt 100MB} | format-table name, id, handles, path -auto

Name Id Handles Path---- -- ------- ----OUTLOOK 2488 4708 C:\Program Files\Microsoft Office\Office12\OUTLOOK.EXEPOWERPNT 1556 826 C:\Program Files\Microsoft Office\Office12\POWERPNT.EXEpowershell 3656 1844 C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe

PS> notepadPS> $avant = get-processPS> get-process notepad | stop-processPS> $apres = get-processPS> compare-object $avant $apres

InputObject SideIndicator----------- -------------System.Diagnostics.Process (notepad) <=

10

Filtrer: Where-Object• Examine un à un les objets transmis par le pipeline et les compare à

une condition Si la condition est remplie, l’objet est transmis à la suite du

pipeline Si la condition n’est pas remplie, l’objet n’est pas transmis

• Chaque objet examiné est représenté par la variable $_• Alias : where, ?

PS > Get-Service | Where-Object {$_.Status -eq 'Stopped'}

Status Name DisplayName------ ---- -----------Stopped AeLookupSvc Application ExperienceStopped ALG Application Layer Gateway ServiceStopped AppIDSvc Application IdentityStopped AxInstSV ActiveX Installer (AxInstSV)Stopped BDESVC BitLocker Drive Encryption ServiceStopped bthserv Bluetooth Support ServiceStopped CertPropSvc Certificate Propagation...

11

Traiter par lots: Foreach-Object• Exécute une série de commandes pour chaque

objet transmis par le pipeline• Chaque objet transmis est représenté par la

variable $_• Alias : Foreach, %• Syntaxe :

<collection> | Foreach-Object { # bloc d’instructions}

• Exemple : Get-Process | foreach { "{0} démarré à {1}" –f $_.Name, $_.StartTime  }

...dwm démarré à 09/21/2008 16:53:26ehmsas démarré à 09/21/2008 16:53:36ehtray démarré à 09/21/2008 16:53:33explorer démarré à 09/22/2008 23:45:50...

12

Trier: Sort-Object• Trie les objets transmis par le pipeline• Alias : sort

PS > get-process | sort-object ID

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName------- ------ ----- ----- ----- ------ -- ----------- 0 0 0 24 0 0 Idle 696 0 60 4652 6 4 System 30 1 264 808 4 272 smss...

PS > get-process | sort-object WS –desc

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName------- ------ ----- ----- ----- ------ -- ----------- 4851 82 117108 194208 598 732,67 2488 OUTLOOK 936 84 157432 132764 420 3 988,20 1556 POWERPNT 980 20 110324 129768 289 113,32 3656 powershell 1092 44 46240 103120 339 1 154,10 2468 WINWORD...

13

Sélectionner: Select-Object• Sélectionne certaines propriétés des objets transmis par le pipeline, ou

certains objets parmi une série• Alias : select

PS > Get-Hotfix | select-object HotfixID, Description, InstalledBy

HotfixID Description InstalledBy-------- ----------- -----------KB958830 Update jbaratho07\JacquesKB2079403 Security Update NT AUTHORITY\SYSTEM...

PS > dir c:\windows | sort LastWriteTime | select -last 3

Directory: C:\windows

Mode LastWriteTime Length Name---- ------------- ------ -----a--- 23/10/2010 16:28 1530877 WindowsUpdate.logd---- 23/10/2010 20:33 Prefetchd---- 23/10/2010 21:25 Temp

14

Regrouper: Group-Object• Regroupe des objets transmis par le pipeline selon une (des) propriété(s)

commune(s)• Alias : group

PS > get-service | group-object Status

Count Name Group----- ---- ----- 75 Running {System.ServiceProcess.ServiceController, S... 84 Stopped {System.ServiceProcess.ServiceController, S...

PS > get-process | group Company -noelement | sort Count -desc

Count Name----- ---- 48 Microsoft Corporation 3 Microsoft Corp. 3 2 Synaptics Incorporated 2 AMD 2 IDT, Inc....

15

Mesurer: Measure-Object• Effectue des calculs sur les propriétés des objets transmis • Alias : measure

PS > get-process | measure-object WorkingSet –min –max -average

Count : 73Average : 25718222,9041096Sum :Maximum : 199229440Minimum : 24576Property : WorkingSet

PS > get-content c:\windows\WindowsUpdate.log | measure -line -word -char

Lines Words Characters ----- ----- ---------- 11503 161297 1507871

16

Comparer: Compare-Object• Compare deux objets ou deux séries d’objets• Alias : compare

PS > $anglais = ('Sophie','Ludo','Andrea','Pierre','Alex')PS > $espagnol = ('Ludo','Hubert','Lea','Sophie')PS > compare-object $anglais $espagnol

InputObject SideIndicator----------- -------------Hubert =>Lea =>Andrea <=Pierre <=Alex <=

PS > compare $anglais $espagnol -IncludeEqual -ExcludeDifferent

InputObject SideIndicator----------- -------------Ludo ==Sophie ==

17

DémoLa farandole des objets

18

Le Couteau Suisse• Get-Command

• Fournit des informations sur les commandes disponibles

• Alias : gcm

• Get-Help• Fournit de l’aide sur les commandes (scripts y

compris)

• Get-Member• Retourne les méthodes et les propriétés d’un objet• Alias : gm

19

DémoLes 3 lames de notre Couteau Suisse

20

Active Directory• 2 techniques pour administrer l’Active Directory :

• L’API ADSI (classique)

• Module Active Directory pour Windows PowerShell

21

• Installé de base sur tout DC Windows Server 2008 R2• Installable sous Windows 7 (uniquement) via RSAT

(Remote Server Administration Tools)

• Le module apporte :• 76 commandelettes• Fournisseur ActiveDirectory (et son lecteur AD:)

• Permet aussi d’administrer Active Directory Lightweight Domain Services (AD LDS)

Module Active Directory

22

• Dialogue avec les Services Web Active Directory (ADWS)

PS> get-service –displayname '*active directory*'

Status Name DisplayName------ ---- -----------Running ADWS Services Web Active DirectoryRunning NTDS Services de domaine Active Directory

Module Active Directory : ADWS

Pensez à ouvrir une exception dans le pare-feu

23

• Services Web de Passerelle Active Directory pour les anciennes versions d’Active Directory

• Composant logiciel (±1 Mo) installable sur :

• DC Windows Server 2008 SP2• DC Windows Server 2003 SP 2 / 2003 R2 SP2

• Prérequis : 1 hotfix + Framework .Net 3.5 SP 1

Active Directory Management Gateway Service (ADMGS)

24

Comment accéder aux commandelettes ?

• Lancer « la console » via le Menu Démarrer/Outils d’administration/Module Active Directory pour Windows PowerShell

• Lancer « la console » via le Menu Démarrer/Outils d’administration/Windows PowerShell Modules

• Lancer la console PowerShell classique et importer le module ActiveDirectory

Module Active Directory

25

Recherche d’objets

• Plusieurs façons de faire :1. Recherche basée sur un filtre au format LDAP

(paramètre -LDAPFilter)Exemple: Get-ADObject -LDAPFilter '(name=admin*)'

2. Recherche basée sur un filtre générique(paramètre -Filter)Exemple: Get-ADObject -filter {objectclass -eq 'computer'}

Module Active Directory

26

Accès direct à un objet

• On peut « adresser » un objet dès lors que l’on connait :• Son DN : CN=Jean,CN=powershell,DC=fr• Son ObjectGUID : 12f9e488-47f3-4154-b1c9-c75b9c1bf7d5• Son SID: S-1-5-21-3628732846-2239576409-4110719840-1103• Son SAMAccountName: Jean

Module Active Directory

Exemple: Get-ADObject -Identity 12f9e488-47f3-4154-b1c9-c75b9c1bf7d5

27

DémoAdministration Active Directory

28

L’administration à distance• Egalement appelée « Remoting » (« remote » :

distant)

• Avant PowerShell

• Principalement de la consultation• WMI à la rescousse !• PSExec pour l’exécution de scripts à distance• Et autres bricolages maison…

29

L’administration à distance• Disponible dès PowerShell 1.0

• Paramètre -ComputerName• Exécute la commande sur le(s) serveur(s) distant(s)

• Dans PowerShell 1.0, une seule commande :

PS> get-help * -parameter computername Name----Get-WmiObject

30

L’administration à distance• Paramètre -ComputerName dans PowerShell 2.0

PS> (get-help * -parameter computername).count35 

• Principe étendu à de nombreux types d’objets et d’actionsGet-ProcessGet-ServiceSet-ServiceGet-CounterGet-EventLogGet-WinEventGet-HotFix

Write-EventLogClear-EventLogTest-ConnectionStop-ComputerRestart-ComputerInvoke-WmiMethodRegister-WmiEventSet-WmiInstance

31

DémoRemoting v1

32

L’administration à distance• Remoting avancé avec PowerShell 2.0

• Utilisation du service WinRM• Sessions « ad-hoc » (à la demande) ou

persistantes• Tâches en arrière-plan (« jobs »)

• Délègue l’entière exécution au serveur distant• S’intègre avec les règles de sécurité des pare-

feu

33

Le Remoting v2• Pré-requis

• PowerShell 2.0 des deux côtés• Activation explicite du Remoting sur le poste

distant• Configuration de la sécurité (hors domaine)• Configurable par GPO

• Les nouvelles commandes à notre dispositionEnable-PSRemoting

Invoke-Command

New-PSSessionGet-PSSessionRemove-PSSessionEnter-PSSession

Start-JobGet-JobWait-JobReceive-JobStop-JobRemove-Job

34

DémoRemoting v2

35

Annonce

Disponible sur le stand des éditions

ENI

36

MSDN et TechNet : l’essentiel des ressources techniques à portée de clic

http://technet.com http://msdn.com

Portail administration et infrastructure pour informaticiens

Portail de ressources technique pour développeurs

38

Slides de backup

39

Démo Remoting v1PS> gwmi win32_logicaldisk -comp frapp0028, frapp0018 -filter "drivetype=3" | select

__server, deviceid, size, freespace __SERVER deviceid size freespace-------- -------- ---- ---------FRAPP0028 C: 31459717120 22950543360FRAPP0028 D: 332708655104 25402429440FRAPP0018 C: 8598138880 1414307840FRAPP0018 D: 209898696704 83053187072FRAPP0018 F: 423157035008 99024175104 PS> gwmi win32_logicaldisk -comp frapp0028, frapp0018 -filter "drivetype=3" | select

__server, deviceid, @{n="Size(GB)"; e={[math]::round($_.size/1GB, 2)}}, @{n="FreeSpace(GB"; e={[math]::round($_.freespace/1GB, 2)}}

 __SERVER deviceid Size(GB) FreeSpace(GB)-------- -------- -------- ------------FRAPP0028 C: 29,3 21,37FRAPP0028 D: 309,86 23,46FRAPP0018 C: 8,01 1,32FRAPP0018 D: 195,48 77,35FRAPP0018 F: 394,1 92,22

PS> gwmi Win32_ntlogevent -filter "eventidentifier=4624" | select computername, @{n="TimeWritten"; e={$_.ConvertToDateTime($_.timewritten)}}, @{n="User"; e={$_.insertionstrings[5]}} | where {$_.TimeWritten -gt (get-date).AddHours(-1)}

Démo Remoting v2PS> $demo = new-pssession -comp mce01,jbaratho07PS> $scan = invoke-command -session $demo -scriptblock {dir

c:\ *.mp3 -rec} –asjobPS> $scan.childjobsPS> $mp3 = receive-job $scanPS> $mp3 | sort pscomputername, directoryPS> $mp3.countPS> $mp3 | measure length –sum |select @{n="Sum(GB)";

e={[math]::round($_.sum / 1GB, 2)}}PS> $clean = invoke-command -session $demo -scriptblock {dir

c:\ *.mp3 –rec | remove-item} –asjob