[SCCM] Le déplacement de la base de données du site génère un arrêt du service

Bonjour à tous,

J’ai rencontré ce jour un problème suite au déplacement d’une base de données SCCM vers un nouveau volume.
Suite au déplacement, la console SCCM ne se lance plus. En ouvrant le fichier SMSPROV.log sur le serveur SCCM on peut constater les messages d’erreur suivants :

*** *** Unknown SQL Error! SMS Provider 14-03-2012 07:56:47 2016 (0x07E0)
*~*~*** Unknown SQL Error! ThreadID : 2016 ,  DbError: 50000  , Sev: 16~*~* SMS Provider 14-03-2012 07:56:47 2016 (0x07E0)
*** [24000][0][Microsoft][SQL Server Native Client 10.0]Invalid cursor state SMS Provider 14-03-2012 07:56:48 2016 (0x07E0)
*~*~[24000][0][Microsoft][SQL Server Native Client 10.0]Invalid cursor state *** Unknown SQL Error! ThreadID : 2016 ,
DbError: 0 , Sev: 0~*~* SMS Provider 14-03-2012 07:56:48 2016 (0x07E0)

Lire la suite[SCCM] Le déplacement de la base de données du site génère un arrêt du service

[Windows] Disponibilité de Windows 10 1803

Bonjour à tous,

Microsoft vient de rendre disponible sa nouvelle version de Windows 10, alias 1803 (10.0.17134), ainsi qu’une nouvelle version de son ADK.

Parmi les nouveautés côté expérience utilisateur on peut noter :

  • Timeline
  • Focus Assist
  • Dictée vocale

Concernant les administrateurs voici quelques autres nouveautés intéressantes. On peut noter un effort particulier concernant la sécurité, le déploiement et le respect de la vie privée :

Lire la suite[Windows] Disponibilité de Windows 10 1803

[PowerShell] Interface de sélection d’un dossier

Bonjour à tous,

Voici une petite astuce découverte par Antoine (voir son blog ici) vous permettant d’afficher une fenêtre de sélection de dossier durant l’exécution d’un script PowerShell.

Merci encre à lui pour cette contribution.

1
2
3
$app = new-object -com Shell.Application
$SelectedFolder= $app.BrowseForFolder(0, "Select Folder", 0, "C:\")
$GPOFolderName = $folder.Self.Path

La méthode importante est la méthode $app.BrowseForFolder(arg1, arg2, arg3, arg4), où :

  • Arg1 : ID du thread de la fenêtre parente. Si cette valeur = 0 c’est que la boite de dialogue n’a pas de fenêtre parente
  • arg2 : Titre de la boîte de dialogue
  • arg3 : Options. Placez cette valeur à 0.
  • arg4 : Dossier de la racine

Pour plus d’information sur cette méthode rendez-vous ici.

 

Enjoy 😉

 

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

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