Vous êtes sur la page 1sur 35

Microsoft Windows PowerShell

Initiation, prise en main et exploitation

Présentation

Windows PowerShell est un puissant langage de script orienté objet développé


par Microsoft

PowerShell, souvent appelé 'ps' se présente sous la forme d'une interface en


ligne de commande.

Le nom de code de Powershell est 'Monad'.

Anciennement Microsoft Command Shell (MSH), la première version est sortie


en novembre 2006 et la version 2.01 est nativement intégré dans toutes les
version de Microsoft, depuis Windows 7.

PowerShell à pour but de remplacer les interfaces en ligne de commande issues


du DOS et de Windows NT ('command.com' et 'cmd.exe').

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.

En s'appuyant sur les composants du Framework '.NET' de Microsoft, les objets


COM et WMI, les échanges entre composants se font sous forme d'objets et non
pas de flux de texte à décomposer et à interpréter.

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.

Chaque logiciel Microsoft est souvent fourni avec un module d’administration


PowerShell.

PowerShell Initiation V14201 Doc Jean GAUTIER 1


La notion d'objet

Les objets sont constitués:

➢ 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.

En effet, il devient possible d’effectuer une action en une seule ligne là où il en


fallait plusieurs dizaines auparavant.

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'.

Si l'on prend l'exemple d'une voiture, on peut dire que :

1. c'est un objet type 'véhicule'


2. qu'elle possède des propriétés 'roues', 'moteur', 'carrosserie', …
3. qu'elle possède des méthodes telles que 'avancer', 'freiner', 'reculer',
accélérer', …

PowerShell Initiation V14201 Doc Jean GAUTIER 2


Caractéristiques

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.

Totalement intégré au système et offrant de très riches fonctionnalités avec un


haut niveau de sécurité, PowerShell reste néanmoins compatible avec les
précédents langage de scripting, notamment Microsoft Command Shell (MSH).

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.

PowerShell se base sur différents niveaux d'autorisation d'exécution.


Par exemple avec le niveau AllSigned, seuls les scripts disposant d'une
signature autorisée s'exécuteront.

Installation

Pour installer PowerShell, se reporter à la notice technique Microsoft, disponible


ici : http://support.microsoft.com/kb/968929

PowerShell Initiation V14201 Doc Jean GAUTIER 3


Modifier les paramètres de sécurité de Powershell

Afin de pouvoir exécuter un script sur une machine, en PowerShell, il faut en


avoir le droit.

La stratégie de sécurité de Windows PowerShell permet de déterminer si des


scripts peuvent s'exécuter et s'ils doivent inclure une signature numérique.

Par défaut, L’interpréteur Powershell bloquera l’exécution des script et nous


obtenons un message d'erreur quand on tente d’exécuter un script:
Impossible de charger le fichier C:\script.ps1, car l'exécution de scripts est
désactivée sur ce système. Pour plus d'informations, consultez « get-help
about_signing ». Au niveau de ligne : 1 Caractère : 16 + c:\extractad.ps1 <<<<

Il est donc nécessaire de modifier les paramètres de sécurité de PowerShell.

Dans la console de PowerShell, on affiche le mode de sécurité configuré:


Get-ExecutionPolicy

Nous obtiendrons l'information 'Restricted'

PowerShell propose 4 modes de sécurité :

1. Restricted → Aucun script autorisé


2. AllSigned → Seul les scripts "signés" fonctionnent
3. RemoteSigned → Les scripts internet doivent être "signés"
4. Unrestricted → Aucune limite pour l'exécution des scripts

Pour autoriser l'exécution de scripts non signés localement, le mode


'RemoteSigned' convient.

Pour passer dans le mode RemoteSigned, il suffit de saisir la commande:


Set-ExecutionPolicy RemoteSigned

PowerShell Initiation V14201 Doc Jean GAUTIER 4


Les scripts en PowerShell

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.

Créer un script Powershell

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

((ipconfig | findstr [0-9].\.)[0]).Split()[-1]


function Pause ($Message="Appuyez sur une touche pour quitter...")
{
Write-Host -NoNewLine $Message
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Write-Host ""}
Pause

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

Depuis l’interpréteur Powershell


Il est possible d’exécuter le script avec la commande suivante:
.\ip.ps1

Le résultat devrait être le même:

192.168.1.1
Press any key to continue...

PowerShell Initiation V14201 Doc Jean GAUTIER 5


Les commandes

PowerShell utilise de petites commandes simples, appelée ' cmdlet' pour


'command-applets'.

Les cmdlets peuvent êtres combinées à l’aide de pipe pour créer des fonctions
complètes.

Les commandes PowerShell sont toujours sous la forme ACTION-OBJET.


Elles sont composées d'un verbe (ou préfixe) et d'un nom, séparés par un tiret
et parfois suivis de paramètres.

• Le verbe indique l'action à réaliser (new, set, get, enable, disable,


remove, ...).
• Le nom indique l'objet sur lequel la cmdlet s'applique (Service, Mailbox,
MailBoxDatabase, ...).

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.

L'utilisation d'instructions structurées permet de mémoriser simplement un


grand nombre de commandes.

Les principales cmdlets (commandslets)

La commande 'get-command' permet d'afficher la liste complète des cmdlets


disponibles.

• Add permet d'ajouter des données ou informations


• Get permet d'obtenir des données ou informations

PowerShell Initiation V14201 Doc Jean GAUTIER 6


Obtenir de l'aide

La commande get-help permet d'obtenir l'aide général ou bien de l'aide sur


chaque commande.

La commande get-help get-help fournie l'aide de base sur la commande 'get-


help'.

La commande get-help get-command fournie l'aide de base sur la commande


'get-command'.

En ajoutant l'argument '-detailed' on obtient un degré de renseignement plus


détaillé et avec le paramètre '-full' c'est encore plus détaillé.

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

• Get-Help <nom de cmdlet> → fournit l'aide de base


• Get-Help <nom de cmdlet> -Detailed → fournit l'aide avancée
• Get-Help < nom de cmdlet> -full → fournit l'aide complète
• Get-Help < nom de cmdlet> -Examples → fournit des exemples d'utilisation

Quelques commandes diverses

La commande 'clear' efface la console


La commande 'history' affiche les dernières commandes utilisées
La commande 'Get-Service' renvoie la liste des objets de type 'services' de la
machine locale, avec états.
La commande 'Get-Process' affiche la liste des processus tournant sur la
machine locale.
La commande 'Get-Eventlog' affiche les informations du journal d’événement
local.
La commande 'Get-Service | Get-Member' liste les méthodes membres des
objets de type 'service'.

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

PowerShell Initiation V14201 Doc Jean GAUTIER 7


Les paramètres

Les arguments d'une cmdlet peuvent être indiqués de différentes manières.

Par exemple, la commande 'get-command' fournit des informations au sujet des


divers cmdlets disponibles.

La syntaxe générale d'une commande est:

get-command -Name [string] -Type [CommandTypes] -Verb [string] -


Noun [string]

-name' étant le premier paramètre, il est possible de l'omettre et indiquer


seulement la valeur.

Par exemple:

get-command -name cat est équivalent à get-command cat

Si on indique une série de valeurs sans désigner explicitement les paramètres,


Powershell associera automatiquement les valeurs aux désignations appropriées
dans l'ordre normal.

Par exemple:

Avec la commande → get-command A B C

Powershell associera A au nom, B au type et C au verbe.

PowerShell Initiation V14201 Doc Jean GAUTIER 8


Les alias de commandes

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 !

Ce sont des alias de commandes qui permettent d'utiliser les anciennes


commandes.

Par exemple, la commande 'dir' est en réalité la commande 'get-childitem'.

Pour lister l'ensemble des commandes alias, il faut utiliser la commande ' get-
alias'.

Il est également possible de créer de nouvelles commandes en utilisant la


commande 'Set-Alias', par exemple:

Set-Alias -Name affiche -Value get-ChildItem → créé une nouvelle commande


nommé 'affiche' qui liste les fichiers.

Exemples

• get-Alias dir → nous renseigne sur l'alias nommé 'dir'

• get-alias | where-object {$_.definition -eq "set-location"} → nous renseigne sur


les alias ayant pour définition 'set location'.

• set-alias aide get-help → créé un nouvel alias nommé 'aide' et équivalent à


la commande 'help'.

• set-alias calcul c:\windows\system32\calc.exe → créé un nouvel alias nommé


'calcul' et pointant sur la calculatrice de Windows.

• remove-item alias:calcul → retire et supprime la définition d'alias 'calcul'

PowerShell Initiation V14201 Doc Jean GAUTIER 9


Lister les processus

La commande 'get-process' permet d'afficher en colonne, la liste des processus


en cours de fonctionnement.

A l'aide de la souris, lançons la calculatrice qui installe le processus 'calc.exe'.

On peut désormais rechercher notre processus 'calc' et affiner notre recherche,


en spécifiant un processus en particulier.

get-process calc → ici, on recherche les processus dont le nom est 'calc'.

Améliorations et optimisation de commandes

L'utilisation du séparateur de commande 'pipe' va permettre de décupler les


possibilités de Powershell, en combinant des commandes entres elle, séparées
par des 'pipes'.

Le pipe (canalisation) permet d'établir une liaison entre deux commandes sous
la forme:

commande 1 | commande2 → la sortie de commande1 est envoyée vers


l'entrée de la commande2.

Exemple

Il est possible de modifier l'affichage vers un format ligne/ligne en utilisant le


caractère séparateur "pipe" associé au format 'liste'.

get-process | format-list → on affiche la liste des processus en lignes.


get-process | format-list | more → on affiche la liste des processus en lignes
avec un affichage page par page.

On peut également stopper n'importe quel processus en combinant plusieurs


commandes avec le caractère "pipe".

get-process calc | stop-process → le processus 'calc' est stoppé et la


calculatrice se ferme.

On peut également utiliser l'argument 'format-table' pour afficher le résultat


d'une commande, sous forme de tableau.

PowerShell Initiation V14201 Doc Jean GAUTIER 10


Détail du fonctionnement d'une commande

Soit la commande 'get-process calc | stop-process'

• La commande 'get-process calc' alimente une variable Powershell avec


un objet de type .NET.
• Le séparateur 'pipe' demande à Powershell de passer le résultat de la
première commande à la deuxième commande.
• La seconde commande 'stop-process' stoppe le processus.

La première commande sert à alimenter l'objet 'nom de d'objet', la deuxième


commande est l'action (le verbe) qui tue le processus.

Exemples d'utilisation du 'pipe'

La commande 'get-Command | Out-File -FilePath C:\temp\fichier' renvoie la liste


des commandes disponibles dans le fichier 'fichier' situé dans C:\temp.

La commande 'get-Command | foreach {write-host "$_ commande


PowerShell"}' va afficher toutes les commandes disponibles en ajoutant la
phrase 'commande PowerShell'.

Examen de la commande suivante:

get-Command | Foreach {Get-Help $_ -detailed |Out-File -FilePath C:\temp\$_.txt –


Encoding ASCII}

Cette commande se divise en trois étapes:

1. get-Command → liste l'ensemble des commandes


2. foreach {Get-Help $_ -detailed → fournit l'aide détaillé sur chaque
commande listée
3. Out-File -FilePath C:\temp\$_.txt –Encoding ASCII} → dirige le résultat dans
un fichier texte portant le nom chaque élément.

Résultat:

Pour chaque commande PowerShell, on extrait l’aide associée (au format


détaillé) et on l’envoie dans un fichier texte portant le nom de la
commande.

PowerShell Initiation V14201 Doc Jean GAUTIER 11


Puissance des commandes

Sous l'éditeur de commande 'standard' de Microsoft (command.com ou cmd), la


commande 'dir' retournerait quelque chose comme cela:

02/09/2013 14:10 15 fichier.txt

Il n'est pas possible de récupérer uniquement la taille du fichier ou bien la date


de création ou encore, la date de dernière modification.

Avec powershell, en une seule commande, il est possible de le faire:

$a = Get-ChildItem fichier.txt; $a.length


15

Pour obtenir la date de création du fichier


$a = Get-ChildItem fichier.txt; $a.CreationTime

Pour obtenir la date de dernière modification


$a = Get-ChildItem fichier.txt; $a.LastAccessTime

On peut bien évidement combiner les commandes sur une seule ligne.
$a = Get-ChildItem fichier.txt; $a CreationTime ; $a. LastAccessTime

PowerShell Initiation V14201 Doc Jean GAUTIER 12


Définition de profiles

Tous les alias, fonctions et variables sont ajoutés par défaut à la session
courante.

Afin de maintenir les changements de manière permanente, il suffit de les


ajouter à votre profil en éditant l'un des fichiers suivants :

• %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.

PowerShell Initiation V14201 Doc Jean GAUTIER 13


Manipulation de services

Grâce à PowerShell, il est possible de manipuler des objets de type WMI


(Windows Management Instrumentation) et de type COM (Component Object
Model) .

Les objets WMI

Les objets WMI sont rangés dans des classes et sont conçus pour permettre la
gestion des systèmes.

Une classe regroupe l'ensemble des méthodes et propriétés s'appliquant à


l’objet.

Pour lister toutes les classes d'objets WMI, on utilise la commande


'Get-WmiObject –List'

Get-WmiObject -List -ComputerName pc → liste les objets WMI de la machine 'pc'


Get-WmiObject -List -ComputerName 10.0.0.1 → produit le même effet

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, …

Get-WmiObject -List | Select-String "networkadapter" → sélectionne un type


d'objet particulier

Les objets COM

Les objets COM étendent l’utilisation de PowerShell à toutes les applications


disposant d’API (Application Programming Interface) COM.

Par exemple, il est facile d'interagir sur une application telle que Microsoft
Office, au travers de cmdlets PowerShell.

Exemple d'utilisation de WMI

La fonction 'get-WmiObject' Win32_cacheMemory permet de connaître la quantité


de mémoire cache du système local.

La commande complète est la suivante:


Get-WmiObject -Class Win32_CacheMemory -Namespace root/cimv2 -ComputerName . |
Format-Table -Property name,purpose, installedsize

PowerShell Initiation V14201 Doc Jean GAUTIER 14


Les Objets .NET et COM

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.

La commande suivante permet de lister les catégories d’objets COM disponibles.


dir REGISTRY::HKEY_CLASSES_ROOT\CLSID -include PROGID -recurse | foreach
{$_.GetValue("")}

Exemple de création d'un nouvel objet:

$ xls = New-Object -ComObject Excel.Application → créé un objet nommé 'xls'


$xls .Visible = $true → permet de rendre visible l'objet en modifiant sa propriété
'visible'
New-Object -ComObject Excel.Application | Get-Member → permet de voir l'objet avec
ses méthodes et propriétés.

Pour manipuler l'objet, on sépare le nom de l’objet de sa méthode ou de sa


propriété par un point.

$xls.Workbooks.add() → ajoute un nouveau classeur.


$xls.ActiveWorkbook.SaveAs("C:\temp\classeur.xls") → sauvegarde le nouveau
classeur sous le nom classeur, dans le dossier C:\temp

Exemple d'utilisation d'objets:

Get-WmiObject win32_bios -computername 127.0.0.1


Get-WmiObject -Class Win32_OperatingSystem -ComputerName 127.0.0.1

PowerShell Initiation V14201 Doc Jean GAUTIER 15


Utilisation de Powershell avec ADDS

Il existe un module dédié aux fonctionnalités de gestion de Active Directory.


Ce module est à charger pour pouvoir être exploité.

Il est intéressant d’utiliser le module Powershell Active Directory pour assurer


diverses tâches d'administration et de configuration des services Active
Directory.

On peut utiliser le module Active Directory pour gérer les utilisateurs,


ordinateurs et unités d'organisation Active Directory, au sein de domaines,
arborescences de domaines, U.O et forêts.

Un certain nombre de cmdlet dédiées sont disponibles, en voici la liste (en


Anglais)

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

PowerShell Initiation V14201 Doc Jean GAUTIER 16


criteria, search parameters, or by providing a
domain controller identifier, such as the NetBIOS
name.
Gets the members of the Allowed List or the
Get-ADDomainControllerPasswordReplicationP olicy
Denied List of the RODC PRP.
Get- Gets the resultant password policy of the
ADDomainControllerPasswordReplicationPolicyUsage specified ADAccount on the specified RODC.
Gets one or more Active Directory fine-grained
Get-ADFineGrainedPasswordPolicy
password policies.
Gets the users and groups to which a fine-
Get-ADFineGrainedPasswordPolicySubject
grained password policy is applied.
Get-ADForest Gets an Active Directory forest.
Get-ADGroup Gets one or more Active Directory groups.
Get-ADGroupMember Gets the members of an Active Directory group.
Get-ADObject Gets one or more Active Directory objects.
Gets one or more Active Directory optional
Get-ADOptionalFeature
features.
Get-ADOrganizationalUnit Gets one or more Active Directory OUs.
Gets the Active Directory groups that have a
Get-ADPrincipalGroupMembership
specified user, computer, or group.
Gets the root of a domain controller information
Get-ADRootDSE
tree.
Gets one or more Active Directory service
Get-ADServiceAccount
accounts.
Get-ADUser Gets one or more Active Directory users.
Get-ADUserResultantPasswordPolicy Gets the resultant password policy for a user.
Installs an Active Directory service account on a
Install-ADServiceAccount
computer.
Moves a domain controller in AD DS to a new
Move-ADDirectoryServer
site.
Moves operation master (also known as flexible
Move-ADDirectoryServerOperationMasterRole single master operations or FSMO) roles to an
Active Directory domain controller.
Moves an Active Directory object or a container
Move-ADObject
of objects to a different container or domain.
New-ADComputer Creates a new Active Directory computer.
Creates a new Active Directory fine-grained
New-ADFineGrainedPasswordPolicy
password policy.
New-ADGroup Creates an Active Directory group.
New-ADObject Creates an Active Directory object.
New-ADOrganizationalUnit Creates a new Active Directory OU.
New-ADServiceAccount Creates a new Active Directory service account.
New-ADUser Creates a new Active Directory user.
Remove-ADComputer Removes an Active Directory computer.
Removes one or more service accounts from a
Remove-ADComputerServiceAccount
computer.
Remove- Removes users, computers, and groups from the
ADDomainControllerPasswordReplicationPolicy Allowed List or the Denied List of the RODC PRP.
Removes an Active Directory fine-grained
Remove-ADFineGrainedPasswordPolicy
password policy.
Removes one or more users from a fine-grained
Remove-ADFineGrainedPasswordPolicySubject
password policy.

PowerShell Initiation V14201 Doc Jean GAUTIER 17


Remove-ADGroup Removes an Active Directory group.
Removes one or more members from an Active
Remove-ADGroupMember
Directory group.
Remove-ADObject Removes an Active Directory object.
Remove-ADOrganizationalUnit Removes an Active Directory OU.
Removes a member from one or more Active
Remove-ADPrincipalGroupMembership
Directory groups.
Remove-ADServiceAccount Removes an Active Directory service account.
Remove-ADUser Removes an Active Directory user.
Rename-ADObject Changes the name of an Active Directory object.
Resets the service account password for a
Reset-ADServiceAccountPassword
computer.
Restore-ADObject Restores an Active Directory object.
Gets Active Directory user, computer, and
Search-ADAccount
service accounts.
Modifies user account control (UAC) values for an
Set-ADAccountControl
Active Directory account.
Sets the expiration date for an Active Directory
Set-ADAccountExpiration
account.
Modifies the password of an Active Directory
Set-ADAccountPassword
account.
Set-ADComputer Modifies an Active Directory computer.
Modifies the default password policy for an Active
Set-ADDefaultDomainPasswordPolicy
Directory domain.
Set-ADDomain Modifies an Active Directory domain.
Sets the domain functional level for an Active
Set-ADDomainMode
Directory domain.
Modifies an Active Directory fine-grained
Set-ADFineGrainedPasswordPolicy
password policy.
Set-ADForest Modifies an Active Directory forest.
Sets the forest mode for an Active Directory
Set-ADForestMode
forest.
Set-ADGroup Modifies an Active Directory group.
Set-ADObject Modifies an Active Directory object.
Set-ADOrganizationalUnit Modifies an Active Directory OU.
Set-ADServiceAccount Modifies an Active Directory service account.
Set-ADUser Modifies an Active Directory user.
Uninstalls an Active Directory service account
Uninstall-ADServiceAccount
from a computer.
Unlock-ADAccount Unlocks an Active Directory account.

PowerShell Initiation V14201 Doc Jean GAUTIER 18


Administration ADS (Active Directory Services)
Quelques exemples d'utilisation de PowerShell dans un environnement
Active Directory

Exporter la liste de tous les utilisateurs de l’OU Utilisateurs

La commande Export-CSV permet d’exporter les résultats d’une commande


PowerShell sous forme de fichier CSV.

Get-QADUser -SearchRoot ''OU=Utilisateurs,DC=labo,DC=local'' | Select-Object


SamAccountName,Description,Company | Export-Csv -Path c:\export.csv -
UseCulture -Encoding UTF8

Administrer Active Directory avec Quest ActiveRoles Management Shell

Quest ActiveRoles Management Shell est un module PowerShell qui permet de gérer
un annuaire Active Directory.

La commande Get-PSSnapin renvoie la liste des modules PowerShell:

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…

Il est possible de charger le module PowerShell Quest manuellement en tapant la


commande :

Add-PSSnapin Quest.ActiveRoles.ADManagement

Lister des comptes utilisateurs

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:

Get-QADUser -SearchRoot « OU=Utilisateurs,DC=TPHAT,DC=INTRA » | Select-Object


SamAccountName, LastLogonTimeStamp | Export-Csv -Path c:\resultat.csv -UseCulture -
Encoding UTF8

Pour supprimer un objet (groupe / compte utilisateur)

Get-QADUser -SearchRoot ''Ou=Utilisateurs,DC=labo,dc=local'' | Remove-QADObject –


Force

PowerShell Initiation V14201 Doc Jean GAUTIER 19


Création de comptes

Comment alimenter les comptes d'utilisateurs Active Directory à partir d'un


fichier au format CSV (Comma Separated Values).

La commande New-ADUser permet de créer des comptes sans mot de passe,


désactivés par défaut.

Voici un fichier CSV contenant quelques utilisateurs

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

PowerShell Initiation V14201 Doc Jean GAUTIER 20


Manipulations diverses avec PowerShell

Afficher la liste des 10 plus gros fichier d’un dossier :


get-childitem | sort-item length | select-object -last 10

Afficher la liste des 5 process qui consoment les plus de CPU :


get-process | sort-object CPU | select-object -last 5

Supprimer les fichiers dont la taille est supérieure à 1000000 octets


get-childitem | where-object { $_.length -gt 1000000 } | foreach-object {remove-
item $_.fullname}

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

Afficher sous la forme d’une table, les informations d’espace disponible et


total d’un disque dur, en nomant la colonne et en présentant un résultat
calculé
get-wmiobject -class win32_logicaldisk |where-object {$_.drivetype -eq 3}|
format-table name, @{label="freespace Mb";Expression={$_.freespace /
1024/1024}}, @{label="TotalSize Mb";Expression={$_.size / 1024/1024}}-
autosize

Regrouper des fichiers dans des dossiers en fonction de leur extension


new-psdrive -name fk -psprovider filesystem –root c:\demos\files
cd fk:\
get-childitem | select-object extension | sort-object extension -unique | foreach-
object {new-item (".\New" + $_.extension) -type directory}
get-childitem | where-object {$_.mode -notmatch "d"} | foreach-object {$b= ".\
New" + $_.extension; move-item $_.fullname $b}

Récupérer les propriétés d’un utilisateur


Il suffit d’écrire dans une variable $user, toutes les propriétés Active Directory
de l’utilisateur Jean nemard, situé dans l’OU 'Utilisateurs' du domaine
'labo.local', situé sur le serveur Active Directory 'srv-2k8'.

$user = New-Object DirectoryServices.DirectoryEntry('LDAP://srv-2k8/cn=Jean


nemard,ou=Utilisateurs,dc=labo,dc=local').

PowerShell Initiation V14201 Doc Jean GAUTIER 21


PowerShell Initiation V14201 Doc Jean GAUTIER 22
Je peux alors afficher la contenu de la variable $user en entrant:
$user

Ce qui renvoie le résultat suivant:


distinguishedName
-----------------
{CN=Jean nemard,OU=Utilisateurs,dc=labo,dc=local}

Le système n'affiche que la première valeur de la variable $user.

Pour afficher l'ensemble des propriétés de l’utilisateur


$user | fl *

Filtrer les propriétés à afficher


Il est possible, en jouant sur les paramètres, de filtrer uniquement les propriétés
qui nous intéresse grâce à la commande select.

$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}

Exporter les informations vers un fichier .CSV


Pour exporter l'ensemble des informations vers un fichier CSV, nommé
'utilisateurs.csv':

$user | select
cn,displayname,description,physicalDeliveryOfficeName,telephoneNumber,givenName,init
ials,sn,company,homeDrive,homeDirectory,profilePath,scriptPath,sAMAccountName,mail |
Export-Csv -NoTypeInformation c:\utilisateurs.csv

PowerShell Initiation V14201 Doc Jean GAUTIER 23


Afficher le numéro de série d'une machine distante

Ouvrez l’interpréteur Powershell et exécutez le code script suivant:


Get-WmiObject -Class Win32_BIOS -NameSpace "root\CIMV2" -ComputerName
[Nom_Ordinateur]

Où [Nom_Ordinateur] doit être remplacé par le nom de la machine Windows


distante.

Manipulation de services en local et à distance

Connaître l’état de fonctionnement d’un service


Pour connaître dans quel état se trouve un service:
Get-Service "Client DNS"

Redémarrer un service local


Par exemple, le service redémarre ici le service Client DNS

Restart-Service "Client DNS"

Pour certains services il est nécessaire de forcer le redémarrage en


ajoutant le paramètre -force
Restart-Service spooler -force

Redémarrer un service sur un serveur distant


Pour redémarrer un service d’un serveur distant il est nécessaire d’utiliser
la commande Invoke-Command.
Invoke-Command {Restart-Service "Client DNS" -passthru} -
ComputerName "NomDuServeur"

PowerShell Initiation V14201 Doc Jean GAUTIER 24


Récupération d'information systèmes
Get-WmiObject est la commande qui permet de collecter les informations sur un
ordinateur distant ou local.

La commande suivante retourne des informations sur l'OS de l'ordinateur 'pc' :


Get-WmiObject Win32_OperatingSystem -ComputerName pc

La commande suivante retourne les adresses MAC des interfaces de l'ordinateur


nommé 'pc' :
Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName pc|
ForEach-Object {$_.MACAddress}

Manipulation sur les données

La commande Get-Content permet de lire les données d'un fichier.


Get-Content c:\temp\fichier.txt

Get-Content traite les données lues du fichier comme un tableau, avec une ligne
par élément du tableau ($ligne commence à 0).

Lecture de la deuxième ligne du fichier (indice 1 du tableau)


$ligne=Get-Content c:\temp\fichier.txt; $ligne[1] → lit la deuxième ligne
du fichier
(Get-Content C:\temp\fichier.txt)[1]

Parcourir un fichier pour afficher une information contenue dans la ligne :


ForEach($ligne in Get-Content c:\temp\fichier.txt) {$mot=$ligne.split("/");
$mot[0]}

Lire tous les fichier .txt


Get-ChildItem c:\temp\*.txt | ForEach-Object {foreach($ligne in Get-Content $_)
{$ligne}}

La commande Add-Content permet d'ajouter du texte dans un fichier.


Add-Content C:\temp\fichier.txt "bonjour à tous"

La commande Clear-Content permet de vider un fichier.


Clear-Content C:\temp\fichier.txt

La commande Out-File permet de rediriger le résultat d'un pipeline vers un


fichier texte.
Il est également possible d'utiliser les redirecteurs (> et >>).
ipconfig | findstr "Adresse" | Out-File c:\temp\fichier2.txt
ipconfig | findstr "Adresse" > c:\temp\fichier2.txt

PowerShell Initiation V14201 Doc Jean GAUTIER 25


Export-Csv permet de générer un fichier de données séparées par une virgule.
Export-Clixml permet de créer un fichier de données au format XML.
Get-Process | Export-Clixml c:\temp\process.xml

Dans l'exemple qui suit, on recherche et remplace le mot 'cherche' par le mot
'trouve', dans un fichier.

Le fichier est ré-écrit à la volée grâce à la fonction 'Set-Content' qui écrase le


fichier d'origine.
Les () autour de Get-Content assurent que la commande est terminée avant la
commande Set-Content qui accède au même fichier.

(Get-Content c:\temp\test3.txt) | ForEach-object {$_ -replace "cherche",


"trouve"} | Set-Content c:\temp\fichier3.txt

La commande Get-Member permet de consulter la liste des propriétés et


méthodes d'une classe spécifiée.
Get-WmiObject win32_networkadapterconfiguration | Get-Member

Lister des propriétés particulières


Il est possible de réduire les propriétés à lister avec la commande Select-Object
et le paramètre –Property.

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 :

Get-WmiObject Win32_NetworkAdapterConfiguration -Filter IPEnabled=True |


Select-Object -Property MACAddress, IPAddress, DHCP*

PowerShell Initiation V14201 Doc Jean GAUTIER 26


Modifier la configuration d'un poste

Il faut utiliser une méthode de la classe WMI concernée.

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()}

Affectation d'une adresse IP sur la carte réseau d'index N°3 :


Get-WmiObject Win32_NetworkAdapterConfiguration -Filter index=3 | ForEach-
Object {$_.EnableStatic('192.168.1.1','255.255.255.0')}

Affecter toutes les cartes réseaux (avec IP activé) au domaine 'labo.local" :


Get-WmiObject Win32_NetworkAdapterConfiguration -Filter IPEnabled=true |
ForEach-Object {$_.SetDNSDomain("labo.local")}

Et pourquoi ne pas faire un test vers le poste d'adresse 192.168.1.1, c'est OK si


le StatusCode retourné est égal à 0 :

Get-WmiObject Win32_PingStatus -Filter "address='192.168.1.1'" | Select-Object -


Property StatusCode

PowerShell Initiation V14201 Doc Jean GAUTIER 27


Administration d'Active Directory via ADSI

La méthode ADSI (Active Directory Services Interface)

Dans PowerShell, le mode de fonctionnement d'ADSI est similaire à celui de


WMI.

Grâce à une syntaxe particulière, il est possible d'obtenir une référence aux
objets Active Directory.

Exemple, obtenir une référence au domaine Active Directory "labo.local" :


$domaine=[ADSI]"LDAP://dc=labo,dc=local"
ou bien $domaine.Children=[ADSI]"LDAP://dc=labo,dc=local"

Pour obtenir une référence à l'unité d'organisation nommée "users" du même


domaine :
$organisation=[ADSI]"LDAP://ou=users,dc=labo,dc=local"

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")

Création d'unité d'organisation, d'utilisateur et de groupe via ADSI

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 l'unité nommée 'users' avec renseignement de la propriété


description:
$domaine=[ADSI]"LDAP://dc=labo,dc=local"
$organisation=$domaine.create("organizationalUnit","ou=users")
$organisation.put("description", "test")
$organisation.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()

PowerShell Initiation V140201 Doc Jean GAUTIER 28


Création d'un groupe dans l'unité d'organisation et ajout de
l'utilisateur jean à ce groupe.
$groupe=$organisation.create("group","cn=jean")
$groupe.put("samaccountName","jean")
$groupe.setinfo()
$groupe.member.add($utilisateur.get("distinguishedName"))
$groupe.setinfo()

Modifier la valeur d'une propriété


La modification peut être réalisée directement, sans la méthode Put.
$utilisateur=[ADSI]"LDAP://cn=toto,ou=users,dc=labo,dc=local"
$utilisateur.givenName="stagiaire"
$utilisateur.setInfo()

PowerShell Initiation V140201 Doc Jean GAUTIER 29


Accès distant avec PowerShell

Introduction
S'appuyant sur le programme de gestion à distance de Windows WinRM 2.0
(Windows Remote Management), PowerShell permet une gestion distante.

Avec WinRm, il est possible d'exécuter des commandes sur un ou plusieurs


ordinateurs distants à partir d'un seul ordinateur.

Démarrer le service WinRM


Sur les ordinateurs distants (serveurs), il faut utiliser la commande Enable-
PSRemoting pour démarrer le service WinRM.

WinRm utilise Kerberos par défaut pour l'authentification.


Quand Kerberos n'est pas disponible, WinRM utilise un transport HTTPS basé sur
un certificat SSL installé sur le poste distant.

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.

La commande 'Exit-PSSession' permet de quitter la console distante et revenir à


la console locale.

Il est possible de spécifier un nom d'utilisateur pour les sessions avec le


paramètre '–Credential'

$session=New-PSSession –computername NomOrdinateur -Credential Labo\


administrateur

Accès à distance vers plusieurs machines


L'accès à distance de PowerShell permet aussi d'exécuter des commandes
simultanément sur plusieurs ordinateurs distants.

Il suffit de spécifier la liste des ordinateurs concernés avec le paramètre


'–computername NomOrdi1,NomOrdi2,NomOrdi3' ou à l'aide d'un fichier
contenant la liste des machines.
$session=New-PSSession –computername (Get-Content c:\listePC.txt)

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

PowerShell Initiation V140201 Doc Jean GAUTIER 30


En général, on crée une session uniquement lorsqu'on exécute une série de
commandes sur l'ordinateur distant.

On peut par défaut, exécuter 32 commandes simultanées mais on peut modifier


cette valeur avec le paramètre '–throttlimit'.

Il est même possible d'utiliser Invoke-Command sans avoir de session ouverte.


Dans ce cas, en spécifiant directement la liste des postes avec –computername,
les sessions s'ouvrent au début et se ferment après l'exécution.

Invoke-Command –Scriptblock {ipconfig} –computername


NomOrdi1,NomOrdi2,NomOrdi

Exécuter un script local sur un poste distant :


Invoke-Command -filepath c:\script.ps1 -computerName pc-distant

Placer les tâches en arrière plan


L'exécution des commandes peut prendre du temps, même si elles s'exécutent
de manière simultanée sur tous les postes.
Dans ce cas, il est possible de laisser l'interface de commandes fonctionner en
arrière plan avec le paramètre –AsJob.

Invoke-Command –Scriptblock {ipconfig} –computername NomOrdi1,NomOrdi2 -


AsJob

Par exemple, ajouter une passerelle par défaut sur un ensemble de postes
distants

Invoke-Command –Scriptblock {route add 0.0.0.0; mask 0.0.0.0 192.168.1.253} –


computername pc1, pc2, pc3, pc4, pc5 -AsJob

PowerShell Initiation V140201 Doc Jean GAUTIER 31


Exemple de script simple

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.

Récupérer les informations système


$data = Get-WmiObject Win32_OperatingSystem

L'objet $data contient désormais la plupart des informations du système.

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

Récupérer les informations sur les partages réseaux


$share = Get-WmiObject Win32_Share

Affichage des données


Pour l'affichage des données, une seule petite astuce concernant la
concaténation avec l'opérateur +, la syntaxe est la suivante :
("Bonjour " + $nom + " ! Comment allez-vous ?")

PowerShell Initiation V140201 Doc Jean GAUTIER 32


Ce qui donne le script suivant:

$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)

PowerShell Initiation V140201 Doc Jean GAUTIER 33


Utilisation des variables

PowerShell permet de manipuler des variables.

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.

Ensuite nous pouvons tout mélanger, c'est-à-dire des expressions et des


commandes.

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.

En précisant un chemin et un type de commandes :


cd c:\
(get-command *.exe).count
Retourne la valeur '410' qui correspond au nombre de commandes 'exe'
disponibles.

PowerShell Initiation V140201 Doc Jean GAUTIER 34


Architecture de Microsoft Windows PowerShell

Le shell Monad (msh.exe) : Ligne de commande basé-caractères hébergée par le


moteur de Monad.

Le moteur de Monad (msh.dll) :

• 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).

PowerShell Initiation V140201 Doc Jean GAUTIER 35

Vous aimerez peut-être aussi