[PowerShell] Normaliser une chaîne de caractères

Bonjour à tous,

Voici probablement le meilleur tips PowerShell que j’ai dans mon escarcelle, à savoir normaliser une chaîne de caractères.
Mais ça veut dire quoi normaliser une chaîne de caractères ??
ça veut tout simplement dire remplacer tous les caractères spéciaux « latins » en caractères standards. En d’autres termes :

  • ça retire les accents
  • ça retire les cédilles (oui oui, cédille ça s’écrit comme ça 😉 )
  • etc.

Cette fonction est donc particulièrement intéressante dans les cas suivants :

  • Création de comptes Active Directory, Azure AD, etc. Par exemple Créer le compte regislaine à partir du prénom Régis et du nom Lainé.
  • Création de dossiers et fichiers. De la même manière cette fonction retirera les accents, cédilles, etc… Cependant cette fonction ne retirera pas les espaces, tirets et caractères spéciaux interdits lors de la création d’un dossier (‘<‘, ‘>’, ‘:’, ‘ »‘, ‘/’, ‘\’, ‘|’, ‘?’, ‘*’)

Comme vous pouvez le constater cette fonction est extrêmement complexe 🙂 (Comme quoi les meilleures choses sont souvent les plus simples)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Get-NormalizedString
{
    Param    (
        [Parameter(Mandatory=$true,Position=0)]$InputString
    )
 
    try
    {
        return [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding("Cyrillic").GetBytes($InputString))
    }
    Catch
    {
        Throw
    }
}

Enjoy 😉

[PowerShell] Identifier les ordinateurs disposant du même SID

Bonjour à tous,

Voici un script permettant d’identifier parmi tous les ordinateurs d’un domaine, ceux qui disposent du même SID.

Pour rappel : Microsoft n’apporte pas son support dans le cas où vous disposez de systèmes clonés avec le meme SID (Lien officiel)

Notez que pour que ce script fonctionne :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$Error.Clear()
Clear-Host
 # Initialize Computers List
$computerList = New-Object -TypeName System.Collections.ArrayList
 
# Retrieve ADCOmputers
Import-Module ActiveDirectory
$ADcomputers = @(Get-ADComputer -Filter * -Properties SamAccountName, SID)
 
# Create custom object for each computers
# Add information to this object (ComputerName, DomainSID, LocalSID)
# Add object to Result list
if ($ADcomputers.Count -gt 0)
{
    $i = 0
    foreach ($ADcomputer in $ADcomputers)
    {
        Write-Progress -Activity get-SID -Status Running -Id 0 -PercentComplete (($i/$ADcomputers.Count)*100) -CurrentOperation $computer.ComputerName
 
        $Computer = New-Object -TypeName psobject -Property @{
            "ComputerName"= ([String]$ADcomputer.SamAccountName).Replace('$','')
            "DomainSID"=$ADcomputer.SID
            "LocalSID"=$null
        }
 
        Invoke-Expression -Command ("PsGetsid.exe " + '\\' + $computer.ComputerName) -ErrorAction SilentlyContinue| Tee-Object -Variable out | Out-Null
        $Computer.LocalSID = ($out | Where-Object{$_ -like "S-1-5*"})
 
        $computerList.Add($Computer) |Out-Null
 
        $i++
    }
}
 
$computerList | Group-Object -Property LocalSID | Format-Table

Enjoy 😉

[PowerShell] Comparer deux dossiers

Bonjour à tous,

Voici une portion de script dérivant comment comparer le contenu de deux dossiers.
Le but ici est d’identifier :

  • les fichiers en commun
  • les fichiers présents uniquement dans le premier dossier
  • les fichiers présents uniquement dans le second dossier

Notez que dans la présente situtation, la comparaison se fait au niveau du nom du fichier (-Property Name), mais vous pouvez lancer la comparaison sur un ou plusieurs autres critères comme par exemple le nom et la date de modification.

1
2
3
4
5
6
7
$FolderContent1 = @(Get-ChildItem -Path "<FolderPath1>") | where {!$_.PSIsContainer}
$FolderContent2 = @(Get-ChildItem -Path "<FolderPath2>") | where {!$_.PSIsContainer}
$ComparisonResult = Compare-Object -ReferenceObject $FolderContent1 -DifferenceObject $FolderContent2 -Property Name -IncludeEqual 
$EqualFiles = $ComparisonResult | Where-Object{$_.SideIndicator -eq "=="}
$FilesOnlyInTheFirstFolder =  $ComparisonResult | Where-Object{$_.SideIndicator -eq "<="}
$FilesOnlyInTheSecondFolder = $ComparisonResult | Where-Object{$_.SideIndicator -eq "<="}

et le résultat si je ne souhaite afficher que les fichiers présents dans les deux dossiers :


Enjoy 😉

[PowerShell] Tester si un périphérique est connecté

Bonjour à tous,

Voici une fonction qui vous permettra de tester si un périphérique est connecté sur un poste de travail.
Cette fonction retourne les caractéristiques du périphérique si il est trouvé, sinon elle ne renvoie rien.
Le critère de recherche est un ID plug’n’play ou une liste d’IDs plug’n’play compatibles avec ce périphérique.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
function Search-Device
{
    Param
    (
        [Parameter(Mandatory=$true,ValueFromPipeline=$false,Position=0)][String[]]$PnpIDs
    )
 
    $devices = $device = $FoundDevice = $null
 
    # On dresse la liste des pépriphériques connectés 
    $devices = Get-WmiObject -Class Win32_PnpEntity | Sort-Object -Property Caption
 
    # On cherche dans cette liste si un périphérique contient l'ID plug'n'play recherché
    foreach ($device in $devices)
    {
        # On construit la liste des IDs plug'n'play compatibles
        $CompatibleIDs = $null
        if ($device.HardwareID.Count -gt 0)
        {
            $CompatibleIDs = $device.HardwareID
        }
        if ($device.CompatibleID.Count -gt 0)
        {
            $CompatibleIDs += $device.CompatibleID
        }
 
        # On cherche l'ID plug'n'play parmi la liste 
        if ($CompatibleIDs -ne $null)
        {
            foreach ($PnpID in $PnpIDs)
            {
                if ($CompatibleIDs.Contains($PnpID) -eq $true)
                {
                    $FoundDevice = $device
                    break
                }
            }
        }
    }
 
    if ($FoundDevice -ne $null)
    {
        Write-host "Périphérique trouvé" -ForegroundColor Green
        Write-Output $FoundDevice
    }
    else 
    {
        Write-Host "Périphérique non trouvé" -ForegroundColor Yellow
        Write-Output $null
    }
}

Exemples d’utilisation :

1
$Device = Search-Device -PnpIDs @('PCI\VEN_8086&DEV_0166&REV_09','PCI\VEN_8086&CC_030000')

Enjoy 😉

[PowerShell] Créer un compte administrateur local

Vous n’êtes pas sans savoir qu’une des meilleures « best practices » concernant la sécurisation des postes de travail réside dans deux critères :

  • Désactiver le compte « administrateur » local
  • Eviter de créer un compte local sur tous les postes de travail, avec le même mot de passe

Par défaut, le compte « administrateur » est désactivé sous Windows 7.

Il ne nous reste donc plus qu’à créer un nouveau compte local respectant les bonnes pratiques.

Pour se faire, j’ai écrit un script PowerShell qui créé un nouveau compte local, l’ajoute au groupe « Administrateurs » et configure son mot de passe.

Ce script peut être intégré à une séquence de tâches. Pour davantage de détails sur l’exécution d’un script powershell dans une séquence de tâches, c’est par ici.

Lire la suite[PowerShell] Créer un compte administrateur local

PowerShell – Copier le contenu d’un package sur le poste de travail

Vous avez certainement rencontré le besoin de copier le contenu d’un package SCCM sans pour autant avoir à exécuter un programme. Aucune tâche native dans un programme ou une séquence de tâches ne vous permet de réaliser cette action.

C’est la raison pour laquelle je vous propose ce petit script qui vous donnera une base de travail.

Lire la suitePowerShell – Copier le contenu d’un package sur le poste de travail