Académique Documents
Professionnel Documents
Culture Documents
Présentation
En comparaison, PowerShell est plus proche d'un langage tel que ' Perl' que d'un
langage de scripts tel que 'bash' et n'a rien à voir avec le langage 'batch' de
DOS/Windows.
Les commandes PowerShell sont en quelque sorte, des classes .Net Framework
simplifiées.
PowerShell est extensible par le biais de modules que l'on charge et décharge,
en fonction des besoins.
➢ d'un type
➢ de méthodes
➢ de propriétés.
L’intérêt majeur avec l’utilisation des objets est de pouvoir simplifier très
efficacement les scripts d'administration.
On peut définir un objet comme une entité définie dans un type et dont
dépendent des éléments appelés 'propriétés' et des actions appelées
'méthodes'.
Avec PowerShell, il est très facile d’interagir avec un objet de type fichier, pour
en modifier le nom, le chemin ou la date du dernier accès, simplement en
utilisant les méthodes de l’objet.
PowerShell est idéal pour effectuer des tâches d'administration systèmes telles
que la gestion du paramétrage des composants, la création de comptes
utilisateurs et les opérations associées.
Installation
Un script PowerShell est un fichier texte qui comporte l'extension ' PS1'.
Un script Powershell peut être lancé à partir d’un fichier .BAT , d’une invite de
commande, depuis l’interpréteur Powershell, d’un service, d’une tâche planifiée
ou simplement en double cliquant sur le script.
Pour créer un fichier de script PowerShell, il suffit de créer un fichier ayant pour
extension .PS1 dans lequel vous allez copier votre code.
Exemple
Voici un fichier nommé ip.ps1
Ce script retourne l'adresse IP v4 de la machine locale et rend la main après une petite pause.
Exécution du script
En ligne de commande
En exécutant la commande suivante:
powershell c:\ip.ps1
192.168.1.1
Press any key to continue...
Les cmdlets peuvent êtres combinées à l’aide de pipe pour créer des fonctions
complètes.
Les cmdlets peuvent être réalisés avec n'importe quel langage .NET ou
directement à l'aide du langage de script MSH.
Les commandes ne sont pas basées sur du texte mais sur des objets (.NET en
l'occurrence) et les commandes sont extensibles.
Il est souvent possible d'utiliser des commandes raccourcies, par exemple 'help'
au lieu de 'get-help', nous verrons bientôt qu'il s'agit en réalité de commandes
alias.
Exemple d'utilisation
On peut bien entendu ajouter des arguments qui agissent sur l'affichage:
• get-service | Format-List
• get-service | Format-Table
• get-service | Format-Wide
• get-service | Format-Custom
• get-service | format-table name, Servicetype, Canshutdown
Par exemple:
Par exemple:
Powershell est capable d’utiliser des alias de commandes afin de raccourcir les
lignes de codes.
Les commandes habituelles Microsoft, telles que cd, rmdir, md, del, help, etc
fonctionnent parfaitement, cependant elles n'existent plus !
Pour lister l'ensemble des commandes alias, il faut utiliser la commande ' get-
alias'.
Exemples
get-process calc → ici, on recherche les processus dont le nom est 'calc'.
Le pipe (canalisation) permet d'établir une liaison entre deux commandes sous
la forme:
Exemple
Résultat:
On peut bien évidement combiner les commandes sur une seule ligne.
$a = Get-ChildItem fichier.txt; $a CreationTime ; $a. LastAccessTime
Tous les alias, fonctions et variables sont ajoutés par défaut à la session
courante.
• %windir%\system32\WindowsPowerShell\v1.0\profile.ps1
Ce profil s'applique à tous les utilisateurs et à tous les shells.
• %windir%\system32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
Ce profil s'applique à tous les utilisateurs, mais uniquement au Shell
Microsoft PowerShell.
• %UserProfile%\My Documents\WindowsPowerShell\profile.ps1
Ce profil s'applique uniquement à l'utilisateur en cours mais sur tous les
shells.
• %UserProfile
%\\MyDocuments\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Ce profil s'applique uniquement à l'utilisateur en cours mais uniquement
au Shell Microsoft PowerShell.
Les objets WMI sont rangés dans des classes et sont conçus pour permettre la
gestion des systèmes.
Avec les objet WMI, il est possible d'obtenir une multitude d’informations sur un
système, tel que la version du système d'exploitation installé, la quantité de
mémoire vive du poste, le type de processeur, …
Par exemple, il est facile d'interagir sur une application telle que Microsoft
Office, au travers de cmdlets PowerShell.
Pour pouvoir utiliser ces types d’objet, il faut créer une nouvelle instance de
l'objet à utiliser avec la commande 'New-object'.
La nouvelle instance de l’objet est stockée dans une variable sur laquelle on
pourra alors agir.
Cmdlet Description
Adds one or more service accounts to an Active
Add-ADComputerServiceAccount
Directory computer.
Adds users, computers, and groups to the
Allowed List or the Denied List of the read-only
Add-ADDomainControllerPasswordReplicationPolicy
domain controller (RODC) Password Replication
Policy (PRP).
Applies a fine-grained password policy to one
Add-ADFineGrainedPasswordPolicySubject
more users and groups.
Adds one or more members to an Active
Add-ADGroupMember
Directory group.
Adds a member to one or more Active Directory
Add-ADPrincipalGroupMembership
groups.
Clears the expiration date for an Active Directory
Clear-ADAccountExpiration
account.
Disable-ADAccount Disables an Active Directory account.
Disable-ADOptionalFeature Disables an Active Directory optional feature.
Enable-ADAccount Enables an Active Directory account.
Enable-ADOptionalFeature Enables an Active Directory optional feature.
Gets the Active Directory security groups that
Get-ADAccountAuthorizationGroup
contain an account.
Gets the resultant password replication policy for
Get-ADAccountResultantPasswordReplicationPolicy
an Active Directory account.
Get-ADComputer Gets one or more Active Directory computers.
Gets the service accounts that are hosted by an
Get-ADComputerServiceAccount
Active Directory computer.
Gets the default password policy for an Active
Get-ADDefaultDomainPasswordPolicy
Directory domain.
Get-ADDomain Gets an Active Directory domain.
Gets one or more Active Directory domain
Get-ADDomainController
controllers, based on discoverable services
Quest ActiveRoles Management Shell est un module PowerShell qui permet de gérer
un annuaire Active Directory.
Name : Microsoft.PowerShell.Diagnostics
PSVersion : 2.0
Description : This Windows PowerShell …
Name : Quest.ActiveRoles.ADManagement
PSVersion : 1.0
Description : This Windows PowerShell snap-in contains cmdlets to manage Active
Directory…
Add-PSSnapin Quest.ActiveRoles.ADManagement
Lister tous les comptes utilisateurs d’une OU et afficher uniquement les champs
SamAccountName (login) et LastlogonTimeStamp (date de dernier login) et exporter le
résultat sous forme d’un fichier CSV:
GivenName,Surname,SamAccountName
Pierre,Kiroul,pkiroul
Jean,Nemard,jnemard
Odile,Defrance,odefrance
Sam,Enerv,senerv
Paul,Auchon,pauchon
Voici un petit script permettant de créer les utilisateurs depuis le fichier CSV, ce
fichier est nommé 'addusr.ps1'.
Import-Module ActiveDirectory
$path = Split-Path -parent $MyInvocation.MyCommand.Definition
$ou = "DC=labo,DC=local"
$upnsuffix = "@labo.local"
$securepwd = ConvertTo-SecureString "0Poseidon" -AsPlainText -Force
Import-Csv "$path\adusers.csv" | New-ADUser `
-Name {$_.GivenName+" "+$_.Surname} -Path $ou `
-DisplayName {$_.GivenName+" "+$_.Surname} `
-UserPrincipalName {$_.SamAccountName+$upnsuffix} `
-AccountPassword $securepwd -Enabled $true
Pour fonctionner, il faut bien veiller à ce que les noms des colonnes du fichier
CSV correspondent parfaitement aux noms de paramètres de la commande.
Voici une autre version du script, utilisant Select-Object pour ajouter aux objets
retournés du CSV les attributs nécessaires pour New-ADUser.
Import-Module ActiveDirectory
$path = Split-Path -parent $MyInvocation.MyCommand.Definition
$ou = "OU=users,OU=demo,DC=demo1,DC=local"
$upnsuffix = "@demo1.local"
$securepwd = ConvertTo-SecureString "Pass/123" -AsPlainText -Force
Import-Csv "$path\adusers.csv" | Select-Object *,
@{Name="Name"; Expression={$_.GivenName+" "+$_.Surname}},
@{Name="Path"; Expression={$ou}},
@{Name="DisplayName"; Expression={$_.GivenName+" "+$_.Surname}},
@{Name="UserPrincipalName"; Expression={$_.SamAccountName+$upnsuffix}},
@{Name="AccountPassword"; Expression={$securepwd}},
@{Name="Enabled"; Expression={$true}} | New-ADUser
Créer un fichier html présentant la liste des services avec une coloration
verte ou rouge en fonction de leur état
get-service | ConvertTo-Html -Property Name,Status | foreach {
if ($_ -like "*<td>Running</td>*") {$_ -replace "<tr>", "<tr bgcolor=green>"}
else {$_ -replace "<tr>", "<tr bgcolor=red>"}} > .\get-service.html
$user | selectcn,displayname,givenName,sn,homeDirectory,sAMAccountName
On obtient ainsi:
cn : {Jean Nemard}
displayName : {Jean Nemard}
givenName : {Jean}
sn : {nemard}
homeDirectory : {\\srv-2k8\profile$\jnemard}
profilePath : {\\srv-2k8\profile$\jnemard}
sAMAccountName : {jnemard}
$user | select
cn,displayname,description,physicalDeliveryOfficeName,telephoneNumber,givenName,init
ials,sn,company,homeDrive,homeDirectory,profilePath,scriptPath,sAMAccountName,mail |
Export-Csv -NoTypeInformation c:\utilisateurs.csv
Get-Content traite les données lues du fichier comme un tableau, avec une ligne
par élément du tableau ($ligne commence à 0).
Dans l'exemple qui suit, on recherche et remplace le mot 'cherche' par le mot
'trouve', dans un fichier.
Afin de lister uniquement le lecteur et l'espace disque libre avec la classe WMI
win32_logicalDisk:
Get-WmiObject Win32_LogicalDisk | Select-Object -Property DeviceID, FreeSpace
On peut utiliser une requête qui s’intéresse uniquement aux disques fixes (non
amovibles):
Get-WmiObject Win32_LogicalDisk -Filter DriveType=3 | Select-Object -Property
DeviceID, FreeSpace
Une autre solution consiste à parcourir tous les objets retournés et à spécifier la
propriété retenue avec le descripteur $_.
Get-WmiObject Win32_LogicalDisk | ForEach-Object{$_. DeviceID+$_.FreeSpace
/ 1GB}
Exemple pour lister l'adresse MAC, l'adresse IP et les données DHCP avec la
classe WMI Win32_NetworkAdapterConfiguration :
Exemple, activation de DHCP sur la carte réseau d'index N°3 avec le descripteur
$_:
Get-WmiObject Win32_NetworkAdapterConfiguration -Filter index=3 | ForEach-
Object {$_.EnableDHCP()}
Grâce à une syntaxe particulière, il est possible d'obtenir une référence aux
objets Active Directory.
Obtenir une référence de l'utilisateur "jgautier" définit dans l'unité "users" afin
d'afficher son prénom :
$utilisateur=[ADSI]"LDAP://cn=jgautier,ou=users,dc=labo,dc=local"
$utilisateur.get("givenName")
Une fois qu'on a obtenu une référence à un objet conteneur (domaine, unité),
celui-ci possède une méthode create pour créer un nouvel élément.
Cet élément possède une méthode pour renseigner ses propriétés et une
méthode pour valider.
La méthode delete s'utilise comme la méthode create, mais sans la validation
setinfo.
Pour créer un utilisateur dans cette unité avec précision des nom et prénom.
$utilisateur=$organisation.create("user","cn=prof01")
$utilisateur.put("samaccountName","prof01")
$utilisateur.put("sn","Sanchez")
$utilisateur.put("givenName","Roger")
$utilisateur.setInfo()
Introduction
S'appuyant sur le programme de gestion à distance de Windows WinRM 2.0
(Windows Remote Management), PowerShell permet une gestion distante.
Connexion interactive
Sur l'ordinateur client, exécuter l'instruction :
'$session=New-PSSession –computername NomOrdinateur'
et utiliser la commande 'Enter-PSSession $session' pour se connecter de
manière interactive avec le poste distant.
Pour exécuter une commande sur l'ensemble des postes, il faut utiliser :
Invoke-Command –Scriptblock {cmd}
Exemple
Pour exécuter IPconfig sur chaque poste :
Invoke-Command –Scriptblock {ipconfig} –session $session
Par exemple, ajouter une passerelle par défaut sur un ensemble de postes
distants
Voici un script qui récupère des informations locales et permet d'afficher un texte
selon un état conditionnel.
Récupérer l'utilisateur
$user = [Environment]::UserName
Récupérer la date
$date = Get-Date -f "dd-MM-yyyy"
L'option –f a permet de spécifier un format d'affichage de la date.
Et notamment:
$data.Caption → OS
$data.OSArchitecture → Architecture système
$data.NumberOfProcesses → Nombre de processus en cours
$data.FreePhysicalMemory → Total de mémoire physique libre
$user = [Environment]::UserName
$date = Get-Date -f "dd-MM-yyyy"
$data = Get-WmiObject Win32_OperatingSystem
$share = Get-WmiObject Win32_Share
Write-Output ("")
Write-Output ("Bonjour " + $user + ", nous sommes le " + $date + ". l'
ordinateur fonctionne sous " + $data.Caption + $data.OSArchitecture.ToUpper()
+ ".")
Write-Output ("----------")
Write-Output ("Le système exécute " + $data.NumberOfProcesses + "
processus !")
if(($data.FreePhysicalMemory / 1024) -gt 512)
{
Write-Output ("La machine possède plus de 512 Mo de mémoire libre.")
}
else
{
Write-Output ("Il manque de mémoire vive")
}
Write-Output ("----------")
Write-Output ("Voici les différents partages présents sur la machine : ")
Write-Output ($share)
Par exemple:
$a="PowerShell est génial"
$a.length
Le système retournera la valeur '21'
Dans la variable a nous avons mis une chaîne de caractères et nous avons
récupéré sa longueur par length.
Par exemple:
$a.length *2
Le système retournera la valeur '42'
Autre exemple
La commande '(get-command).count'
Retourne la valeur '129' qui correspond au nombre de commandes
disponibles.
• Script/Parser : Traite les constructions du langage tels que les scripts, les
prédicats, les conditions, etc.
• Pipeline Processor : Gère les communications entre les cmdlet via des
pipes.
• Command Processor : Gère l'exécution des cmdlets, l'enregistrement et
les metadonnées associées.
• Session State : Gère les ensembles de données utilisés par un cmdlet lors
de son exécution.
• Error et Event Handler : Gère les exceptions et les événements.
• Extended Type System : Fournit une interface commune d’accès aux
propriétés, méthodes, etc indépendante du type d'objet sous-jacent.
Remoting (WMX): Web services for Management eXtension (WMX).