Powershell : suppression d'enregistrements DNS depuis un import CSV

Ce snippet permet de supprimer les enregistrements DNS à partir d'une liste au format CSV passée en paramètre.

Le script sera appelé de cette manière :

.\win_dns-deletion.ps1 -zone superdomaine.local -csv exportdns.csv

Seuls les enregistrements de type A sont supprimés par ce code ; le paramètre peut se modifier pour cibler un autre type. Par défaut, la commande demande confirmation avant suppression ; le paramètre -Force permet de passer outre cette confirmation. Attention au moment d'exécuter le script.

param([string]$zone, [string]$csv)
$records = Import-CSV $csv
foreach($record in $records){
Remove-DnsServerResourceRecord -ZoneName $zone -RRType "A" -Name $record.Name -Force
}

Powershell : liste des groupes vides et export CSV

Afin de compléter le script que j'ai proposé dans l'article hier permettant de lister les OU vides, j'ai conçu un script effectuant le même travail mais pour des groupes. Peu de choses changent : la requête à l'AD est différente et je n'ai pas utilisé l'inversion du DistinguishedName cette fois-ci.

Il est possible que le script renvoie des erreurs si il tente d'interroger un groupe dont il y a un membre qui n'est pas membre du domaine local mais membre d'un domaine approuvé ; c'est la commande Get-AdGroupMember qui la renvoie mais cette erreur n'a aucune incidence sur le traitement du script.

Le script est téléchargeable dans une version commentée sur le miroir du blog.

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
$fileExpl = New-Object System.Windows.Forms.SaveFileDialog
$fileExpl.ValidateNames = $true
$fileExpl.CreatePrompt = $false
$fileExpl.OverwritePrompt = $true
$fileExpl.RestoreDirectory = $false
$fileExpl.InitialDirectory = "$env:userprofile"
$tempfile = "$env:temp\temp-emptygrp.csv"
$dump = "Group Name,Path"
Add-Content -Value $dump -Path $tempfile
$AllGroups = Get-AdGroup -filter * | select SamAccountName,DistinguishedName
foreach ($Group in $AllGroups){
if((Get-ADGroupMember $Group.SamAccountName).Count -eq 0){
$dump=$Group.SamAccountName+","+$Group.DistinguishedName
Add-Content -Value $dump -Path $tempfile
}
}
$fileExpl.DefaultExt = "csv"
$fileExpl.Filter = "Comma-separated values file (*.csv)|*.csv"
$fileExpl.Title = "Export empty groups list to CSV file"
$fileExpl.Filename = ""
$fileExpl.ShowDialog() | out-null
if ($fileExpl.Filename -ne "") {
Copy-Item $tempfile -Destination $fileExpl.Filename
if ($?){ Remove-Item $tempfile ; Write-Host "Exported successfully to"$fileExpl.Filename }
else { Write-Host "There was an issue exporting the data in a CSV file." -ForegroundColor "Red" }
}
else { Remove-Item $tempfile ; Write-Host "Aborted data export." -ForegroundColor "Red" }

Powershell : liste des OU vides et export CSV

Avec le temps, un ActiveDirectory peut contenir de plus en plus d'OU ne contenant aucun objet, car ceux-ci ont été déplacés ailleurs ou il s'agit tout simplement d'un reliquat. Le script Powershell suivant parcourt l'annuaire et liste les OU qui ne contiennent aucun objet pour ensuite en faire un fichier CSV à l'emplacement spécifié par l'utilisateur.

A noter que les OU ont eu leur chemin inversé, c'est à dire que plutôt que de commencer à l'OU pour aller vers la racine du domaine, le script écrit dans le fichier CSV le nom en commençant par la racine du domaine ; cela permet une fois que la conversion CSV > tableau est réalisée, de pouvoir trier et lire plus facilement les chemins vers les OU.

Par exemple, au lieu d'avoir un tableau comme ceci :

On obtient ceci, plus exploitable et compréhensible car on reprend le chemin qui sera parcouru dans la console pour retrouver l'OU en question :

Le script est téléchargeable dans une version commentée ici.

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
$fileExpl = New-Object System.Windows.Forms.SaveFileDialog
$fileExpl.ValidateNames = $true
$fileExpl.CreatePrompt = $false
$fileExpl.OverwritePrompt = $true
$fileExpl.RestoreDirectory = $false
$fileExpl.InitialDirectory = "$env:userprofile"
$tempfile = "$env:temp\temp-emptyou.csv" 

$OUs = Get-ADOrganizationalUnit -filter * | select DistinguishedName
foreach ($OU in $OUs){
$OUObjects = Get-ADObject -Filter * -SearchBase $OU.DistinguishedName -SearchScope OneLevel
if($OUObjects -eq $null){
$splitOU = $OU.DistinguishedName.Split(",")
for($i=$splitOU.Length-1; $i -ge 0; $i--) {
$dump+=$splitOU[$i]+","
}
Add-Content -Value $dump -Path $tempfile
$dump = $null
}
}

$fileExpl.DefaultExt = "csv"
$fileExpl.Filter = "Comma-separated values file (*.csv)|*.csv"
$fileExpl.Title = "Export empty OU list to CSV file"
$fileExpl.Filename = ""
$fileExpl.ShowDialog() | out-null
if ($fileExpl.Filename -ne "") {
Copy-Item $tempfile -Destination $fileExpl.Filename
if ($?){ Remove-Item $tempfile ; Write-Host "Exported successfully to"$fileExpl.Filename }
else { Write-Host "There was an issue exporting the data in a CSV file." -ForegroundColor "Red" }
}
else { Remove-Item $tempfile ; Write-Host "Aborted data export." -ForegroundColor "Red" }

Powershell : automatisation de la création et peuplement de groupes AD

Dans le billet précédent, j'expliquais la création de groupes ActiveDirectory pour cadrer les flux générés par le Windows Update Delivery Optimization. Afin de faciliter le process de création de groupes et de peuplement de ces groupes, j'ai développé un script Powershell qui, avec un peu d'adaptation, permet d'automatiser tout ce travail.

Ce script va importer un fichier CSV dans un tableau dont toutes les lignes seront traitées pour créer un groupe correspondant, renvoyer le GUID du groupe créé, puis ajouter à ce groupe les stations de travail correspondantes.

Dans cet exemple, le fichier CSV peut se présenter ainsi :

Le fichier CSV en question avec les "colonnes" ID et location qui seront ensuite importées dans un tableau.

Ensuite, en prenant comme nomenclature <SiteID><Type><No>, qui va donner des noms comme FR01F01 pour le premier desktop parisien ou UK02M03 pour le troisième laptop du site de Glasgow, on peut articuler la requête ActiveDirectory qui va lister les stations correspondantes au site pour ensuite peupler le groupe lié. Le passage d'un paramètre permet de sélectionner - si cela est possible - le type de station que l'on souhaite inclure. Il sera peut-être nécessaire de travailler le contenu de la requête ActiveDirectory afin qu'elle corresponde à la nomenclature de nommage des stations.

function adquery{
param($T)
$adQuery = "Get-ADComputer -filter 'Name -like ""$id$T*""'"
$compList = Invoke-Expression $adQuery
if($?) {
foreach($comp in $compList){
Add-ADGroupMember -Identity $GrpName -Members $comp
}
}
}

$siteList = Import-CSV site.csv
$dn = (Get-ADDomain).DistinguishedName
foreach ($site in $siteList){
$id = $site.ID
$loc = $site.Location
$GrpName = $id+"-WUDO"
New-ADGroup -Name $GrpName -Description "Groupe d'ordinateurs du site $id ($loc)" -GroupScope DomainLocal -GroupCategory Security -Path "OU=Groupes-WUDO,OU=Workstations,$dn"
Write-Host "Groupe $GrpName"
Write-Host (Get-ADGroup $GrpName).ObjectGuid.Guid
adquery("F")
adquery("L")
}

Une version commentée du script est téléchargeable sur le miroir. 💾