Powershell

De Linuxmemo.

(Différences entre les versions)
(Un shell a distance)
 
(35 versions intermédiaires masquées)
Ligne 1 : Ligne 1 :
[[Catégorie:Windows_sysadmin]]
[[Catégorie:Windows_sysadmin]]
 +
[[Catégorie:PowerShell]]
 +
==Avoir de l'aide==
 +
 +
*sur une commande
 +
Get-Help commande
 +
Get-Help commande -examples
 +
Get-Help commande -detailed
 +
Get-Help commande -full
 +
ou
 +
help commande
 +
 +
*liste des commandes
 +
Get-Command
 +
Get-Command -verb Get
 +
Get-Command -noun Service
 +
Get-Command -commandType alias
 +
Get-Command Get-*
 +
Get-Command *-Service
 +
Get-Verb
 +
 +
*lister tout les propriétés et méthodes d'un objet
 +
$maVariable | Get-Member
 +
$maVariable | Get-Member -MemberType Method
 +
$maVariable | Get-Member -MemberType Property
 +
$maVariable | Get-Member -MemberType Property CreateTime
 +
Get-ItemProperty
 +
appel méthode
 +
$maVariable.ToUpper()
 +
 +
*lister les Provider
 +
Get-PsProvider
 +
 +
*Listage des classes WMI
 +
Get-WmiObject –List
 +
$i=0;Get-WmiObject -list | foreach{$i=$i+1} ; Write-Host "Il y a $i membre(s)"
 +
 +
*Connaitre sa version de PowerShell
 +
$host.version
 +
$PSVersionTable
 +
==Script (exécution, mode de sécurité)==
==Script (exécution, mode de sécurité)==
*fichier ayant pour extension .PS1
*fichier ayant pour extension .PS1
Ligne 25 : Ligne 65 :
Affichage des propriétés sous forme de liste
Affichage des propriétés sous forme de liste
  Get-ChildItem | Format-List
  Get-ChildItem | Format-List
 +
  ou toutes les propriétés
  ou toutes les propriétés
  Get-ChildItem | Format-List *
  Get-ChildItem | Format-List *
-
  Get-ChildItem | Format-List -Property name, length
+
 +
ou juste les propriétés name et lenght
 +
  Get-ChildItem | '''Format-List -Property''' name, length
 +
  ou une seul propriété
  ou une seul propriété
  (Get-ChildItem nomfichier).CreationTime
  (Get-ChildItem nomfichier).CreationTime
Ligne 36 : Ligne 80 :
Affichage personnalisé des propriétés
Affichage personnalisé des propriétés
  Get-ChildItem | Format-Custom
  Get-ChildItem | Format-Custom
-
 
-
===Appel des méthodes===
 
-
 
-
$a = 12
 
-
$a.GetType()
 
-
Int32
 
===Filtres===
===Filtres===
-
*wc = Measure-Object
+
*wc = '''Measure-Object'''
  Get-Command | Measure-Object
  Get-Command | Measure-Object
-
*grep = Select-String
+
*grep = '''Select-String'''
 +
 
 +
*grep sur les méthodes et les propriétés =  '''Where-Object méthodes/propriétés -eq quelquechose'''
 +
Get-service |''' Where-Object status -eq Stopped'''
-
*Where-Object
+
*'''Select-Object''' (select)
-
  Get-service | Where-Object {$_.status -eq 'Stopped'}
+
  Get-WmiObject win32_userprofile | Select-Object LocalPath
===Guillemets===
===Guillemets===
Ligne 71 : Ligne 112 :
`r = retour chariot
`r = retour chariot
...
...
 +
 +
===Appel des méthodes===
 +
$a = 12
 +
$a.GetType()
 +
Int32
===Valeur de propriétés===
===Valeur de propriétés===
Ligne 79 : Ligne 125 :
  Taille du fichier config.sys : 10 octets
  Taille du fichier config.sys : 10 octets
-
==Avoir de l'aide==
+
===Opérateurs de comparaisons===
 +
Les opérateurs de comparaison pour le shell, par défaut, ne sont pas sensibles à la casse lors de la comparaison des chaînes :
 +
'''-eq    Equal (case insensitive)'''
 +
-ne    Not equal (case insensitive)
 +
-ge    Greater than or equal (case insensitive)
 +
-gt    Greater than (case insensitive)
 +
-lt    Less than (case insensitive)
 +
-le    Less than or equal (case insensitive)
 +
'''-like    Wildcard comparison (case insensitive)'''
 +
-notlike    Wildcard comparison (case insensitive)
 +
'''-match      Regular expression comparison (case insensitive)'''
 +
-notmatch        Regular expression comparison (case insensitive)
 +
-replace        Replace operator (case insensitive)
 +
-contains        Containment operator (case insensitive)
 +
-notcontains      Containment operator (case insensitive)
-
*sur un commande
+
-ieq      Case insensitive equal
-
  Get-Help commande
+
  -ine      Case insensitive not equal
-
  Get-Help commande -examples
+
  -ige      Case insensitive greater than or equal
-
  Get-Help commande -detailed
+
-igt      Case insensitive greater than
-
  Get-Help commande -full
+
  -ile        Case insensitive less than or equal
-
  ou
+
-ilt        Case insensitive less than
-
  help commande
+
  -ilike        Case insensitive equal
 +
-inotlike        Case insensitive equal
 +
  -imatch        Case insensitive regular expression comparison
 +
  -inotmatch        Case insensitive regular expression comparison
 +
-ireplace        Case insensitive replace operator
 +
-icontains        Case insensitive containment operator
 +
-inotcontains          Case insensitive containment operator
-
*liste des commandes
+
-ceq      Equal (case sensitive)
-
  Get-Command
+
-cne        Not equal (case sensitive)
 +
-cge        Greater than or equal (case sensitive)
 +
-cgt        Greater than (case sensitive)
 +
-clt        Less than (case sensitive)
 +
-cle        Less than or equal (case sensitive)
 +
-clike          Wildcard comparison (case sensitive)
 +
-cnotlike        Wildcard comparison (case sensitive)
 +
-cmatch          Regular expression comparison (case sensitive)
 +
-cnotmatch          Regular expression comparison (case sensitive)
 +
-creplace            Replace operator (case sensitive)
 +
-ccontains            Containment operator (case sensitive)
 +
  -cnotcontains            Containment operator (case sensitive)
-
*lister tout les propriétés et méthodes d'un objet
+
  -is          Is of a type
-
  $maVariable | Get-Member
+
  -isnot        Is not of a type
-
  Get-ItemProperty
+
  -as        As a type, no error if conversion fails
-
  appel méthode
+
-
$maVariable.ToUpper()
+
-
 
+
-
*Listage des classes WMI
+
-
Get-WmiObject –List
+
-
$i=0;Get-WmiObject -list | foreach{$i=$i+1} ; Write-Host "Il y a $i membre(s)"
+
-
 
+
-
*Connaitre sa version de PowerShell
+
-
$host.version
+
-
$PSVersionTable
+
==Les profiles==
==Les profiles==
Ligne 119 : Ligne 186 :
%windir%\system32\WindowsPowerShell\v1.0\ Microsoft.PowerShell_profile.ps1
%windir%\system32\WindowsPowerShell\v1.0\ Microsoft.PowerShell_profile.ps1
 +
 +
*fichier profile pour commande automatique au lancement du shell
 +
notepad $profile
 +
Import-Module nommodule
 +
start-transcript
 +
...
==Vocabulaire==
==Vocabulaire==
Ligne 189 : Ligne 262 :
  [[Winrm]]
  [[Winrm]]
-
  Enter-PSSession -computer Server01 -port 5985 -credential domain01\user01
+
  Enter-PSSession -computer '''NOMMACHINE''' -port '''5985''' -credential domain01\user01
  Alias: etsn
  Alias: etsn
* déactivation du shell a distance
* déactivation du shell a distance
  Disable-PSRemoting
  Disable-PSRemoting
-
*commandes utiles
+
==commandes utiles==
-
  Get-Process
+
  Get-Process, Start-Process, Stop-Process, Wait-Process, Debug-Process
  Get-Service
  Get-Service
  Get-EventLog
  Get-EventLog
Ligne 207 : Ligne 280 :
  Set-Service
  Set-Service
  Get-WinEvent
  Get-WinEvent
-
  Get-WmiObject
+
  Get-WmiObject, Get-WmiObject -List, Get-WmiObject -List | Where-Object { $_.name -match 'disk'}, '''Get-WmiObject win32_computersystem'''
==les Objets (Outils intégrés)==
==les Objets (Outils intégrés)==
Ligne 215 : Ligne 288 :
*utilitaires:
*utilitaires:
  fsutil,etc...
  fsutil,etc...
-
*Tout les objet .net
+
*Tout les objet .NET http://technet.microsoft.com/fr-fr/library/dd347574.aspx
 +
New-Object -TypeName System.Diagnostics.EventLog
 +
New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
 +
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
 +
$AppLog | Get-Member -MemberType Method
 +
$AppLog.Clear()
 +
$AppLog
 +
Méthodes statiques:
  [espace de nom. <type .net>]::<Membre-statique>
  [espace de nom. <type .net>]::<Membre-statique>
  [System.DateTime]::Now
  [System.DateTime]::Now
http://msdn.microsoft.com/fr-fr/library/gg145045.aspx
http://msdn.microsoft.com/fr-fr/library/gg145045.aspx
 +
*Tout les objets COM
 +
Vous devez spécifier le paramètre ComObject avec l'identificateur programmatique (ou ProgId) de la classe COM à utiliser.</b>
 +
Vous pouvez créer les objets WSH en spécifiant ces ProgId : WScript.Shell, WScript.Network, Scripting.Dictionary et Scripting.FileSystemObject. Les commandes suivantes créent ces objets :
 +
New-Object -ComObject WScript.Shell
 +
New-Object -ComObject WScript.Network
 +
New-Object -ComObject Scripting.Dictionary
 +
New-Object -ComObject Scripting.FileSystemObject
 +
gci HKLM:\Software\Classes -ea 0| ? {$_.PSChildName -match '^\w+\.\w+$' -and (gp "$($_.PSPath)\CLSID" -ea 0)} | ft PSChildName
 +
Lister tout les ProgId
 +
dir  REGISTRY::HKEY_CLASSES_ROOT\CLSID -include PROGID -recurse | foreach {$_.GetValue("")}
 +
ou
 +
get-wmiobject Win32_COMClass
 +
 +
$WshShell = New-Object -ComObject WScript.Shell
 +
$WshShell | Get-Member
 +
$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")
*Tout les objet fs
*Tout les objet fs
  Get-ChildItem c:\
  Get-ChildItem c:\
Ligne 262 : Ligne 358 :
*Lecteurs
*Lecteurs
 +
$obj = New-Object -com Wscript.Network
 +
$obj.MapNetworkDrive("x:", "\\serveur\partage")
*Services
*Services
Ligne 273 : Ligne 371 :
*Sécurité
*Sécurité
 +
 +
*Effacer un profile utilisateur
 +
( Get-WmiObject -Class Win32_UserProfile | Where-Object { $_.LocalPath -eq 'c:\users\user' } ).Delete()
==Ressources==
==Ressources==
http://technet.microsoft.com/en-us/scriptcenter/bb410849.aspx
http://technet.microsoft.com/en-us/scriptcenter/bb410849.aspx

Version actuelle en date du 20 février 2017 à 09:41

Sommaire

[modifier] Avoir de l'aide

  • sur une commande
Get-Help commande
Get-Help commande -examples
Get-Help commande -detailed
Get-Help commande -full
ou 
help commande
  • liste des commandes
Get-Command
Get-Command -verb Get
Get-Command -noun Service
Get-Command -commandType alias
Get-Command Get-*
Get-Command *-Service
Get-Verb

  • lister tout les propriétés et méthodes d'un objet
$maVariable | Get-Member
$maVariable | Get-Member -MemberType Method
$maVariable | Get-Member -MemberType Property
$maVariable | Get-Member -MemberType Property CreateTime
Get-ItemProperty
appel méthode
$maVariable.ToUpper()
  • lister les Provider
Get-PsProvider
  • Listage des classes WMI
Get-WmiObject –List 
$i=0;Get-WmiObject -list | foreach{$i=$i+1} ; Write-Host "Il y a $i membre(s)"
  • Connaitre sa version de PowerShell
$host.version
$PSVersionTable

[modifier] Script (exécution, mode de sécurité)

  • fichier ayant pour extension .PS1
  • exécution

depuis une invite de commande

 powershell c:\monscript.ps1

double clic, il faut modifier les paramètres de sécurité implémentés dans PowerShell car par défaut il est impossible de lancer un script sans passer par l’interpréteur PowerShell.

Get-ExecutionPolicy

PowerShell propose 4 modes de sécurité différents:

Restricted - No scripts can be run. Windows PowerShell can be used only in interactive mode.
AllSigned - Only scripts signed by a trusted publisher can be run.
RemoteSigned - Downloaded scripts must be signed by a trusted publisher before they can be run.
Unrestricted - No restrictions; all Windows PowerShell scripts can be run.

changer de mode et d’autoriser l’exécution de script locaux

Set-ExecutionPolicy RemoteSigned

[modifier] Dénomination verbe-substantif

http://msdn.microsoft.com/en-us/library/windows/desktop/ms714428%28v=vs.85%29.aspx

[modifier] Syntaxe

[modifier] Formatage d'affichage des propriétés

Affichage des propriétés sous forme de liste

Get-ChildItem | Format-List

ou toutes les propriétés
Get-ChildItem | Format-List *

ou juste les propriétés name et lenght
Get-ChildItem | Format-List -Property name, length

ou une seul propriété
(Get-ChildItem nomfichier).CreationTime

Affichage des propriétés sous forme de Table

Get-ChildItem | Format-Table -autosize

Affichage de la seul propriété par défaut au format large table

Get-ChildItem | Format-Wide

Affichage personnalisé des propriétés

Get-ChildItem | Format-Custom

[modifier] Filtres

  • wc = Measure-Object
Get-Command | Measure-Object
  • grep = Select-String
  • grep sur les méthodes et les propriétés = Where-Object méthodes/propriétés -eq quelquechose
Get-service | Where-Object status -eq Stopped
  • Select-Object (select)
Get-WmiObject win32_userprofile | Select-Object LocalPath

[modifier] Guillemets

double ""

substitution de variable

$a = 'bonjour'
$b = 'monde'
Write-Host "$a $b"
bonjour monde
simple

protection de chaine

[modifier] Caractère d'échappement

AltGr + 7 donne le backtick "`"

`n = Saut de ligne `r = retour chariot ...

[modifier] Appel des méthodes

$a = 12
$a.GetType()
Int32

[modifier] Valeur de propriétés

$(objet.propriété)

$a = Get-ChilItem c:\config.sys
Write-Host "Taille du fichier $($a.Name) : $($a.Length) octets"
Taille du fichier config.sys : 10 octets

[modifier] Opérateurs de comparaisons

Les opérateurs de comparaison pour le shell, par défaut, ne sont pas sensibles à la casse lors de la comparaison des chaînes :

-eq    Equal (case insensitive)
-ne    Not equal (case insensitive)
-ge    Greater than or equal (case insensitive)
-gt    Greater than (case insensitive)
-lt     Less than (case insensitive)
-le    Less than or equal (case insensitive)
-like     Wildcard comparison (case insensitive)
-notlike     Wildcard comparison (case insensitive)
-match       Regular expression comparison (case insensitive)
-notmatch        Regular expression comparison (case insensitive)
-replace        Replace operator (case insensitive)
-contains        Containment operator (case insensitive)
-notcontains       Containment operator (case insensitive)
-ieq      Case insensitive equal
-ine       Case insensitive not equal
-ige       Case insensitive greater than or equal
-igt       Case insensitive greater than
-ile        Case insensitive less than or equal
-ilt         Case insensitive less than
-ilike         Case insensitive equal
-inotlike        Case insensitive equal
-imatch        Case insensitive regular expression comparison
-inotmatch        Case insensitive regular expression comparison
-ireplace        Case insensitive replace operator
-icontains         Case insensitive containment operator
-inotcontains           Case insensitive containment operator
-ceq       Equal (case sensitive)
-cne        Not equal (case sensitive)
-cge         Greater than or equal (case sensitive)
-cgt         Greater than (case sensitive)
-clt         Less than (case sensitive)
-cle         Less than or equal (case sensitive)
-clike          Wildcard comparison (case sensitive)
-cnotlike         Wildcard comparison (case sensitive)
-cmatch          Regular expression comparison (case sensitive)
-cnotmatch           Regular expression comparison (case sensitive)
-creplace            Replace operator (case sensitive)
-ccontains            Containment operator (case sensitive)
-cnotcontains            Containment operator (case sensitive)
-is           Is of a type
-isnot        Is not of a type
-as        As a type, no error if conversion fails

[modifier] Les profiles

  • Type Utilisateurs

%UserProfile%\My Documents\WindowsPowerShell\profile.ps1

%UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

  • Type Machine (pour tout les utilisateurs)

%windir%\system32\WindowsPowerShell\v1.0\profile.ps1

%windir%\system32\WindowsPowerShell\v1.0\ Microsoft.PowerShell_profile.ps1

  • fichier profile pour commande automatique au lancement du shell
notepad $profile
Import-Module nommodule
start-transcript
...

[modifier] Vocabulaire

"item"

fichier, répertoire, clé de la base de registre.

"fournisseur ou Provider po PsProvider"

Ce sont les objets sur lesquels la commande agis: Alias, Env, C, D, E,...,Z , Function, HKLM, KHCU, Variable, Cert.
Exemple:

Get-ChildItem C:
Get-ChildItem Alias:
Get-ChildItem Env:
Get-ChildItem Function:
Get-ChildItem HKLM:
Get-ChildItem Variable:

[modifier] Les modules

Microsoft Script Center: http://technet.microsoft.com/en-us/scriptcenter/bb410849.aspx ou http://gallery.technet.microsoft.com/ScriptCenter/

Les modules sont soit des fichier .psd1 ou .psm1, soit des binaires (.dll), soit des modules dynamique en ram.

Si vous êtes seul à executer les commandes, il est préferable de positionner les modules dans votre profile Powershell;

soit
%USERPROFILE%\Documents\WindowsPowerShell\Modules\MonModule
ou
%DocumentsUser%\WindowsPowerShell\Modules\MonModule

Si vous executez des commandes depuis des taches planifiées ou si les commandes peuvent être executé par tout le monde , il est préferable d’installer dans le répertoire

%SystemRoot%,
soit
%WINDIR%\System32\WindowsPowerShell\v1.0\Modules\MonModule

Il est important que le nom du répertoire « MonModule » soit identique aux noms des fichiers avec l extension *.PSD1 & *.PSM1.

  • liste les modules chargés
Get-Module
ou
Get-PSSnapin
  • liste les modules diponible mais non encore chargés
Get-Module –ListAvailable
  • Charger un module
Import-module module
  • Decharger un module
Remove-Module module

ServerManager -

[modifier] Restrictions

  • connaitre son niveau d'execution
get-executionpolicy
Restricted

Pour executer des scripts signés et non signés en local, il suffit de valider la commande

Set-ExecutionPolicy RemoteSigned
ou
Set-ExecutionPolicy –ExecutionPolicy RemoteSigned –Scope Process

dans powershell attention lancer powershell en tant qu'admin pour ce faire.

[modifier] Un shell a distance

  • PowerShell Doit être installé sur la machine local et sur la machine distante.
  • Les 2 machines doivent être configurés pour une gestion a distance.
Enable-PSRemoting
ou
Winrm
Enter-PSSession -computer NOMMACHINE -port 5985 -credential domain01\user01
Alias: etsn
  • déactivation du shell a distance
Disable-PSRemoting

[modifier] commandes utiles

Get-Process, Start-Process, Stop-Process, Wait-Process, Debug-Process
Get-Service
Get-EventLog
Restart-Computer
Test-Connection
Clear-EventLog
Get-EventLog
Get-Hotfix
Get-Process
Get-Service
Set-Service
Get-WinEvent
Get-WmiObject, Get-WmiObject -List, Get-WmiObject -List | Where-Object { $_.name -match 'disk'}, Get-WmiObject win32_computersystem

[modifier] les Objets (Outils intégrés)

  • cmdlets (mini-exe réalisant des fonctions préséfinies
Out-GridView,
  • utilitaires:
fsutil,etc...
New-Object -TypeName System.Diagnostics.EventLog
New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog | Get-Member -MemberType Method
$AppLog.Clear()
$AppLog

Méthodes statiques:

[espace de nom. <type .net>]::<Membre-statique>
[System.DateTime]::Now

http://msdn.microsoft.com/fr-fr/library/gg145045.aspx

  • Tout les objets COM

Vous devez spécifier le paramètre ComObject avec l'identificateur programmatique (ou ProgId) de la classe COM à utiliser.</b> Vous pouvez créer les objets WSH en spécifiant ces ProgId : WScript.Shell, WScript.Network, Scripting.Dictionary et Scripting.FileSystemObject. Les commandes suivantes créent ces objets :

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
gci HKLM:\Software\Classes -ea 0| ? {$_.PSChildName -match '^\w+\.\w+$' -and (gp "$($_.PSPath)\CLSID" -ea 0)} | ft PSChildName

Lister tout les ProgId

dir  REGISTRY::HKEY_CLASSES_ROOT\CLSID -include PROGID -recurse | foreach {$_.GetValue("")}
ou
get-wmiobject Win32_COMClass
$WshShell = New-Object -ComObject WScript.Shell
$WshShell | Get-Member
$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")
  • Tout les objet fs
Get-ChildItem c:\
  • Tout les objet AD
Get-ADObject  

Télécharger RSAT "Remote Server Admin Tools" nouveau AdminPack pour win2008srv.
http://www.microsoft.com/fr-fr/download/details.aspx?id=7887

  • Tout les objet WMI
Get-WMIObject Win32_NetworkAdapterConfiguration

http://msdn.microsoft.com/fr-fr/library/windows/desktop/aa394572%28v=vs.85%29.aspx

  • Tout les objet du registre
Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix
  • Getting Credentials From The Command Line
PS> $key = "HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds"
PS> Set-ItemProperty $key ConsolePrompting True
PS> Get-Credential

[modifier] Astuces

F7 -- Pour avoir l'historique des commandes

[modifier] Recettes

  • Registre
PS >Set-Location HKCU:\Software\Microsoft\Windows\CurrentVersion\Run
PS >Get-ItemProperty .

To set:

PS >(Get-ItemProperty .).MyProgram
c:\temp\MyProgram.exe
PS >Set-ItemProperty . MyProgram d:\Lee\tools\MyProgram.exe
PS >(Get-ItemProperty .).MyProgram
d:\Lee\tools\MyProgram.exe

To remove:

PS >Remove-ItemProperty . MyProgram
PS >(Get-ItemProperty .).MyProgram

To creating new:

PS >New-ItemProperty . -Name MyProgram -Value c:\temp\MyProgram.exe

To copying:

Copy-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' -Destination hkcu:

ACL

PS >Get-Acl HKLM:\Software
  • Lecteurs
$obj = New-Object -com Wscript.Network 
$obj.MapNetworkDrive("x:", "\\serveur\partage")
  • Services
Get-Service
Get-Service OC*
Get-Service | Where-Object {$_.status -eq "running"}
Restart-Service "nom service"
Set-Service "nom service" -StartupType Automatic
Stop-Service "nom service"
Start-Service "nom service"
  • Sécurité
  • Effacer un profile utilisateur
( Get-WmiObject -Class Win32_UserProfile | Where-Object { $_.LocalPath -eq 'c:\users\user' } ).Delete()

[modifier] Ressources

http://technet.microsoft.com/en-us/scriptcenter/bb410849.aspx

Outils personnels