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