[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] Tester si un système est en attente de redémarrage

Bonjour à tous,

Voici une fonction permettant de tester si un système est en attente de redémarrage, en prenant en compte :

  • Les redémarrages en attente provenant de l’installation d’une fonctionnalité
  • Les redémarrages en attente provenant de l’installation de mises à jour logicielles
  • Les redémarrages en attente provenant de fichiers en attente de renommage (Mise à jour de .dll par exemple)
  • Les redémarrages en attente provenant du client SCCM

Si un de ces composants nécessite un redémarrage la fonction renverra la valeur $true.

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
function Test-RebootRequired
{
    # Initialize result array    $result = @{
        CBSRebootPending = (Get-ChildItem "HKLM:Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending" -ErrorAction SilentlyContinue).CBSRebootPending
        WindowsUpdateRebootRequired = (Get-Item "HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired" -ErrorAction SilentlyContinue).WindowsUpdateRebootRequired
        FileRenamePending = (Get-ItemProperty "HKLM:SYSTEM\CurrentControlSet\Control\Session Manager" -Name PendingFileRenameOperations -ErrorAction SilentlyContinue).FileRenamePending
        SCCMRebootPending = $false
	}
 
    # Complete result Array with SCCM client status
    try 
    { 
        $util = [wmiclass]"\\.\root\ccm\clientsdk:CCM_ClientUtilities"
        $status = $util.DetermineIfRebootPending()
        if(($status -ne $null) -and $status.RebootPending){
            $result.SCCMRebootPending = $true
        }
    }catch{}
 
    # Normalize Result Array
    if ($result.CBSRebootPending -eq $null){ $result.CBSRebootPending = $false }
    if ($result.WindowsUpdateRebootRequired -eq $null){ $result.WindowsUpdateRebootRequired = $false }
    if ($result.FileRenamePending -eq $null){ $result.FileRenamePending = $false }
 
    #Return Reboot required
    return $result.ContainsValue($true)
}

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 😉

[Work Folders] Déploiement d’une solution interne

Bonjour à tous,

Dans  ce nouvel article je vous propose de décrire le déploiement d'une solution Work Folders à usage interne. Cette première implémentation permet de se familiariser avec les différents éléments composant cette fonctionnalité.

Lire la suite[Work Folders] Déploiement d’une solution interne

[Work Folders] Conception d’une solution

Bonjour à tous,

Dans ce deuxième article dédié à la mise en œuvre de Work Folders, nous allons nous pencher sur la conception d'une solution.

L'objectif est de vous présenter les différents scénarii de déploiement de Work Folders ainsi que les critères à prendre en compte afin de concevoir une solution qui vous permettra d'en tirer le meilleur parti.

Lire la suite[Work Folders] Conception d’une solution

[Work Folders] Introduction

On constate actuellement une évolution significative de l’environnement de travail utilisateur. Tout d’abord le nombre de terminaux par utilisateur augmente (il est actuellement de 3 par utilisateurs en Europe). D’autre part l’écosystème matériel se diversifie avec l’apparition de nouveaux facteurs de formes (smartphone, tablette, hybride) sous d’autres systèmes d’exploitation (iOS, Android). Enfin de plus en plus de personnes utilisent leur terminal personnel afin de réaliser des tâches professionnelles telles que l’envoi de mail, etc.

Ces évolutions impliquent des changements dans les usages avec l’apparition de certains risques. Prenons l’exemple du développement de l’utilisation de solutions de stockage de fichiers en ligne (OneDrive, DropBox, etc.) pour stocker et partager des documents professionnels. Ces solutions sont très simples d’utilisation mais présentent l’inconvénient de stocker les données professionnelles dans le Cloud. Dans certains contextes (Santé, innovation, confidentialité, etc.) ce fonctionnement n’est pas permis. Pour autant, l’usage de ces solutions est plébiscité par les utilisateurs du fait de leur simplicité d’utilisation et de leur usage très répandu dans la sphère personnelle.

Lire la suite[Work Folders] Introduction

[Windows] Mise à jour du service KMS pour l’activation de Windows 10

Maintenant que Windows 10 est sorti, vous souhaitez certainement migrer très rapidement votre parc vers Windows 10 … ou à plus forte raison déployer quelques systèmes afin de valider ce nouveau système dans votre environnement. Si vous utilisez un service « Key Management Service » pour activer vos systèmes d’exploitation clients, celui-ci va devoir être mis à jour afin de prendre en charge l’activation du petit dernier de la famille Windows.

Après avoir rapidement balayé les prés-requis à cette opération, je vous propose un petit tutoriel sur la mise à jour du service KMS pour la prise en charge de l’activation de Windows 10 Enterprise.

Lire la suite[Windows] Mise à jour du service KMS pour l’activation de Windows 10

GERER LES PILOTES (3) – Gérer les pilotes dans WDS 2008 R2

Maintenant que nous connaissons les bases pour manipuler les pilotes (sauvegarde des bons pilotes, et manipulation à l’aide de DISM), nous allons pouvoir les intégrer simplement à notre solution de déploiement (WDS, MDT et SCCM). Cet article vous présente la gestion des pilotes dans le rôle WDS de Windows Server 2008 R2.

Lire la suiteGERER LES PILOTES (3) – Gérer les pilotes dans WDS 2008 R2

Windows 7 / Windows Server 2008 R2 : Le Service Pack 1 est disponible

softwareLe service Pack 1 pour Windows Server 2008 R2 et Windows 7 est disponible depuis quelques minutes pour les abonnés Technet, et MSDN. vous pouvez le télécharger en vous rendant sur l’espace de téléchargement technet.

Pour plus d’information sur les apports de ce service pack, rendez-vous ici.

La date de publication sur Windows Update est prévue pour le 22 février prochain.

Enjoy 🙂