« PowerShell » : différence entre les versions

Aller à la navigation Aller à la recherche
Ligne 95 : Ligne 95 :
</pre>
</pre>


== Dossier bureautique et groupe de sécurité ==
== 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\Permissionstest.csv"
$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 $FichierNom  
$FichierExiste = Test-Path $FichierDestination  
If ($FichierExiste -eq $True) {Del $FichierDestination}   
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


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 :

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é."
}

Résultat :

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