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

[Windows Analytics] Nouvelles version du script de déploiement

Bonjour à tous,

Une nouvelle version du script de déploiement de Windows Analytics est disponible ici.

Pour rappel, ce script permet de paramétrer un système afin de permettre l’analyse des données dans votre Workspace OMS et vérifie que tous les prés-requis à la mise en oeuvre de Windows Analytics sont bien respectés. Voici le détail des tâches réalisées par ce script :

  • Configure l’ID commercial ainsi que le niveau de télémétrie
  • Vérifie que le système peut envoyer les informations à Microsoft
  • Vérifie que les derniers correctifs requis sont installés
  • Vérifie que le système n’est pas en attente de redémarrage
  • applique le mode Verbose (si sélectionné en paramètre du script)
  • Initie la collecte des données (pratique quand on est un peu pressé 😉  )

Lire la suite[Windows Analytics] Nouvelles version du script de déploiement

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

Windows 10 – Activer la protection anti-ransomware

Bonjour à tous,

Depuis la sortie de Windows 10 Fall Creator Update (1709) Microsoft a ajouté à son antivirus Windows Defender un module de protection des fichiers contre les menaces de type ransomware. Avec l’apparition et la prolifération de ce type de menaces c’est une bonne initiative de la part de l’éditeur de Redmond.  Cet article vous présente comment activer cette protection.

REMARQUE : Je tiens toutefois à préciser que le présent tutoriel ne doit pas vous  exempter de réaliser une sauvegarde régulière de vos données et de stocker cette dernière sur un média non connecté (type dur externe, média optique ou autres).

Principe de fonctionnement

Le principe de fonctionnement de cette protection est relativement simple : Un certain nombre de dossiers (liste personnalisable) sont protégés par une couche de protection d’accès en temps réel supplémentaire qui n’autorise que certaines applications à modifier leur contenu.

Par défaut les dossiers suivants sont protégés et notez que cette liste est entièrement personnalisable :

  • Documents
  • Documents publics
  • Images publiques
  • Mes Images
  • Vidéos publiques
  • Mes Vidéos
  • Musiques publiques
  • Mes musiques
  • Bureau public
  • Bureau
  • Favoris

Une fois activé, l’accès aux dossiers contrôlés empêche l’accès par les applications non autorisées et vous avertit d’une tentative d’accès ou de modification des fichiers dans ces dossiers.

Activation manuelle

Ouvrez les paramètres de Windows 10 puis sélectionnez “Mise à jour et sécurité” et enfin “Windows Defender“. Cliquez sur le bouton “Ouvrir le centre de sécurité Windows Defender“.

Ce diaporama nécessite JavaScript.

Gestion en entreprise

Notez que l’accès contrôlé au dossiers peut également être géré au niveau de l’entreprise à l’aide :

  • d’une stratégie de groupes
  • d’une commande Powerhsell :Set-MpPreference -EnableControlledFolderAccess Enabled
  • du CSP MDM suivant (Intune ou autres solutions de MDM) : ./Vendor/MSFT/Policy/Config/Defender/GuardedFoldersList

Notez que le paramètre de stratégie de groupe permet d’activer cette fonctionnalité uniquement en mode AUDIT. ainsi l’accès aux dossiers ne sera pas protégé mais chaque tentative d’accès sera journalisée, ce qui peut vous être utile avant de mettre en production cette fonction.

Pour plus d’information sur la configuration de l’accès protégé aux dossiers voici le lien : https://docs.microsoft.com/en-us/windows/threat-protection/windows-defender-exploit-guard/enable-controlled-folders-exploit-guard

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 😉

[SCCM] Nouveau portail de documentation

Bonjour à tous,

Microsoft a dernièrement refondu son portail de documentation technique, en particulier pour EMS et SCCM.
Concernant SCCM voici la nouvelle adresse : https://docs.microsoft.com/fr-fr/SCCM/

Personnellement je trouve ce portail particulièrement agréable à utiliser pour les raisons suivantes :

  • Une meilleure organisation dans les rubriques comparé à la documentation présente sur Technet
  • Une interface responsive donc aisément lisible depuis des supports mobiles
  • Possibilité d’afficher les pages avec un thème clair ou sombre
  • Possibilité de sauvegarder le contenu d’une page au format PDF

D’autre part l’organisation est particulièrement bien pensée. Peu importe le produit, le plan est toujours le même :

  • Comprendre et explorer
  • Mise en route (bien démarrer)
  • Planifier et concevoir
  • Déployer et utiliser

Selon le produit ou la solution, des sections supplémentaires sont accessibles. La documentation de Microsoft Intune bénéficie par exemple d’une section présentant comment utiliser le SDK de Intune pour développer des applications mobiles tirant parti de ce service.

N’hésitez pas et foncez : lire des informations techniques redevient agréable !

Enjoy 😉

 

[SCCM] Fichiers de log dans Configuration Manager

Bonjour à tous,

En cette fin d’année où je dispose d’un peu de temps pour de reprendre de l’oxygène, voici un petit article traduit de l’article Technet suivante : https://technet.microsoft.com/en-us/library/hh427342.aspx.

Chaque élément composant SCCM enregistre son activité dans un fichier de log. Etant donné que le serveur SCCM et le client SCCM sont composés de nombreux éléments on se retrouve confrontés à devoir analyser de nombreux fichiers de logs. De plus, le diagnostic d’une défaillance va vous obliger à consulter plusieurs fichiers.

Cet article énumère les (très nombreux ) logs utilisés dans SCCM et la manière de les exploiter.

Lire la suite[SCCM] Fichiers de log dans Configuration Manager

[SCCM] Corriger les erreurs IIS 500.19

Bonjour à tous,

Lors d’une intervention pour débugger le composant Software Update Point chez un client, je me suis retrouvé confronté à un dysfonctionnement général de IIS. Par conséquent, plus de point de distribution, de point de gestion, etc…

Le dysfonctionnement n’est pas apparu immédiatement, mais seulement après avoir désinstallé le composant SCCM “Software Update Point” et le rôle Windows WSUS. A partir de ce moment on rencontrait systématiquement les erreurs suivantes et ce pour tous les sites Web hébergés par le serveur SCCM :

  • Logs IIS : erreurs 500
  • Mpcontrol.log : “Call to HttpSendRequestSync failed for port 80 with status code 500, text: Internal Server Error”
  • Navigateur Web : erreur 500.19 + Error Code 0x8007007e

Après quelques heures de recherche j’ai finalement trouvé la source du problème dans un article de l’équipe du support IIS : http://blogs.iis.net/webtopics/troubleshooting-http-500-19-errors-in-iis-7
Cet article présente les différents scénarii qui peuvent engendrer une erreur 500.19 pour tous les sites Web hébergés par un serveur IIS. Dans ma situation c’est le scénario 6, identifié par le code d’erreur 0x8007007e (affichée lorsque j’essaie d’ouvrir la page dans IIS) qui m’a permis de comprendre le problème. La désinstallation du rôle WSUS n’a pas retiré toute la configuration du site Web WSUS et en particulier une dépendance déclarée au niveau global, en d’autres termes pour tous les sites et applications Web hébergés par mon serveur.

This problem occurs because the ApplicationHost.config file or the Web.config file references a module that is invalid or that does not exist. To resolve this problem: In the ApplicationHost.config file or in the Web.config file, locate the module reference or the DLL reference that is invalid, and then fix the reference. To determine which module reference is incorrect, enable Failed Request Tracing, and then reproduce the problem.
For above specific error (mentioned in this example), DynamicCompressionModule module is causing the trouble. This is because of the XPress compression scheme module (suscomp.dll) which gets installed with WSUS. Since Compression schemes are defined globally and try to load in every application Pool, it will result in this error when 64bit version of suscomp.dll attempts to load in an application pool which is running in 32bit mode.

la résolution du problème est du coup devenue très simple, à savoir taper la commande suivante :
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-[name='xpress']

cmd

Après un redémarrage du service IIS, tout est rentré dans l’ordre.

Enjoy 😉

[PowerShell] Découverte et personnalisation de PowerShell ISE

Bonjour à tous,

Apparu depuis maintenant quelques années, PowerShell est aujourd'hui incontournable. Pour ceux qui le découvrent, c'est un environnement d'exécution de tâches conçu spécialement pour l'administration des systèmes. Il repose entièrement sur .NET Framework et reprend les fondamentaux de la programmation orientée objet. Il permet aux administrateurs de contrôler et d'automatiser l'administration des systèmes d'exploitation Windows mais aussi de nombreux autres produits comme VMware, SCCM, Exchange, Azure, etc... Bref vous l'aurez compris, il vous sera de plus en plus compliqué de gérer vos environnements tout en ignorant ce composant !

Vous pouvez aborder PowerShell de 2 manières différentes :

  • En lançant la console PowerShell puis en exécutant des commandes comme par exemple dresser la liste de tous les processus actuellement en cours d'exécution (get-process). Après avoir récupéré cette liste vous pouvez stopper certains de ces processus à l'aide de la cmdlet Stop-Process. Dans ce mode de fonctionnement les commandes s'exécutent à votre grés. Aucune préparation n'est nécessaire. On travaille ici à la volée et le travail n'est pas réutilisable
  • En créant un script PowerShell qui prendra en charge l'exécution de nombreuses commandes que vous aurez reliées entre-elles à l'aide d'outils d'algorithmique tels que des conditions, des boucles, des filtres, etc. Ce scénario est particulièrement adapté lorsque vous devez exécuter la même procédure à de nombreuses reprises. L'idée est de décrire la marche à suivre dans ce script puis d'exécuter ce script chaque fois que ce "processus" doit être exécuté.

La rédaction d'un script PowerShell peut être réalisée avec un outil aussi simple que Notepad.exe. Cependant vous conviendrez que ce n'est pas l'outil le plus efficace car il ne permet par exemple pas de débugger ce script ou de bénéficier de coloration syntaxique bienvenue dans tout environnement de développement.

Dès la sortie de PowerShell Microsoft a intégré à Windows un éditeur de script : PowerShell ISE (Integrated Scripting Environment). Cet environnement vous permet de rédiger des scripts PowerShell tout en bénéficiant de nombreuses fonctionnalités :

  • IntelliSense qui vous proposera de compléter automatiquement ce que vous avez commencé à saisir
  • Des snippets ou extraits de code que vous pouvez insérer rapidement et ainsi réduire vos erreurs de saisie
  • Un enregistrement automatique de vos scripts toutes les 2 minutes (et croyez-moi c'est très utile !!)
  • Un debugger vous permettant d'exécuter tout ou partie de vos script en appliquant des points d'arrêt

Dans un premier temps cet environnement vous sera suffisant. Mais PowerShell ISE est un outil particulièrement personnalisable. C'est d'ailleurs son grand point fort. A tel point que plusieurs développeurs se sont "amusés" à ajouter des fonctionnalités supplémentaires qui peuvent être très utiles.

Cet article a pour objectifs de vous donner un aperçu de la personnalisation de l'éditeur PowerShell :

  • Dans un premier temps nous verrons qu'ISE est avant tout un environnement que nous chargeons qui est tout à fait personnalisable
  • Dans un second temps, nous nous focaliserons sur la création de nos propres snippets
  • Enfin je vous présenterai un Add-on permettant de littéralement doper votre ISE :  ISESteroids

Lire la suite[PowerShell] Découverte et personnalisation de PowerShell ISE