PI Services

Le blog des collaborateurs de PI Services

MECM : Utiliser CMPivot pour filtrer un EventID spécifique sur un regroupement de machines

Besoin :

Filtrer un EventID spécifique pour un intervalle de temps bien défini sur un regroupement de machines.

 

Solution :

Cela est possible en utilisant CMPivot de MECM.

CMPivot permet de sortir toutes les occurrences d'un EventID sur une période définie sur le regroupement de machines souhaitée.

Ci-dessous une requête CMPivot pour filtrer l'EventID 1034 de type Application sur une période de 365 jours :

EventLog('Application',365d) | where EventID == 1034

Compactage de l'.ost

Contexte : Le fichier de donnée Outlook atteint sa masse critique et a pour conséquence des lenteurs et bugs dès l'ouverture de la messagerie.

 

Pour réduire le poids du fichier .ost sans avoir à télécharger à nouveau la BAL en supprimant ce fichier.

Ouvrir Outlook >Fichier >paramètre de compte >sélection de la boite >paramètres supplémentaires >paramètre du fichier de donnée Outlook >bouton Compresser

Modifier

Paramètres supplémentaires

Compresser

 
 

 

Windows Admin Center – Analyseur de Performance (Perfmon)

Windows Admin center propose bien sur entre autres l’accès a l’analyseur de performance (Perfmon) de la machine gérée à distance.

 

Par défaut, aucun compteur n’est affiché

Cliquer sur «Espace de travail vide »

Enregistrer avant tout l’espace de travail qui contiendra les compteurs

Donner un nom explicite et enregistrer l’espace de travail

 

Ajouter un compteur

Dans cet exemple on ajoute : Processor / _Total / % Processor Time et l’on sélectionne le style de graphique «Ligne ».

Il est possible d’afficher aussi le style Min-Max :

Ou carte thermique :

Ajoutez d’autres compteurs et forme d’affichage en fonction des besoins.

Pensez a enregistrer en écrasant la version précédente

Il est également possible de télécharger l’espace de travail au format JSON:

  

Ci-dessous le fichier JSON obtenu.

On peut voir que sa modification peut être assez facilement automatisé afin d’ajouter d’autres compteurs (object,instances,instancename,type)

Enfin, en cas de suppression sur la machine concernée on plus pratiquement pour obtenir le même espace de travail sur une autre machine, il est possible de charger le fichier JSON :

Glissez le fichier dans la fenêtre

Cliquez Envoyer

Cliquez sur l’espace de travail pour l’afficher

*********************************************************

 

 

 

 

 

 

 

 

 

 

 

MECM : Variables d'environnement OSD peuvent contenir des mots de passe en clair

Besoin :

Durant l'OSD, j'ai remarqué quand je fais F8 pour ouvrir l'invite de commande, je peux exporter une liste de variable d'environnement de la TS qui contiennent des valeurs non masquées, y compris des mots de passe. Ces deux variables par exemple ne sont pas masqués :

  • "OSDLocalAdminPassword" : contient le mot de passe du compte admin local qui est mis sur la machine en cours d'installation
  • "_SMSTSReserved1-000" et "_SMSTSReserved2-000" : contiennent le Username et Password du compte ConfigMgr Nework Access (NAA)

Le besoin est d'éviter de laisser ces deux variables visibles.

Solution :

Arrêter d'utiliser le compte Network Access et le supprimer de la configuration. Depuis ConfigMgr 1902, cela n'est plus nécessaire dans presque tous les scénarios tant que vous activez le enhanced HTTP.

Pour l’administrateur local, une réponse similaire. Les systèmes de production ne doivent pas avoir ce compte activé et vous devez autoriser Windows à configurer un mot de passe aléatoire pour celui-ci.

Intune : Intégration manuelle du Hash ID avec le mode Online

Besoin :

Intégrer manuellement le Hash ID d'un device Autopilot dans Intune sans passer par la clé USB et le fichier csv.

 

Solution :

Ceci est possible en utilisant le mode Online du script PowerShell "Get-WindowsAutopilotInfo.ps1".

Une fois Windows est démarré et que vous êtes sur la page OOBE (Out Of the Box Experience) et connectés à Internet, il faut taper Shift + F10 pour ouvrir l'invite de commande ensuite dérouler les commandes PowerShell suivantes :

> Powershell

> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -force

> Install-Script Get-WindowsAutopilotInfo

    --> Choisir Yes  pour confirmer l'installation du script

> Get-WindowsAutopilotInfo.ps1 -Online -Assign -GroupTag "CompanyGroupTag"

    --> Quand invité à se connecter à Intune,  utilisez un compte d'administration ayant le droit d'import de device Autopilot

 

Active directory : problème d'authentification par smartcard

Un de nos clients utilise des cartes à puce pour s'authentifier sur les postes de travail et depuis quelques mois, un problème apparemment aléatoire se produit : lorsque certaines cartes sont associées à certains comptes Active Directory, l'authentification ne fonctionne pas (erreur "invalid credentials" lors d'une tentative d'ouverture de session Windows).

Les mêmes cartes associées à d'autres comptes ne posent cependant aucun problème, et réciproquement.

La seule autre indication dont nous disposons au moment de commencer les investigations est un évènement 4771 généré dans le journal Security des contrôleurs de domaine. Il indique une erreur 0x42, qui se traduit par KRB_ERR_CERTIFICATE_MISMATCH (et non pas KRB_AP_ERR_USER_TO_USER_REQUIRED comme une première recherche nous l'avait fait penser, nous entraînant sur une fausse piste!)

Dernière information pertinente : les certificats présents sur ces cartes à puce ne contiennent pas l'UPN du compte qui les utilise pour ouvrir une session. Il s'agit de certificats génériques, fournis par une entité tierce.

Il est donc nécessaire de peupler la propriété LDAP altSecurityIdentities pour lier le compte Active Directory d'un utilisateur à une smartcard.

Première vérification évidente : les comptes utilisateurs contiennent bien une référence au certificat présent dans la smartcard dans cette propriété altSecurityIdentities.

Il s'agit plus précisément de leur propriété RFC822, autrement dit un identifiant au format adresse email.

L'erreur "Certificate Mismatch" ne semble donc pas être pertinente ici, mais une nouvelle recherche permet de trouver une note récente de Microsoft ( https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-winerrata/85d75079-92de-47e6-a1c1-7e4fd7f27a10 ) qui indique que depuis la mise à jour mensuelle de Mai 2022, les informations utilisées pour remplir la propriété altSecurityIdentities sont divisées en deux catégories "forte" et "faible"; que l'adresse RFC822 fait partie des "faibles" et que lors de l'utilisation d'une information "faible", l'erreur Certificate Mismatch "peut" être présente.

On progresse donc, mais il nous reste à comprendre quelles sont les conditions exactes pour obtenir cette erreur puisque par ailleurs la majorité des comptes fonctionne avec la majorité des cartes à puce sans problème, en utilisant le même identifiant RFC822 "faible".

Un nouvel événement (id 40 dans le journal System des contrôleurs de domaine) nous met la puce à l'oreille :

The Key Distribution Center (KDC) encountered a user certificate that was valid but could not be mapped to a user in a strong way (such as via explicit mapping, key trust mapping, or a SID). The certificate also predated the user it mapped to, so it was rejected

Il confirme clairement ce dont nous nous doutions déjà, à savoir que le certificat est valide mais pas associé au compte AD de façon sûre.

Mais il indique également un élément supplémentaire : s'il a été rejeté, c'est parce qu'en plus la date d'émission du certificat est antérieure à la date de création du compte.

Il s’agit d’un blocage destiné à permettre l’évolution progressive de la configuration de vos altSecurityIdentities : en effet, Microsoft indique que toutes les authentifications par certificat lié par une association « faible » échouera à partir de Mai 2023 (cf. KB5014754: Certificate-based authentication changes on Windows domain controllers - Microsoft Support ), et ce blocage permet donc d’éviter de créer des associations qui poseront problème après quelques mois seulement.

Deux solutions sont alors disponibles : 

· Regénérer le certificat de façon à ce qu’il contienne l’extension SID (introduite également lors de la mise à jour de Mai 2022), mais cette solution ne fonctionne que pour les certificats signés par une PKI Microsoft et dont les informations sont récupérées dans l’AD et non pas fournies dans la requête

· Changer les altSecurityIdentities de façon à établir une association forte.

Dans notre contexte, seule la seconde solution est possible puisque les certificats sont fournis par une entité tierce. 

Le format recommandé par Microsoft pour établir une liaison forte est le suivant : X509:<I>IssuerName<SR>1234567890

Il contient le nom de l’autorité de certification (au format Distinguished Name) ainsi que le numéro de série du certificat.

Attention : ces deux informations doivent être indiquées « à l’envers ». Par exemple, si le DN de l’autorité émettrice est CN=CONTOSO-DC-CA, DC=contoso, DC=com et le numéro de série du certificat est 2B 3C F4, alors le champ altSecurityIdentities doit contenir la chaine suivante : X509:<I>DC=com,DC=contoso,CN=CONTOSO-DC-CA<SR>F43C2B

Une fois cette modification effectuée, la connexion à l’aide de la smartcard fonctionne enfin !

PowerBI - Coloration conditionnel - Exemple avancé

Derrière le terme un peu technique "Coloration conditionnel" se cache simplement le fait, dans un dashboard PowerBI d'afficher un changement de couleur dans le champ d'un tableau, en fonction de condition.

En plus des fonctions natives de mise en forme dans PowerBI Desktop, il est possible de creer une mesure (code DAX) , avec des conditions, que l'on va utiliser pour afficher une valeur dans un champ. Et cette valeur peut etre un code couleur.

Dans l'exemple du code ci-dessous, on a une application "MyApp" pour laquelle, dans PowerBI nous avons trois datasets (deux correspondrait par exemple a deux tables de la base de donnée associée a "MyApp", et un troisième qui est une connexion vers un outil qui reference la criticité de mes machines (ex: outil de gestion des asset ou cmdb)):

- MyAppAgents, qui contiens des infos sur les agents de mon application

MyAppVersions, qui contiens un historique des numeros de version de mon application

-  MyServers qui est donc la table qui liste la criticité des mes serveurs.

Objectif: On veux dans un dashboard, colorer un champ en rouge ou jaune (exemple, le nom du serveur), pour lequel la version ((MyAppAgents[MyApp_agent_version]) serai differente de la dernière version, ET dont le serveur serait un serveur de Production ou de test.

 

Color_MyApp_agent = 

   VAR Result1 = SELECTEDVALUE(MyAppAgents[MyApp_agent_version])
   VAR Result2 = SELECTEDVALUE(MyAppVersions[MyApp_Last_version_available])
   VAR Result3 = SELECTEDVALUE(MyServers[Server_Criticity])

-- SI MyApp_agent EST DIFFERENT DE MyApp_Last_version_available ET SI Server_Criticity = "PROD" alors on renvoi "CRITICAL"
   VAR Critical = IF(AND(Result1<>Result2, Result3="PROD"),"CRITICAL")
   
-- SI MyApp_agent EST DIFFERENT DE MyApp_Last_version_available ET SI Server_Criticity <> "TEST" alors on renvoi "WARNING"  
   VAR Warning = IF(AND(Result1<>Result2, Result3<>"TEST"),"WARNING")
   
-- SI MyApp_agent EST EGALE A MyApp_Last_version_available   
   VAR OK = IF(Result1=Result2,"OK")

   
 -- SELON LE CAS ON RENVOI UN CODE COULEUR DIFFERENT
RETURN
SWITCH(
True(),
 Critical="CRITICAL" , "#FEA19E",
Warning="WARNING" , "#F9FF28",
 OK="OK" , "#96FF93" 
)

 

On crée donc une mesure (measure) dans laquelle on va coller le code ci-dessus

Apres validation la mesure apparait dans le dataset ou elle a été crée

On selectionne ensuite le champ que l'on veut colorer puis Conditional formatting/Background color

 

On selectionne Format by "Field Value", et on va venir selectionner notre mesure (Color_MyApp_agent)

 

Apres validation, Les valeurs de la colonne seront formatée selon la condition rencontrée (Les code couleurs '#FEA19E' peuvent bien sur etre modifié dans le code pour choisir une autre coloration):

 

Azure - Utiliser la localisation GPS avec l'accès conditionnel Azure

L'accès conditionnel d'Azure ou Conditional Access (CA) est un service Azure qui permet d'autoriser les connexions vers des applications ou services Azure selon des conditions tels que la plage IP publique d'accès, le type de device ou le niveau de risque de l'utilisateur. Avec la popularisation des VPN, il est difficile de réellement restreindre les connexions depuis un pays donné. Une fonctionnalité récente sortie en 2021 permet dorénavant de demander les coordonnés GPS d'un utilisateur lorsqu'une CA est configurée.

 

Prérequis pour utiliser la localisation GPS avec l'accès conditionnel Azure

  • Chaque utilisateur qui utilise un accès conditionnel doit avoir une licence Azure AD Premium P1
  • Le compte qui configure l'accès conditionnel doit avoir un de ces rôles : Security Administrator, Conditional Access Administrator ou Global Administrator
  • Les utilisateurs doivent avoir l'application Microsoft Authenticator installée et configurée avec leur compte Azure AD

Créer un emplacement nommé basé sur la localisation GPS

Un emplacement nommé ou name location est un groupement d'IP ou de pays qui sera consommé par une CA pour appliquer une restriction d'accès.

1. Se connecter au tenant Azure AD via le lien portal.azure.com avec le compte qui a les privilèges requis pour configurer une CA

2. Cliquer sur Azure AD > Security > Named locations > + Countries location

3. Dans la blade (fenêtre Azure) qui s'est ouverte :

  • Dans le champs Name choisir un nom à donner à cette named location
  • Dans le deuxième champs dont la valeur par défaut est Determine location by IP address (IPv4 only) choisir Determine location by GPS coordinates

4. Il est possible de cocher l'option Include unknown countries/regions, cela permet d'inclure les plages IP qui n'appartiennent à aucun pays et les IPv6 qui ne sont pas incluses par défaut.

5. Dans cet exemple, on souhaite configurer la named location en France, scroller jusqu'à trouver France et cocher la checkbox associée puis cliquer sur Create

 

Créer un accès conditionnel basé sur la localisation GPS

1. Se connecter au tenant Azure AD via le lien portal.azure.com avec le compte qui a les privilèges requis pour configurer une CA

2. Cliquer sur Azure AD > Security > Conditional Access > Policies > + New policy

3. Dans le champs Name entrer le nom de la CA puis cliquer successivement sur Conditions > Locations > Configure > Include > Selected locations

4. Dans la blade qui est apparue à droite, entrer le nom de la named location précédemment entrée et cocher la checkox associé puis cliquer sur Select

5. Il est ensuite possible d'utiliser les différentes options pour choisir les éléments qui doivent être bloqués, par exemple :

  • Users or workload identites permet de choisir si la CA doit s'appliquer à l'ensemble des utilisateur ou à un groupe d'utilisateur spécifique
  • Cloud apps or actions permet de choisir l'application Azure à conditionner
  • Grant permet de configurer la CA en tant qu'autorisation ou réfutation

6. Une fois les éléments de configuration de la CA choisis, il est possible de la configurer en Report-only pour ne pas qu'elle s'applique réellement, mais pour pouvoir avoir un aperçu de ses effets au travers des Sign-in logs des utilisateurs.

Module Powershell SecretStore - Exemple avec API Crowdstrike

SecretStore est un module Powershell permettant de facilement stocker et gérér des Credentials.

Dans l’exemple ci-dessous nous le mettons en place et l’utilisons pour demander, dans cet exemple, un token d’acces au cloud de l’EDR Crowdstrike.

NB : Le module SecretStore requiert l’installation du module SecretManagement

Comme tout module Powershell, si ils ne peut pas être directement téléchargé en ligne sur un repository avec la commande Install-Module, il est possible de le(s) récupérer sur Github ou encore sur Powershell Galery

(https://www.powershellgallery.com/packages/Microsoft.PowerShell.SecretStore)

(https://www.powershellgallery.com/packages/Microsoft.PowerShell.SecretManagement)

Une fois les module décompressé et stocké dans un des dossier contenant en standard des modules (ex : «C:\Program Files\WindowsPowerShell\Modules»)

NB : Si le module n’est pas stocké dans un chemin déclaré dans la variable $env:PSModulePath, son chemin complet devra être renseigné lors de l’import. Ceci peut être problématique aussi après l’import, dans le cadre de certaines commandes du module. Pour cela il est préférable qu’il soit stocké dans un chemin reconnu par la variable $env:PSModulePath

NB : Pour qu’un module soit correctement reconnu par Powershell, le nom du dossier le contenant doit être identique au nom du fichier psd1 ou psm1 :

 C:\Program Files\WindowsPowerShell\Modules \microsoft.powershell.secretstore

Dans une fenêtre powershell, exécuter Import-module en spécifiant le chemin d’accès aux fichiers indiqué ci-dessous

*****

Import-module microsoft.powershell.secretmanagement

Import-module microsoft.powershell.secretstore

*****

Par défaut le module SecretStore requiert un password pour accéder a chaque au coffre-fort de mot passe. La commande suivante permet de spécifier que l’authentification ne sera pas demandée , uniquement pour l’utilisation actuel (CurrentUser)

 

Set-SecretStoreConfiguration -Scope CurrentUser -Authentication None -Interaction None

La commande demande un password qui ne sera pas redemandé

La commande suivante permet de créer le coffre-fort (vault). Indiquer un nom explicite pour l’usage de ce coffre. (La commande requiert d’indiquer le module SecretStore)

Register-SecretVault -ModuleName microsoft.powershell.secretstore -Name MyVault

A présent que le coffre est créé, nous allons y stocker les informations requise, dans cet exemple, pour récupérer un token Crowdstrike.

Dans une variable de type hashtable ($ApiClient) On renseigne le Client Id, Le Client Secret, et le Hostname (url de l’api). On ‘range’  ($ApiClient) dans le coffre MYVault. (Set-secret)

$ApiClient = @{
    ClientId     = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    ClientSecret = ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    Hostname     = 'https://api.eu-1.crowdstrike.com'
}

Set-Secret -Name MyApiClient -Secret $ApiClient -Vault MyVault

On peut tester a présent que le credential peut être récupéré :

Get-Secret -Name MyApiClient -Vault MyVault -AsPlainText

Et dans notre exemple, on peut maintenant récupérer notre token Crowdstrike

Get-Secret -Name MyApiClient -Vault MyVault -AsPlainText | ForEach-Object { Request-FalconToken @_ }

Notre token doit etre valable

$(Test-FalconToken).token

Les cmdlets du module PSFalcon peuvent maintenant être exécutées, par exemple :

Get-FalconHost -All -Detailed

NB : Les modules powershell SecretStore et SecretManagement peuvent même etre supprimé (Remove-Module). Le coffre crée sera toujours accessible par le compte l’ayant crée.

[Outlook] Problèmes de synchronisation de BAL partagée

Symptômes

Quand vous accédez aux dossiers d’une boîte aux lettres sur votre profil Outlook, vous pouvez rencontrer des problèmes de synchronisation aléatoires suivants :

  • Lorsque vous affichez des éléments dans la boîte aux lettres partagée, les nouveaux éléments peuvent ne pas apparaître ou des éléments semblent manquants,

  • Les éléments que vous avez supprimés apparaissent toujours,

  • Performances d’Outlook lentes ou blocages aléatoires.

Résolution

Désactiver la mise en cache de tous les dossiers partagés (Pour Outlook 2010 et versions ultérieures):

  1. Sous l’onglet Fichier, cliquez sur Paramètres du compte dans la liste Paramètres du compte.

2. Dans la boîte de dialogue Paramètres du compte, cliquez sur l’onglet Messagerie, puis double-cliquez sur votre compte Microsoft Exchange. Dans la boîte de dialogue Modifier le compte, cliquez sur Autres paramètres.

3. Dans la boîte de dialogue Microsoft Exchange, cliquez sur l’onglet Avancé puis désactivez la case à cocher Télécharger les dossiers partagés puis Cliquez deux fois sur OK.

4. Cliquez sur Suivant, sur Terminer, puis sur Fermer.

5. Redémarrez Outlook.