Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles à la une

MECM (SCCM) : Windows 10 Servicing Upgrade – Problèmes connus

Dans un projet de migration de Windows 10 vers une nouvelle version en utilisant les mises à jour de fonctionnalités de Microsoft Endpoint Configuration Manager, on peut citer quelques problèmes connus et comment les corriger ou contourner.

  1. Problèmes de compatibilité
  • La version de Trend Micro n’est pas à jour (les versions inférieures à 6.7.x bloquent) > Migration bloquée

        > Solution: désinstaller Trend Micro ou mettre à jour la version

  • Client VMWare Workstation installé (les versions VMWare v12.5.7 et v12.1 ou inférieures bloquent) > Migration bloquée

        > Solution: Désinstaller VMWare Workstation Client ou mettre à jour la version installée

  • Le pilote Bluetooth Realtek n’est pas prêt pour la migration vers Windows 10 > Migration bloquée

        > Solution: Mettre à jour le pilote Bluetooth vers la version 1.5.1012 ou ultérieure

Source : <https://support.microsoft.com/en-us/help/4529832/updating-to-windows-10-version-1903-on-devices-with-some-driver-versio>

Impact sur l’utilisateur : aucun impact

  1. Le client est considéré comme conforme sans avoir vraiment installé la mise à niveau vers Windows 10
  • Vérifiez si l’ordinateur voit la mise à jour des fonctionnalités de Windows 10 comme requise dans SCCM

        > Si la mise à jour n’est pas requise, vérifiez si la langue du système d’exploitation est dans le scope de la migration ou si la version actuelle du système d’exploitation est trop vieille pour la version de mise à niveau cible

Impact sur l’utilisateur : aucun impact

  1. L’installation est « In progress » avec l’état « successfully installed update(s) »
  • Il s’agit d’un bug connu avec la version SCCM 1906 où les clients Configuration Manager détectent incorrectement l’état de cogestion

        > Solution: Installez le correctif SCCM KB4529827 (https://www.prajwaldesai.com/configuration-manager-1906-hotfix-kb4529827/)

Impact sur l’utilisateur : aucun impact

  1. Problèmes de corruption de mise à niveau
  • Erreur de délai d’expiration (l’ordinateur est trop lent ou trop utilisé pour dépasser le temps autorisé pour l’installation)
  • Erreur de travail annulée en raison de la déconnexion de l’utilisateur, du redémarrage de l’ordinateur ou de la mise en mode veille de l’ordinateur

        > Solution: attendez que le client réessaye automatiquement la tâche de mise à niveau

Impact sur l’utilisateur : aucun impact

  1. Problème de Rollback
  • Ordinateur bloqué après le redémarrage pour finaliser la mise à niveau de Windows avec les options suivantes :
    • Windows Rollback
    • Windows 10 (avec numéro de volume spécifié)
    • Windows 10 (avec numéro de volume spécifié)

        > Solution: choisissez l’option Windows Rollback

Impact sur l’utilisateur : faible impact

– Cliquez sur Windows Rollback et attendez environ 10 à 15 minutes pour récupérer l’écran de connexion Windows

 

Remarques :

  • L’impact sur l’utilisateur indique si l’utilisateur est bloqué pour travailler. S’il n’y a aucun impact c’est que l’utilisateur ne s’est même pas rendu compte du problème et que tout s’est passé en arrière plan.
  • Les fichiers log à analyser pour détecter le problème rencontré :

        – C:\Windows\CCM\Logs\UpdatesDeployment.log

        – C:\$WINDOWS.~BT\Sources\Panther\setupact.log

        – C:\$WINDOWS~BT\Sources\Panther\CompatData*.xml (le fichier le plus récemment modifié)

        N.B: « $WINDOWS~BT » est un dossier caché

MECM (SCCM) : Script de maintenance WSUS pour changer wsyncmgr purge des mises à jour expirées de 7 jours à 0 jour

Microsoft Endpoint Configuration Manager est capable de supprimer automatiquement le contenu des mises à jour logicielles des points de distribution lorsque ce contenu est lié à des mises à jour expirées. Ce processus permet de gérer l’espace disque sur vos points de distribution en supprimant tout contenu dont vous n’avez plus besoin.

Si celles-ci ne se trouvent dans aucun groupe de mises à jour logicielles, ConfigMgr purgera automatiquement les mises à jour expirées après 7 jours. Vous pouvez modifier le nettoyage à 0 jour si vous souhaitez que les composants wsyncmgr suppriment immédiatement les mises à jour expirées (en supposant qu’ils ne soient pas dans un groupe de mises à jour logicielles). On appelle ce nombre de jours, âge de nettoyage des mises à jour (Updates Cleanup Age)

Ci-dessous un script VBS qui permet de changer la valeur de l’âge de nettoyage des mises à jour sur votre ConfigMgr :

On Error Resume Next

'***  Define string variables for device, device Resource ID and user of interest

Class_Name = 		"SMS_SCI_Component"
Class_ItemName =	"SMS_WSUS_SYNC_MANAGER|<<<***CHANGEME***SCCMSERVERNAMEHERE>>>.YOURDOMAIN.COM"
Class_ItemType =	"Component"
Property_Name = 	"Updates Cleanup Age"
Property_SiteCode = 	"*****SCCMSITECODEHERE*****"
DesiredValue =		0

'***  Check parameters - we need the provider server name and the site code

set args=wscript.arguments

If args.Count = 2 then
	SMSProviderServer = UCASE(Wscript.Arguments(0))
	SiteCode = UCASE(Wscript.Arguments(1))
Else
	wscript.Echo "Incorrect command line arguments." & vbCrLf & "Usage: cscript /nologo ModifySCFProperty.vbs <smsproviderserver> <sitecode>" & vbCrLf & "Example: cscript /nologo ModifySCFProperty.vbs SERVER1 S01 > schedules.txt" & vbCrLf
	WScript.Quit(1)
End If


'***  Connect to the provider - report the error and terminate on failure

SMSProviderServer = "\\" + SMSProviderServer + "\"
Set ObjSvc = GetObject("winmgmts:" & "{impersonationLevel=Impersonate,authenticationLevel=Pkt}!" & SMSProviderServer & "root\sms\site_" & SiteCode)

If Err.Number <> 0 Then
	wscript.Echo "Failed to connect to provider server with code: " & Err.Number & ".  Aborting!"
	WScript.Quit(2)
End If

'***  Get the desired instance of the class

Set objInst = ObjSvc.Get(Class_Name & ".ItemName='" & Class_ItemName & "',ItemType='" & Class_ItemType & "',SiteCode='" & Property_SiteCode &"'")

If Err.Number <> 0 Then
	WScript.Echo "Failed to open desired object with error code " & Err.Number & " (" & Err.Description & ").  Aborting!"
	WScript.Quit(3)
End If

'***  Loop through the Properties until we find a match or run out

bFoundProperty = False

For Each objProp in objInst.Props
	If objProp.PropertyName = Property_Name Then
		bFoundProperty = True
		Exit For
	End If
Next

If bFoundProperty = False Then
	WScript.Echo "Desired object was found but property was not found.  Exiting without making any changes."
	WScript.Quit(4)
End If	

'***  Property found so check to see if existing value matches desired, changing it as appropriate

If objProp.Value = DesiredValue Then
	WScript.Echo "Property '" & Property_Name & "' found with desired value '" & DesiredValue & "'.  Not making any changes."
	WScript.Quit(0)
Else
	OriginalValue = objProp.Value
	objProp.Value = DesiredValue
	objProp.Put_
	objInst.Put_

	If Err.Number <> 0 Then
		wscript.Echo "Failed to save the desired change with code: " & Err.Number & ".  Aborting!"
		WScript.Quit(5)
	Else
		WScript.Echo "Property '" & Property_Name & "' successfully changed from '" & OriginalValue & "' to '" & DesiredValue & "'."
	End If
End If

 

Sources:

https://docs.microsoft.com/en-us/troubleshoot/mem/configmgr/software-update-maintenance

https://www.reddit.com/r/SCCM/comments/ab7v6f/software_updates_remove_old_ones/

https://youtu.be/wqBaTp855sk?t=1765

https://setupconfigmgr.com/wp-content/uploads/2018/06/Adjust-WSync_UpdateCleanupAge.zip

Powershell : Trouver la date de dernière connexion d’un utilisateur.

Comme vous le savez l’un des attributs qui nous est le plus important pour déterminer l’inactivité d’un compte est l’attribut « LastLogon« , ce dernier permet de connaitre la dernière authentification valide d’un compte Active Directory.

Le problème c’est que ce dernier n’est pas répliqué entre les DCs, attention je parle bien du « LastLogon » et non le « LastLogonTimeStamp » qui lui l’est mais, ne détient pas la valeur réelle de la dernière authentification réussie.

Le « LastLogon » n’est pas répliqué entre les DCs pour une raison simple, éviter les « tempêtes » de réplication entre les DCs, imaginez, à chaque ouverture / déverrouillage de session cette valeur change, si vous pensez au nombre de fois que sont déverrouillées des sessions à la journée, cela vous donne une idée des réplications qui seraient nécessaires, par conséquent cet attribut n’est pas répliqué.

Ce qui pose donc problème c’est qu’il n’est pas possible d’avoir la réelle valeur de « LastLogon » sans devoir interroger l’intégralité des DCs et faire une comparaison de cette dernière.

Voici un script qui fera les requêtes et comparaisons pour vous, toutefois gardez à l’esprit qu’il va pour chaque utilisateur demander la valeur de l’ttribut « LastLogon » à chaque DC, par conséquent ce script peut prendre plus ou moins de temps à s’exécuter en fonction du nombre d’utilisateur et du nombre de DCs.

$Array = @()
$AllDC = Get-ADDomainController -Filter * | sort Name | select Name
$AllEnabledUsers = Get-ADUser -Filter {Enabled -eq $true} | select Samaccountname

$AllEnabledUsers | select -First 5 | foreach {
    $CurrentUser = $_.Samaccountname
    $RealLastLogon = $null

    $AllDC | foreach {
        $CurrentDC = $_.Name

        Try {
            $Logon = Get-ADUser $CurrentUser -Properties LastLogon -Server $CurrentDC
            $LastLogon = [Datetime]::FromFileTime($Logon.LastLogon)
            If ($LastLogon -gt $RealLastLogon) {
                $RealLastLogon = $LastLogon
                }

            # Release variable
            $LastLogon = $null
            }
        Catch {
            Write-Warning $($_)
            }

        # Release variable
        $CurrentDC = $null
        }
    
    # Store Data
    $Array += New-Object psobject -Property @{
        DistinguishedName = $Logon.DistinguishedName
        Enabled = $Logon.Enabled
        GivenName = $Logon.GivenName
        Name = $Logon.Name
        ObjectClass = $Logon.ObjectClass
        ObjectGUID = $Logon.ObjectGUID
        SamAccountName = $Logon.SamAccountName
        SID = $Logon.SID
        Surname = $Logon.Surname
        UserPrincipalName = $Logon.UserPrincipalName
        LastLogon = $RealLastLogon
        }
        
    # Release Variables
    $CurrentUser = $null
    $RealLastLogon = $null
    }


Il ne vous restera qu’a examiner la sortie en rappelant la variable « $Array » ou à l’exporter dans un CSV comme ci-dessous par exemple.

$Array | Export-Csv C:\Temp\AllUsersWithLastLogon.csv -Delimiter ";" -Encoding UTF8 -NoTypeInformation

 

Si la valeur « LastLogon » est égale à « 01/01/1601 01:00:00 » cela veut dire que le compte ne s’est jamais connecté