PI Services

Le blog des collaborateurs de PI Services

Azure - S'octroyer des permissions sur des souscriptions en tant qu'administrateur global

Les souscriptions, des ressources Azure aux permissions isolées

 

Le rôle Azure administrateur global (global administrateur) est le rôle absolu, il octroie le droit de vie ou de mort sur un tenant Azure, cependant, les irrésistibles souscriptions (subscriptions) n'en ont que faire et un global administrator se fera jeter comme un simple utilisateur s'il tente d'accéder à une ressource Azure auquel il n'a pas accès si tenté qu'il puisse déjà la voir, à moins que..

 

S'octroyer les permissions sur toutes les souscriptions

 

Il existe une fonctionnalité Azure qui permet à un Global admin de se conférer des droits sur toutes les subscriptions existantes et ceci en un clic, pour ce faire :

Connectez-vous à portal.azure.com avec votre compte Global admin et dans la liste déroulante de gauche, ouvrez Properties

En bas de la fenêtre dans la section Access management for Azure ressources basculez le bouton en Yes

 

Attention, ce rôle ne fournit pas le rôle Propriétaire (Owner) sur les subscriptons, il fournit le rôle User Access Administrator à la racine ce qui permet d'accéder au RBAC Azure de la subscription et de s'octroyer les droits voulus.


Pensez à retirer vos droits de la subscription avant de basculer à nouveau le bouton évoqué précédemment en No

 

Pour aller plus loin

Article officiel de Microsoft sur la délégation de permissions sur les souscriptions Azure en tant qu'administrateur global

Article officiel de Microsoft sur le RBAC Azure

Active Directory GPO - Faire du security filtering

Security filtering quésaco ?

 

Les GPO ou group policy management permettent de modifier le comportement des ordinateurs d'un parc Active Directory (AD), allant du simple changement d'écran à l'installation d'un logiciel.
Les GPO sont liés (link) à des Organizational Unit (OU) qui contiennent des objets utilisateurs et/ou ordinateurs.

Il existe des cas ou on souhaiterait appliquer une GPO à une population restreinte d'ordinateurs contenu dans une OU qui contient des ordinateurs qui ne doivent pas recevoir la GPO. C'est la que le filtre de sécurité (security filtering) entre en jeu, à travers l'appartenance à un groupe AD, on peut restreindre l'application d'une GPO aux membres du groupe.

Configurer une GPO pour faire du security filtering

 

Les étapes suivantes ne seront pas évoquées :

  • Création d'une GPO
  • Linker la GPO sur une OU
  • Ajout d'un objet utilisateur/ordinateur dans un groupe de sécurité

 

Etape 1 : modifier les security filtering de la GPO dans l'onglet Scope

 

Voici la configuration par défaut du security filtering d'une nouvelle GPO :

 

Authenticated Users indique que la GPO s'appliquera à n'importe tout objet utilisateur et/ou ordinateur qui sont contenus dans les OU ou la GPO est linkés.

 

On va donc supprimer Authenticated Users et ajouter notre propre groupe de sécurité (Group-Security-Filtering-Test) dans lequel on aura placé un object utilisateur/ordinateur.

A noter que la GPO n'a pas besoin d'être linké sur l'OU qui contient le groupe, elle doit cependant être linkée à l'OU qui contient les utilisateurs/ordinateurs du groupe.

 

Etape 2 : modifier les security filtering de la GPO dans l'onglet Delegation

 

Il faut ensuite se rendre dans l'onglet Delegation et ajouter Authenticated Users (ou Utilisateurs Authentifiés), pour rappel Authenticated Users inclut les utilisateurs et les ordinateurs, inutile donc de chercher un groupe Authenticated Computers inexistant.

 

Il nous est ensuite demander quelle permission on souhaite donner au groupe Authenticated Users on choisit Read

 

Dans l'onglet Delegation on a indiqué à quelle population a le droit de lire la GPO, c'est la configuration effectuée dans l'onglet Scope qui détermine si la GPO doit s'appliquer ou non à l'utilisateur/ordinateur

Azure PowerShell - Forcer la connexion à Azure lorsque le réseau est instable

Un peu de contexte

 

Dans certains environnements la connexion réseau vers Internet et notamment vers Azure peut présenter des défaillances.

Lorsque qu'un administrateur se connecte de façon interactive en PowerShell à Azure, un simple échec importe peu et une nouvelle tentative est souvent fructueuse, lorsque c'est une tâche automatisée qui est exécutée c'est une autre histoire, toutes les actions qui dépendent de cette connexion échouerons si la connexion vers Azure AD est un échec.


Le code

$i = 0 #Variable qui sera incrémentée à chaque nouvelle tentative de connexion à Azure
$ConnectAzureAD = "Fail" #Variable qui permet de sortir de la boucle si une tentative de connexion vers Azure AD est réussite
do #Do until permet d'exécuter un script en boucle tant qu'une condition n'est pas atteinte
{
    try #Try catch permet de choisir comment les erreurs de cmdlet seront gérés, ici on s'en sert pour attendre avant la prochaine tentative de connexion et potentiellement faire du logging
    {
        $i++ #Permet d'incrémenter la variable $i
        Connect-AzureAD #Cmdlet qui permet de se connecter à Azure AD, dans un script automatisé, les identifiants d'un compte de service seront utilisé à l'aide du paramètre -Credential $Credentials (objet PSCredential à créer)
        $ConnectAzureAD = "Success" #La connexion à Azure AD est un succès puisque nous sommes dans le try, on peut donc modifier la variable $ConnectAzureAD pour pouvoir sortir de la boucle, code qui fonctionne de paire avec la condition dans le until 
        #Il est recommandé de consacrer une ligne pour faire du logging
    }

    catch 
    {
        #A nouveau il est recommandé de consacrer une ligne pour faire du logging
        Start-Sleep 10 #Permet de faire une pause de 10 secondes avant la nouvelle tentative de connexion
    }
}
until ($ConnectAzureAD -eq "Success" -or $i -eq 6) #Si une connexion vers Azure AD est réussie ou si 6 tentatives infructueuses ont été observées, le script arrêtera d'essayer de se connecter à Azure AD

 

 

En résumé, le script tentera de se connecter à Azure AD en powershell jusqu'à ce qu'une connexion soit établie ou que 6 tentatives de connexions aient échouées.

Azure Accès Conditionnel - Les dépendances de Teams

Vous avez créé un accès conditionnel pour bloquer toutes les applications à l'exception de Teams mais Teams est toujours bloqué ?

 

Vous êtes au bon endroit, cet article vous explique tout ce qu'il y a à savoir sur les dépendances de Teams dans l'accès conditionnel Azure.

 

La configuration de l'accès conditionnel

Commençons par rappeler la configuration de l'accès conditionnel dont il est question:

Ci-dessous l'utilitaire qui permet de créer un accès conditionnel :

  • Block access
    • Cet accès conditionnel applique un refus de connexion (en opposition à grant/autoriser)
  • All cloud apps included and 1 app excluded
    • Cet accès conditionnel concerne toutes les applications Azure à l'exception d'une application
  • Exclude 
    • Permet d'exclure des applications de l'accès conditionnel
  • Microsoft Teams
    • Teams est exclu de l'accès conditionnel

 

Les dépendances de Teams

Teams est dépendant d'autres applications Microsoft : SharePoint, Exchange, Planner, etc.

Ces applications doivent être également exclues dans l'accès conditionnel pour que Teams puisse fonctionner pleinement.


A noter qu'il existe deux types de dépendances :

  • Des applications qui sont Early-bound policy enforcement
    • Cela signifie que la vérification que l'application dont dépend Teams est présente dans l'accès conditionnel se fait avant la connexion de l'utilisateur. En d'autres termes si l'application n'est pas dans la liste d'exclusion de l'accès conditionnel l'utilisateur ne pourra pas se connecter.
  • Des applications qui sont Late-bound policy enforcement
    • En opposition au Early-bound policy enforcement, l'utilisateur pourra se connecter à Teams mais ne pourra pas bénéficier des services d'une application non exclue dans l'accès conditionnel

 

Voici un schéma récapitulatif :

  • Les traits pleins sont des Early-bound policy enforcement
  • Les traits en pointillés sont des Late-bound policy enforcement

 

 

 

Pour aller plus loin


Article officiel de Microsoft sur les dépendances de Teams dans l'accès conditionnel

Comment déterminer le type de client (OWA, Outlook, Mobile) utilisé pour un mail envoyé

Dans certains cas, on nous demande de déterminer quel type de client a été utilisé pour envoyer un mail particulier. 

Pour ce faire, utiliser les journaux de suivi des messages dans Exchange 2010, Exchange 2013 ou Exchange 2016.

Dans les journaux de suivi des messages, il existe un champ SourceContext qui signale la propriété ClientType pour les événements SUBMIT. Les événements SUBMIT sont générés quand le service de soumission de transport de boîte aux lettres transmet un message au service de transport, c’est-à-dire lorsque le serveur Exchange récupère le courrier électronique de la boîte d’envoi de la boîte aux lettres et le transmet pour remise.

A noter qu'il n’y a pas d’événement SUBMIT lorsqu’un expéditeur externe envoie un e-mail à un utilisateur interne. Cela signifie qu’il n’y a pas de propriété ClientType pour ces e-mails.

  • Pour vérifier le type de client pour un e-mail envoyé, exécuter la commande suivante dans un environnement Exchange powershell et regarder le champ SourceContext pour l’e-mail en question:

Get-MessageTrackingLog -ResultSize Unlimited -Start "10/20/2021 10:00" -EventID SUBMIT | fl TimeStamp,Sender,Recipients,MessageSubject,SourceContext

  • La valeur du champ SourceContext peut être :
  • AirSync--> il s’agit du client ActiveSync : le mail est envoyé depuis un périphérique mobile
  • OWA--> il s’agit du client Webmail : le mail est envoyé depuis l’interface exchange web mail
  • MOMT--> il s’agit des clients qui se connectent à l'aide d'Outlook ou toute autre application via RPC/HTTP ou MAPI/HTTP 

 Les e-mails de surveillance ont également un type de client qui est Monitoring

MECM (SCCM) : Windows 10 Servicing Upgrade, la fameuse erreur "L'opération n'a pas été effectuée car il n'y a pas d'utilisateur interactif connecté"

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, il y a une erreur connue qui bloque la migration et bloque même le Retry.

L'erreur est la suivante : "L'opération n'a pas été effectuée car il n'y a pas d'utilisateur interactif connecté"

Cette erreur aura lieu quand il y a vraiment besoin d'une intervention utilisateur et que le mécanisme de mise à niveau Windows 10 en arrière plan ne peut pas remédier au problème automatiquement, généralement c'est l'un de ces deux cas :

1. Il y a un antivirus qui bloque la migration ou tout autre outil qui doit être mis à jour ou désinstallé

On peut détecter ce genre de problème en se connectant sur la machine, ouvrir le chemin suivant C:\$WINDOWS~BT\Sources\Panther, puis ouvrir le fichier CompatData*.xml le plus récemment modifié (c'est le fichier qui contient les données de scan de compatibilité)

Dans la capture ci-dessus, c'est l'outil de sécurité Check Point Endpoint Security qui a bloqué la migration Windows 10.

Vous pouvez utiliser le lien Microsoft qui est proposé dans le fichier xml pour trouver une solution.

2. Reset manuel de la migration

Pas mal de fois, le fichier de compatibilité CompatData*.xml ne contient aucun bloqueur dur de la migration et pourtant elle est bloquée.

Dans ce cas, il faut manuellement faire un reset de la migration par la suppression du dossier "$WINDOWS~BT" et le nettoyage du contenu du dossier "C:\Windows\SoftwareDistribution\Download".

Une fois ces actions sont faites, la migration fait un Retry automatiquement.

 

Remarque:

"$WINDOWS~BT" est un dossier caché

SCCM - SQL Query - Inventaire Software, Executables et AddRemove Programs

La requête ci-dessous fait un 'UNION' entre trois requêtes sur les vues [v_GS_INSTALLED_SOFTWARE_CATEGORIZED], [v_GS_INSTALLED_EXECUTABLE] et [v_ADD_REMOVE_PROGRAMS] pour obtenir un inventaire logiciel un peu plus "avancé".

N.B: Modifiez la variable @CollectionID si besoin pour réduire le scope des machines concernées, et éviter un nombre conséquent de ligne renvoyées.

 

/* --- SOFTWARES, EXECUTABLES, AND ADD-REMOVE PROGRAMS ENTRIES INVENTORY ---  
 NB: UNION ENTRE LES VUES:
	 [v_GS_INSTALLED_SOFTWARE_CATEGORIZED] 
	 [v_GS_INSTALLED_EXECUTABLE]
	 [v_ADD_REMOVE_PROGRAMS]
	 
	       
 NB: DES COLONNES SONT CREES ET POSITIONNEE A NULL POUR POUVOIR EFFECTUER LE UNION. (Meme nombre de colonnes) 

v_GS_INSTALLED_SOFTWARE_CATEGORIZED
Répertorie des informations sur les applications logicielles installées sur Configuration Manager clients trouvés via Asset Intelligence. 
Cette vue contient les informations contenues dans le v_GS_INSTALLED_SOFTWARE afficher et joint plusieurs autres tables pour fournir des détails supplémentaires sur les logiciels installés.

v_GS_INSTALLED_EXECUTABLE
Répertorie des informations sur les fichiers exécutables de l’application logicielle installée sur Configuration Manager clients trouvés via Asset Intelligence.

[v_ADD_REMOVE_PROGRAMS]
Combination of 32 and 64 bit programs data in 'Add Remove Programs'
*/



DECLARE @CollectionID as Varchar(8)
SET @CollectionID = 'SMS00001' --Specify the collection ID


SELECT  DISTINCT 

TAB.ResourceID
,TAB.ProductCode
,TAB.[Machine Name]
,TAB.OS_Name
,TAB.Publisher0
,TAB.NormalizedPublisher
,TAB.ExecutableName
,TAB.ProductName
,TAB.AddRemove_Name
,TAB.NormalizedName
,TAB.FamilyName
,TAB.CategoryName
,TAB.InstallDate
,TAB.Soft_Autostart
,TAB.EXE_FilePath
,TAB.EXE_Description
,TAB.ProductVersion
,TAB.EXE_FileVersion



 FROM (


SELECT 
SYST.ResourceID,
UPPER(SOFT.ProductCode0) as ProductCode,
SYST.Name0 as 'Machine Name',

-- OS Info --
OS.Caption0 as OS_Name,

-- SOFT INFO --
SOFT.Publisher0,
SOFT.NormalizedPublisher,
NULL as ExecutableName,
SOFT.ProductName0 as ProductName,
NULL as AddRemove_Name,
SOFT.NormalizedName,
SOFT.FamilyName,
SOFT.CategoryName,
SOFT.ProductVersion0 as ProductVersion,


SOFT.InstallDate0 as InstallDate,


CASE 
	WHEN AUTOSTART_SOFT.Product0 IS NULL THEN 'NO'
	ELSE 'YES'
	END as Soft_Autostart,

NULL as EXE_FilePath,
NULL as EXE_Description,
NULL as EXE_FileVersion


FROM [dbo].[v_GS_INSTALLED_SOFTWARE_CATEGORIZED] SOFT
FULL JOIN v_R_System SYST on SYST.ResourceID = SOFT.ResourceID
FULL JOIN [dbo].[v_GS_OPERATING_SYSTEM] OS on OS.ResourceID = SYST.ResourceID
FULL JOIN [dbo].[v_GS_AUTOSTART_SOFTWARE] AUTOSTART_SOFT on AUTOSTART_SOFT.Product0 = SOFT.ProductName0   -- TO MAKE RELATION WITH AUTO-START SOFTWARE
FULL JOIN v_FullCollectionMembership on (v_FullCollectionMembership.ResourceID = SYST.ResourceID)

WHERE v_FullCollectionMembership.CollectionID = @CollectionID


  
UNION 
 

SELECT 
  

SYST.ResourceID,
UPPER(EXE.ProductCode0) as ProductCode,
SYST.Name0 as 'Machine Name'

-- OS Info --
,OS.Caption0 as OS_Name

,EXE.Publisher0
,NULL as NormalizedPublisher
,EXE.ExecutableName0 as ExecutableName
,EXE.Product0 as ProductName
,NULL as AddRemove_Name
,NULL as NormalizedName
,NULL as FamilyName
,NULL as CategoryName 
,EXE.ProductVersion0 AS ProductVersion
,NULL as InstallDate
,NULL as Soft_Autostart

,EXE.InstalledFilePath0 as EXE_FilePath
,EXE.Description0 as EXE_Description
,EXE.FileVersion0 AS EXE_FileVersion


FROM [dbo].[v_GS_INSTALLED_EXECUTABLE] EXE
  
  FULL JOIN v_R_System SYST on SYST.ResourceID = EXE.ResourceID
  FULL JOIN [dbo].[v_GS_OPERATING_SYSTEM] OS on OS.ResourceID = SYST.ResourceID
  FULL JOIN v_FullCollectionMembership on (v_FullCollectionMembership.ResourceID = SYST.ResourceID)
 
 WHERE v_FullCollectionMembership.CollectionID = @CollectionID
 
  
  
UNION


SELECT
ARP.ResourceID
,UPPER(ARP.ProdID0) as ProductCode
,SYST.Name0 as 'Machine Name'
-- OS Info --
,OS.Caption0 as OS_Name
,ARP.Publisher0
,NULL as NormalizedPublisher
,NULL as ProductName
,NULL as ExecutableName
,ARP.DisplayName0 as AddRemove_Name
,NULL as NormalizedName
,NULL as FamilyName
,NULL as CategoryName 
,ARP.Version0 AS ProductVersion 

,CASE
WHEN ISDATE(ARP.InstallDate0) <> 0 THEN CONVERT(date,ARP.InstallDate0)
WHEN ISDATE(ARP.InstallDate0) = 0 THEN NULL
END AS InstallDate

,NULL as Soft_Autostart
,NULL as EXE_FilePath
,NULL as EXE_Description
,NULL as EXE_FileVersion

FROM [dbo].[v_ADD_REMOVE_PROGRAMS] ARP
FULL JOIN v_R_System SYST on SYST.ResourceID = ARP.ResourceID  
FULL JOIN v_FullCollectionMembership on (v_FullCollectionMembership.ResourceID = SYST.ResourceID)
INNER JOIN [dbo].[v_GS_OPERATING_SYSTEM] OS on OS.ResourceID = SYST.ResourceID  

WHERE v_FullCollectionMembership.CollectionID = @CollectionID 
  
  ) AS TAB

 

 

 

 

 

Exchange - Redémarrage des serveurs après création du DAG

Symptômes et Diagnostic:

- Après la configuration du DAG, les serveurs Exchange redémarrent d'une manière inattendue et fréquente.

- Le message d'erreur "The computer has rebooted from a bugcheck.  The bugcheck was: 0x000000ef (0xffffe0016a359900, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000). A dump was saved in: C:\Windows\MEMORY.DMP. Report Id: 090915-32687-01" est repéré au niveau des journaux d'évènements système.

- Exécuter commande PowerShell suivante sur le serveur Exchange affecté afin de déterminer quel Probe provoquant le redémarrage des serveurs:

(Get-WinEvent -LogName Microsoft-Exchange-ManagedAvailability/* | % {[XML]$_.toXml()}).event.userData.eventXml| ?{$_.ActionID -like "*ForceReboot*"} | ft RequesterName

--> Responder ServiceHealthMSExchangeReplForceReboot entraine le redémarrage des serveurs Exchange Mailbox

- Afin de confirmer que le redémarrage du serveur est bien dû au ServiceHealthMSExchangeReplForceReboot, exécuter la commande:

Get-WinEvent -LogName Microsoft-Exchange-ManagedAvailability/* | where {$_.Message -like "*ServiceHealthMSExchangeReplForceReboot*"} | ft Message,TimeCreated

 Explications et Résolution:

- Avec le nouveau concept « Managed Availability » s’exécutant sur tous les serveurs Exchange pour surveiller l’intégrité des serveurs, ce processus analyse des centaines de mesures d’intégrité et lorsque quelque chose ne va pas se produit, une action sera appelée pour corriger ce problème.

- Dans certains cas, lorsque "Managed Availability" effectue une action de récupération à partir d’une erreur, il est intéressant de savoir quelles mesures d’intégrité "Probe" sont utilisées pour décider que le composant ou le serveur Exchange a besoin d’un correctif.

- Cause: Les cartes réseaux sont mal configurées sur les serveurs Exchange, ce qui entraîne une défaillance de la résolution du nom DNS et le redémarrage des serveurs.

- Dans ce cas de figure et pour résoudre le problème décrit ci-dessus, la case "Enregistrer les adresses de cette connexion dans le système DNS" doit être cochée.

 

 

SCCM - SQL Query - Inventaire avancé de l'état des mise a jours.

 

La requête SQL ci-dessous propose un inventaire avancé des patchs de mise a jour installés ou requis sur les machines cibles.

Les variables @StartDate et @EndDate sont utilisées pour limiter la date de création du patch.

 

	/* PATCH REQUIRED OR INSTALLED STATUS FOR ALL SERVERS WITH SOFTWARE UPDATE GROUP INFO */
	DECLARE @Collection varchar(8)
	DECLARE @StartDate DATETIME, @EndDate DATETIME
	SET @Collection = 'SMS00001' -- Collection ID for All Systems
	-- Since 1 months
	SET @StartDate = DATEADD(mm, -1,GETDATE())
	SET @EndDate = GETDATE() 
	
	SELECT DISTINCT  VRS.Name0 as 'MachineName',
	Os.Caption0 as 'OperatingSystem',
	CASE
		WHEN summ.ClientActiveStatus = 0 THEN 'Inactive' 
		WHEN summ.ClientActiveStatus = 1 THEN 'Active' 
		end as 'ClientActiveStatus',
	CASE 
		WHEN LastHealthEvaluationResult = 1 THEN 'Not Yet Evaluated' 
		WHEN LastHealthEvaluationResult = 2 THEN 'Not Applicable'
		WHEN LastHealthEvaluationResult = 3 THEN 'Evaluation Failed' 
		WHEN LastHealthEvaluationResult = 4 THEN 'Evaluated Remediated Failed' 
		WHEN LastHealthEvaluationResult = 5 THEN 'Not Evaluated Dependency Failed' 
		WHEN LastHealthEvaluationResult = 6 THEN 'Evaluated Remediated Succeeded'
		WHEN LastHealthEvaluationResult = 7 THEN 'Evaluation Succeeded'
		end as 'Last Health Evaluation Result',
	CASE 
		WHEN LastEvaluationHealthy = 1 THEN 'Pass'
		WHEN LastEvaluationHealthy = 2 THEN 'Fail'
		WHEN LastEvaluationHealthy = 3 THEN 'Unknown'
		end as 'Last Evaluation Healthy',
	CASE 
		WHEN summ.ClientRemediationSuccess = 1 THEN 'Pass' 
		WHEN summ.ClientRemediationSuccess = 2 THEN 'Fail' ELSE '' 
		end as 'ClientRemediationSuccess',
	
	
	UI.Title as 'Title',
	UI.ArticleID as 'ArticleID',
	UI.BulletinID as 'BulletinID',
	UI.DatePosted,
	UI.DateCreated,
	UI.DateLastModified,
	
	CASE UI.Severity
		WHEN 0 THEN 'None'
		WHEN 2 THEN 'Low'
		WHEN 6 THEN 'Moderate'
		WHEN 8 THEN 'Important'
		WHEN 10 THEN 'Critical'
		end as Patch_Severity,

        CASE UI.IsExpired 
		WHEN 0 THEN 'NOT EXPIRED' 
		WHEN 1 THEN 'EXPIRED' 
		END AS [EXPIRY],
	
	CASE UI.IsSuperseded 
		WHEN 0 THEN 'NOT Superseded' 
		WHEN 1 THEN 'Superseded' 
		END AS [SUPERSEDENCE],


	CASE 
		WHEN UCS.Status = 2 THEN 'Required'
		WHEN UCS.Status = 3 THEN 'Installed'
		ELSE 'Unknown' END AS 'KBStatus',
	UI.InfoURL as 'InformationURL', 
	KB_AND_SUG.Title as SoftwareUpdateGroup,

	
	CASE 
		WHEN USS.LastScanState = 0 THEN 'unknown'
		WHEN USS.LastScanState = 1 THEN 'waiting for catalog location'
		WHEN USS.LastScanState = 2 THEN 'running'
		WHEN USS.LastScanState = 3 THEN 'completed'
		WHEN USS.LastScanState = 4 THEN 'pending retry'
		WHEN USS.LastScanState = 5 THEN 'failed'
		WHEN USS.LastScanState = 6 THEN 'completed with errors'
		END as LastScanState,

	USS.ScanTime,
	USS.LastScanTime,
	USS.LastErrorCode,
	USS.LastStatusMessageID
	
	FROM v_R_System VRS
	INNER JOIN v_UpdateComplianceStatus UCS ON UCS.ResourceID = VRS.ResourceID
	INNER JOIN v_UpdateInfo UI ON UCS.CI_ID = UI.CI_ID
	INNER JOIN v_UpdateScanStatus USS on VRS.ResourceID = USS.ResourceID
	INNER JOIN v_CICategories_All CIC ON UI.CI_ID = CIC.CI_ID
	
	
	INNER JOIN v_CH_ClientSummary summ on Vrs.ResourceID = summ.ResourceID
	INNER JOIN v_GS_OPERATING_SYSTEM Os on UCS.ResourceID = Os.ResourceID
	INNER JOIN Computer_System_DATA St on UCS.ResourceID = st.MachineID
	INNER JOIN v_FullCollectionMembership Col on UCS.ResourceID = Col.ResourceID
	
/* JOINTURE POUR OBTENIR L'INFO DU SOFTWARE UPDATE GROUP AUQUEL APPARTIENS LE PATCH */
INNER JOIN (SELECT DISTINCT
		upd.ArticleID,
		AL.Title
		FROM vSMS_CIRelation as cr
		INNER JOIN fn_ListUpdateCIs(1033) upd ON  upd.CI_ID = cr.ToCIID AND cr.RelationType = 1
		INNER JOIN v_CIToContent CC ON cc.CI_ID=upd.CI_ID
		INNER JOIN v_AuthListInfo AL ON al.CI_ID =cr.FromCIID
		) KB_AND_SUG on UI.ArticleID = KB_AND_SUG.ArticleID
		
	--WHERE VRS.Operating_System_Name_and0 like '%Server%'
	AND Col.CollectionID = @Collection
	AND DateCreated BETWEEN @StartDate AND @EndDate
	--AND CategoryInstanceName = 'Security Updates' -- Only Security Updates
	
	ORDER BY DateCreated DESC
	

 

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é