« PowerShell » : différence entre les versions

Aller à la navigation Aller à la recherche
Ligne 136 : Ligne 136 :
Gérer les utilisateurs et ordinateurs inactifs dans l’Active Directory
Gérer les utilisateurs et ordinateurs inactifs dans l’Active Directory
* https://www.it-connect.fr/gerer-les-utilisateurs-et-ordinateurs-inactifs-dans-lactive-directory/
* https://www.it-connect.fr/gerer-les-utilisateurs-et-ordinateurs-inactifs-dans-lactive-directory/
== Script de nettoyage de contenu de fichier ==
<source>
# 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
</source>


== Script de suppression de fichier ==
== Script de suppression de fichier ==

Version du 21 décembre 2022 à 14:18

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

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