Il s’agit bien d’une formation officielle, mais qui n’a pas de certification associée. Son contenu est orienté terrain et assez pragmatique !
Pour améliorer la visibilité des déponstration, lancer la commande suivante dans un Windows Powershell ISE :
Invoke-Command -ScriptBlock ([Scriptblock]::Create((Invoke-WebRequest 'https://raw.githubusercontent.com/renaudwangler/ib-apts/master/stages/msaz040.ps1' -useBasicParsing).Content))
Exemple (a fin de démonstration, sans intérêt terrain) de renommage d’une propriété en sortie :
Get-ComputerInfo | select @{l='ComputerName';e={$_.CSName}}|Get-Process
Pour nettoyer le démarrage des ateliers, utiliser la commande suivante :
Invoke-Command -ScriptBlock ([Scriptblock]::Create((Invoke-WebRequest 'https://raw.githubusercontent.com/renaudwangler/ib-labs/master/dcNetStart/doItAll.ps1' -useBasicParsing).Content))
(Dans ce stage, lon-svr1 ne redémarre pas correctement : le redémarrer à la main)
Les ateliers sur goDeploy sont nécessaires pour ce stage. Cependant, le dépot gitHub contient des ateliers (LAB_XX) et les corrigés d’atelier (LAB_AK_XX).
Le contenu proposé par goDeploy correspond bien plus aux corrigés. Certains stagiaires préfèreront donc probablement une démarche de recherche personnelle avec les ateliers avant de regarder les corrigés, s’ils ont déjà des connaissances et le temps d’assumer cette démarche.
A date, la version de l’ISE Windows Powershell dans les machines virtuelles goDeploy semble avoir un problème avec le type ArrayList (pas de problème dans l’invite PowerShell)
$logFile = "" + $today.Year + "-" + $today.Month + "-" + $today.Day + "-" + $today.Hour + "-" + $today.Minute + ".txt"
$logFile = "$($today.Year)-$($today.Month)-$($today.Day)-$($today.Hour)-$($today.Minute).txt"
$logFile = "{0:yyyy-MM-dd-hh-mm}.txt" -f $today
Process items by using If statements :
get-content services.txt|get-service|Where status -ne 'Running'|start-service
Create user acounts based on a CSV File :
import-csv E:\MOD08\labfiles\users.csv |select @{n="GivenName" ; e={$_.First} },
@{n="Surname" ; e={$_.Last} },
@{n="Name" ; e={$_.First + " " + $_.Last} },
@{n="DisplayName" ; e={$_.First + " " + $_.Last} },
@{n="SamAccountName" ; e={$_.UserID} },
@{n="UserPrincipalName" ; e={$_.UserID + "@adatum.com"} },
@{n="Path" ; e={"OU=" + $_.Department + ",DC=Adatum,DC=com"} },
Department | New-ADUser -whatif
$users = Import-CSV E:\mod08\Labfiles\users.csv
ForEach ($u in $users) {
$param= @{
"GivenName" = $u.First
"Surname" = $u.Last
"Name" = $u.First + " " + $u.Last
"DisplayName" = $u.First + " " + $u.Last
"SamAccountName" = $u.UserID
"UserPrincipalName" = $u.UserID + "@adatum.com"
"Path" = "OU=" + $u.Department + ",DC=Adatum,DC=com"
"Department" = $u.Department
}
Write-Host "Creating $($u.UserId) in $($user.Department)"
New-ADUser @param -WhatIf
}
Il pourra être utile de redémarrer le service de ceritificats sur lon-dc1 en cas de soucis pour obtenir le certificat de signature de code :
invoke-command -computerName lon-dc1 -scriptBlock {restart-service certsvc}
Où mettre le fichier de profile:
$pshome
(C:\Windows\System32\WindowsPowerShell\v1.0)$home\Documents\WindowsPowerShell
Quel nom lui donner:
Profile.ps1
Microsoft.PowerShell_profile.ps1
Microsoft.PowerShellISE_profile.ps1
"ma chaîne" -like "[m-o]*"
(commence par m, n ou o)"ma chaîne" -like "[mst]a*"
(commence par ma, sa ou ta)"ça va?" -like "*[?]*"
-like "*[[]*"
(il faut encadrer le crochet ouvrant par des crochets)-like "*]*"
(on recherche le crochet fermant comme n’importe quel caractère)
Attention le Out-File génère un fichier encodé en ASCII (ce qui peut provoquer une mauvaise interprétation du CSV par Excel), alors que Export-CSV génère un fichier en UTF-8.
Il faut utiliser le paramètre Encoding sur Out-File pour changer l’encodage (ar exemple en indiquant la valeur utf8: |out-file .\fichierExport.csv -encoding utf8
).
De façon à obtenir les objets associés:
(Get-wmiobject –Query “SELECT * FROM Win32_NetworkAdapter where deviceid=1").getrelated()
(Get-wmiobject –Query “SELECT * FROM Win32_NetworkAdapter where deviceid=1").getrelated("win32_networkadapterconfiguration")
Get-ciminstance –Query “SELECT * FROM Win32_NetworkAdapter where deviceid=1"|Get-CimAssociatedInstance
Get-ciminstance –Query “SELECT * FROM Win32_NetworkAdapter where deviceid=1"|Get-CimAssociatedInstance -ResultClassName Win32_NetWorkAdapterConfiguration
$PSDefaultParameterValues=@{"get-ciminstance:computername"="lon-dc1"}
$PSDefaultParameterValues.Add("get-ciminstance:classname","win32_BIOS")
get-ciminstance -ClassName win32_operatingsystem`
$PSDefaultParameterValues=@{}
$param=@{"class"="win32_bios";"comp"="lon-dc1"}
$param
#splatting
Get-CimInstance @param
get-wmiobject @param
Get-Process | Export-CliXML data_t1.xml
… Puis, plus tard
ompare-Object (Import-CliXML data_t1.xml) (Get-Process) -Property Name
function Get-Retour{
"chaîne"
write-host "host" # écrit directement sur l'hôte
write "write" # alias de write-output
write-Output "output"
return "return" # impose de sortir
"fin" # non atteignable
}
Autre alternative (Forcer une connexion via un login de l’ordinateur intermédiaire.)
Set-ADComputer -Identity LON-SVR2 -PrincipalsAllowedToDelegateToAccount LON-SVR3
:
C’est l’inverse, à savoir on donne à la destination le nom du serveur qui aura le droit de lui déléguer un compte (donc identity doit être le 3ème serveur, et le PrincipalsAllowed… le serveur intermédiaire).
Test effectué avec l’environnement de formation, en exécutant Set-ADComputer LON-DC1 -PrincipalsAllowedToDelegateToAccount LON-SVR1
puis klist purge
depuis LON-SVR1: le rebond fonctionne (invoke-command et Get-ADUser) seulement en ajoutant un credential…
$valeur='10';$valeur+1;[decimal]$valeur+1
Update-Help -UICulture 'en-us'
1..10 | ForEach { Write-Host “Creating User $_” }