« PowerShell » : différence entre les versions
Ligne 95 : | Ligne 95 : | ||
</pre> | </pre> | ||
== | == Liste des droits sur le contenu d'une arborescence == | ||
<source> | <source> | ||
# Liste des droits de sécurité sur les dossiers et fichiers d'une arborescence | # Liste des droits de sécurité sur les dossiers et fichiers d'une arborescence | ||
# Création d'un fichier | # Création d'un fichier | ||
$FichierDestination = "C:\Support\ | $FichierDestination = "C:\Support\PermissionListeTest.csv" | ||
$CheminRacine = "C:\Support\" | $CheminRacine = "C:\Support\" | ||
Ligne 106 : | Ligne 106 : | ||
$FichierEntete = "Chemin;IdentityReference;AccessControlType;IsInherited;InheritanceFlags;PropagationFlags;FilesystemRights" | $FichierEntete = "Chemin;IdentityReference;AccessControlType;IsInherited;InheritanceFlags;PropagationFlags;FilesystemRights" | ||
$FichierExiste = Test-Path $ | $FichierExiste = Test-Path $FichierDestination | ||
If ($FichierExiste -eq $True) { | If ($FichierExiste -eq $True) {Remove-Item $FichierDestination} | ||
Add-Content -Encoding UTF8 -Value $FichierEntete -Path $FichierDestination | Add-Content -Encoding UTF8 -Value $FichierEntete -Path $FichierDestination |
Version du 8 décembre 2022 à 10:02
PowerShell est un langage de programmation pour les systèmes Microsoft Windows.
Référence
- http://www.it-connect.fr/powershell-pour-les-debutants-1ere-partie/
- http://www.it-connect.fr/powershell-et-active-directory-modifier-le-domaine-des-adresses-mails/
- http://www.it-connect.fr/active-directory-supprimer-les-ordinateurs-dune-ou-en-powershell/
- http://www.it-connect.fr/creer-des-comptes-utilisateurs-par-lot-avec-powershell-v2-et-le-module-active-directory-server-2008-r2/
- http://www.it-connect.fr/chapitres/modifier-la-resolution-de-lecran/
Site de Marie Pascal Delamare, BTS SIO / STS SIO
Document
Gestion des path sous PowerShell, PDF, 31 pages :
Source de script
Gérer les autorisations NTFS avec PowerShell :
Copie de fichiers avec BITS (Background Intelligent Transfer Service) :
PowerShell : convertir PS1 en EXE ; création d'un exécutable :
- https://www.it-connect.fr/powershell-convertir-ps1-en-exe-executable/
- https://www.majorgeeks.com/files/details/ps1_to_exe.html
Interface graphique
- Exemple d'interface graphique :
Exemple
Date
Pour avoir les propriétés d'un fichier (taille, date...) :
Get-ItemProperty fichier.txt | format-list
Les autres propriétés sont :
CreationTime
: date de création ;LastWriteTime
: date de modification ;LastAccessTime
: date de dernier accès.
Pour modifier la date de création :
Get-Item fichier.txt | %{$_.CreationTime = '01/19/2019 09:00:00'}
- attention au format de la date qui est au format américain !
Windows10Debloater
Script si problème mise à jour Windows
Le service "Windows Update" s'appelle wuauserv
:
Stop-Service -Name wuauserv
Start-Service -Name wuauserv
Set-Service -Name wuauserv -StartupType Automatic
Set-Service -Name wuauserv -StartupType Manual
Set-Service -Name wuauserv -StartupType Disabled
Script de mise à jour d'Active Directory
Lire les lignes d'un fichier
Avec le fichier suivant C:\tmp\source.csv
:
compte;civilité;nom;prénom;société;service dupondp;M.;Dupond;Pierre;MaSociété;SI martinj;M.;Martin;Jean;MaSociété;Commercial defrattec;Mme;De Fratte;Catherine;MaSociété;Export
Premier script :
$fichier = Import-Csv "C:\tmp\source.csv" -Delimiter ";" Foreach ($ligne in $fichier) { Write-Host $ligne }
Le résultat du premier script est :
@{compte=dupondp; nom=Dupond; prénom=Pierre; société=MaSociété; service=SI} @{compte=martinj; nom=Martin; prénom=Jean; société=MaSociété; service=Commercial} @{compte=defrattec; nom=De Fratte; prénom=Catherine; société=MaSociété; service=Export}
Deuxième script :
Import-Csv "C:\tmp\source.csv" -Delimiter ";" | Foreach { Write-Host ("{0} {1} appartient au service {2}" -f $_.civilité, $_.nom, $_.service) }
Le résultat du deuxième script est :
M. Dupond appartient au service SI M. Martin appartient au service Commercial Mme De Fratte appartient au service Export
Liste des droits sur le contenu d'une arborescence
# Liste des droits de sécurité sur les dossiers et fichiers d'une arborescence # Création d'un fichier $FichierDestination = "C:\Support\PermissionListeTest.csv" $CheminRacine = "C:\Support\" # Entête de document $FichierEntete = "Chemin;IdentityReference;AccessControlType;IsInherited;InheritanceFlags;PropagationFlags;FilesystemRights" $FichierExiste = Test-Path $FichierDestination If ($FichierExiste -eq $True) {Remove-Item $FichierDestination} Add-Content -Encoding UTF8 -Value $FichierEntete -Path $FichierDestination $DossierListe = dir $CheminRacine -recurse | Where {$_.psiscontainer -eq $True} Foreach ($Dossier in $DossierListe) { $DroitListe = Get-ACL $Dossier.fullname | ForEach-Object { $_.Access } Foreach ($Droit in $DroitListe) { $FichierLigne = ($Dossier.Fullname, $Droit.IdentityReference, $Droit.AccessControlType, $Droit.IsInherited, $Droit.InheritanceFlags, $Droit.PropagationFlags, ($Droit.FileSystemRights -replace ',', '/' ) ) -join ";" Add-Content -Encoding UTF8 -Value $FichierLigne -Path $FichierDestination } }
Autre
Pour la mise à jour de compte utilisateur, attribut titre et numéro de mobile, d'après le nom du compte et une fichier :
Import-Csv "D:\script\util-maj-tel.csv" | Foreach { Set-ADUser -Identity $_.SamAccountName –Title $_.Title -MobilePhone $_.MobilePhone }
Copier les groupes de sécurité d'un compte vers un autre !
Get-ADUser -Identity "comptesource" -Properties memberof | Select-Object -ExpandProperty memberof | Add-ADGroupMember -Members "comptecible"
Ressource
Installer le module Active Directory sur Windows 10 et Windows Server
Gérer les utilisateurs Active Directory avec PowerShell
Créer un utilisateur dans l’Active Directory avec PowerShell
Gérer les utilisateurs et ordinateurs inactifs dans l’Active Directory
Script de nettoyage de contenu de fichier
# Traitement de texte sur fichier brut (enlever les lignes qui contiennent les mots ou expressions indiquées) ; le nouveau fichier est "fichier2.txt" # l'expression "^[?]" indique une ligne commençant par un point d'interrogation. # la barre verticale sépare les expressions recherchées ; les espaces sont pris en compte. $fichier = get-content "c:\tmp\scores.txt" | where {$_ -notmatch "^[?]|putain|bite|caca| cul| chauve| mere"} set-content fichier2.txt $fichier
Script de suppression de fichier
# Auteur : Ph. Page # Création : 01/12/2021 # Modification : # # Script de suppression de fichiers de façon récursive ! # Clear-Host $CheminListe = @( 'C:\test\dossier1', 'C:\test\qcm', 'C:\test\Rufus' ) Clear-Host Write-Host "Demande de confirmation de suppression des fichiers des dossiers suivants :" Write-host $CheminListe -Separator "`n" $Reponse = Read-Host "`nEtes-vous sûr cette action ? (O/N)" if ($reponse -eq "O") { Write-Host "`n==> Traitement lancé..." foreach ($Chemin in $CheminListe) { if (Test-Path $Chemin) { Get-ChildItem -file -recurse -Force -path $chemin | Remove-Item #Get-ChildItem -file -recurse -Force -path $chemin } else { Write-Host "`tLe dossier suivant n'existe pas ! $Chemin" } } Write-Host "==> Traitement terminé." } else { Write-Host "Traitement non lancé." }
Complément
Liste des dix plus gros fichiers, tri décroissant :
Get-ChildItem -file *.vhdx -recurse | sort Length -descending | select -first 10 | Select-Object Name, @{Name="Mo";Expression={$_.Length / 1MB}}
Liste des dix plus gros fichiers, tri décroissant, avec mise en forme des valeurs numériques en Mo et 3 chiffres après la virgule :
Get-ChildItem -file *.* -recurse | sort Length -descending | select -first 10 | Select-Object -property Name, @{Label="Mo";Expression={"{0:N3}" -f ($_.Length / 1MB)}}
Script avec fenêtre de dialogue
Fenêtre de dialogue
Création de fenêtre de dialogue :
Fenêtre de dialogue et sélection multiple
# Original example posted at http://technet.microsoft.com/en-us/library/ff730950.aspx Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # Fonction pour la création de boite de message function Show-Message { param ( [string]$Message = "Veuillez entrer votre message", [string]$Titre = "Titre de la fenêtre", [switch]$OKCancel, [switch]$AbortRetryIgnore, [switch]$YesNoCancel, [switch]$YesNo, [switch]$RetryCancel, [switch]$IconErreur, [switch]$IconQuestion, [switch]$IconAvertissement, [switch]$IconInformation ) # Affecter la valeur selon le type de boutons choisis if ($OKCancel) { $Btn = 1 } elseif ($AbortRetryIgnore) { $Btn = 2 } elseif ($YesNoCancel) { $Btn = 3 } elseif ($YesNo) { $Btn = 4 } elseif ($RetryCancel) { $Btn = 5 } else { $Btn = 0 } # Affecter la valeur pour l'icone if ($IconErreur) {$Icon = 16 } elseif ($IconQuestion) {$Icon = 32 } elseif ($IconAvertissement) {$Icon = 48 } elseif ($IconInformation) {$Icon = 64 } else {$Icon = 0 } # Charger la biblithèque d'objets graphiques Windows.Forms [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null # Afficher la boite de dialogue et renvoyer la valeur de retour (bouton appuyé) $Reponse = [System.Windows.Forms.MessageBox]::Show($Message, $Titre , $Btn, $Icon) Return $Reponse } # Fin de la fonction pour la création de boite de message # Création de la fenêtre de dialogue $hauteurfenetre = 250 $form = New-Object System.Windows.Forms.Form $form.Text = "Profils à supprimer" $form.Size = New-Object System.Drawing.Size(320,$hauteurfenetre) $form.StartPosition = "CenterScreen" $OKButton = New-Object System.Windows.Forms.Button $OKButton.Location = New-Object System.Drawing.Point(75,($hauteurfenetre-80)) $OKButton.Size = New-Object System.Drawing.Size(75,23) $OKButton.Text = "OK" $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK $form.AcceptButton = $OKButton $form.Controls.Add($OKButton) $CancelButton = New-Object System.Windows.Forms.Button $CancelButton.Location = New-Object System.Drawing.Point(150,($hauteurfenetre-80)) $CancelButton.Size = New-Object System.Drawing.Size(75,23) $CancelButton.Text = "Cancel" $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $form.CancelButton = $CancelButton $form.Controls.Add($CancelButton) $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Point(10,20) $label.Size = New-Object System.Drawing.Size(280,20) $label.Text = "Sélectionner les profils à supprimer ; sélection multiple" $form.Controls.Add($label) $listBox = New-Object System.Windows.Forms.Listbox $listBox.Location = New-Object System.Drawing.Point(10,40) $listBox.Size = New-Object System.Drawing.Size(280,($hauteurfenetre-120)) $listBox.SelectionMode = "MultiExtended" ## Exemple pour la suppression de profil local # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # $profileliste = Get-WmiObject -ClassName Win32_UserProfile | Where-Object {$_.special -ne "true"} | foreach localpath # # foreach ($profile in $profileliste) { # $listBox.Items.Add($profile) # } ## à compléter... ## Exemple pour la suppression de dossier # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # $dossierliste = Get-childitem "c:\" foreach ($dossier in $dossierliste) { $listBox.Items.Add($dossier) } $form.Controls.Add($listBox) $form.Topmost = $True $result = $form.ShowDialog() if ($result -eq [System.Windows.Forms.DialogResult]::OK) { $x = $listBox.SelectedItems if ($x.count -eq 0) { $reponse = show-Message -Message "Aucun élément de sélectionné !" -Titre "Sélection" -IconAvertissement } else { $maliste = $x -join "`n" # $x $reponse = show-Message -Message "Confirmez-vous la suppression des éléments ci-dessous ?`n`n$maliste" -Titre "Confirmation" -YesNo -IconQuestion if ($reponse -eq "Yes") { foreach ($elem in $x) { Get-ChildItem "c:\$elem" } } else { $reponse = show-Message -Message "Suppression annulée !" -Titre "Annulation" -IconAvertissement } } }
Téléchargement d'images depuis internet
$page_nb = (1..52) $chemin_url = "https://sitesource.fr/cat/377/pages/" $chemin_sortie = "D:\_tmpphoto\cat-2202\" foreach ($page in $page_nb) { $image_entree = $chemin_url + "page" + $page + ".png" $image_sortie = $chemin_sortie + "page" + $page + ".png" Invoke-WebRequest -Uri $image_entree -OutFile $image_sortie write-host "fait :" $page }
Image et redimensionnement
PowerShell et fonction :
Impression
Supprimer toutes les fichiers des files d'attente d'impression :
Stop-Service Spooler Remove-Item "C:\Windows\System32\spool\PRINTERS\*.*" -Force Start-Service Spooler