PI Services

Le blog des collaborateurs de PI Services

[Exchange Hybride] Boîte aux lettres toujours visible dans Outlook même après la suppression des autorisations

Scénario

Les autorisations d'accès total pour une boîte aux lettres partagée ont été supprimées mais la boîte aux lettres est toujours visible dans Outlook. Dans les paramètres du compte Outlook de l'utilisateur, la boîte aux lettres partagée n'apparaît pas comme une boîte aux lettres supplémentaire.

La raison pour laquelle la boîte aux lettres partagée apparaît dans Outlook, mais n'apparaît pas dans les paramètres du compte Outlook, est que le mappage automatique est activé par défaut lorsqu'un utilisateur a accès à une boîte aux lettres partagée ou à la boîte aux lettres d'un autre utilisateur. Lorsque le mappage automatique est activé, Outlook reçoit des informations supplémentaires dans la réponse de découverte automatique qui lui indiquent d'ouvrir la boîte aux lettres supplémentaire.

Résolution

1. Supprimer l'autorisation d'accès complet à la boîte aux lettres

Supprimez l’autorisation d’accès complet à la boîte aux lettres avec la commande Remove-MailboxPermission. Si vous avez déjà supprimé l'autorisation d'accès complet, passez à l'étape suivante. 

Exemple: Remove-MailboxPermission -Identity "test@contoso.com" -User "user@contoso.com" -AccessRights FullAccess'.

2. Ajouter le mappage automatique des autorisations de boîte aux lettres à accès complet

Le paramètre -AutoMapping spécifie s'il faut activer ou désactiver la fonctionnalité de mappage automatique dans Microsoft Outlook. Il utilise la découverte automatique pour ouvrir d'autres boîtes aux lettres pour l'utilisateur. Les valeurs possibles de ce paramètre sont :

$true : Outlook ouvre automatiquement la boîte aux lettres dans laquelle l'utilisateur dispose d'une autorisation d'accès complet. Il s'agit de la valeur par défaut.

$false : Outlook n'ouvre pas automatiquement la boîte aux lettres dans laquelle l'utilisateur dispose d'une autorisation d'accès complet.

Utilisez la cmdlet Add-MailboxPermission pour ajouter une autorisation de boîte aux lettres d’accès complet. Seulement cette fois, ajoutez le paramètre -AutoMapping, y compris la valeur false. Cela empêchera Outlook d'ouvrir la boîte aux lettres d'informations lorsque l'utilisateur ouvrira Outlook.

Exemple: Add-MailboxPermission -Identity "test@contoso.com" -User "user@contoso.com" -AccessRights FullAccess -AutoMapping $false'

3. Supprimer l'autorisation d'accès complet à la boîte aux lettres

Encore une fois, supprimez l’autorisation d’accès complet à la boîte aux lettres via la cmdlet Remove-MailboxPermission

4. Vérifier la boîte aux lettres non visible dans Outlook

Après les actions effectuées ci-dessus, vous verrez que la boîte aux lettres n'apparaît plus dans un délai de maximum une heure..

[Azure] ABAC conditions

Introduction

Microsoft Entra autorise les droits d’accès aux ressources sécurisées via le contrôle d’accès en fonction du rôle Azure (Azure RBAC).Lorsqu’un rôle Azure est attribué à un principal de sécurité Microsoft Entra, Azure octroie l’accès à ces ressources pour ce principal de sécurité. Un principal de sécurité Microsoft Entra peut être un utilisateur, un groupe, un principal de service d’application ou une identité managée pour les ressources Azure.

Besoin

La gestion des permissions Azure RBAC au niveau des abonnements Azure se fait de façon centralisée par les administrateur ayant des permissions privilégiées Aussi, les rôles RBAC s'attribue sur des scopes souvent larges.

Dans certains scénario, un contrôle d'accès plus fin que celui offert par RBAC est nécessaire. Par exemple, il peut être indispensable d'accorder l'accès à certaines ressources, mais pas à toutes, dans une hiérarchie. Ou encore accorder les permission uniquement à des ressources ayant des tags spécifiques.

Aussi, des utilisateurs ont parfois besoin de gérer les permissions d'une service principal sur le scope pour lequel ils ont des droits.

Solution 

Azure ABAC (Attribute Based Access Control) c'est les conditions qui se rajoutent au moment de l'attribution de rôle RBAC permettant ainsi une autre vérification que vous pouvez ajouter à votre attribution de rôle pour fournir un contrôle d’accès encore plus précis. 

Exemple d'utilisation : Attribuer à un groupe Entra ID un rôle permettant d'assigner toutes les permissions RBAC à tout type d'identité (utilisateur, groupe, SPN ou identités managées) à l'exception de certaines permissions privilégiées.

Intune : Corriger l'activation Windows en utilisant la clé OEM intégrée

Dans le cas où un appareil Windows Autopilot n'arrive pas à s'activer en utilisant la clé OEM intégrée, ceci peut être à cause d'un serveur KMS que l'appareil essaye de contacter sur le réseau local de l'entreprise (à cause d'une mauvaise masterisation).

Afin de corriger cela et activer Windows en utilisant la clé OEM intégrée, on peut utiliser un script de remédiation Intune.

Script de détection / remédiation :

$key = (Get-WmiObject -query 'select * from SoftwareLicensingService').OA3xOriginalProductKey

$KMSservice = Get-WMIObject -query "select * from SoftwareLicensingService"

$null = $KMSservice.InstallProductKey($key)
$null = $KMSservice.RefreshLicenseStatus()

 

[Exchange Hybride] Outlook demande un mot de passe après la migration vers Office 365

Scénario

Après la migration d'une boîte aux lettres vers Exchange Online et au démarrage de Microsoft Outlook, Outlook reste bloqué sur l'écran de chargement pendant quelques minutes, puis demande un mot de passe.

cela peut se produire si :

  •  Microsoft Outlook se connecte à la boîte aux lettres principale sur un serveur Exchange onprem à l'aide de RPC et se connecte également à une autre boîte aux lettres située dans Office 365.
  • La boîte aux lettres est migrée vers Office 365 à partir d'un serveur Exchange auquel Outlook se connecte à l'aide de RPC.

Outlook n'utilise pas l'authentification moderne pour se connecter à Office 365. La solution consiste à:

- Activer l'authentification moderne dans Microsoft 365

- Ajouter une clé de registre sur les ordinateurs pour forcer Outlook à utiliser la méthode d'authentification la plus récente

 

Activer l'authentification moderne dans le centre d'administration Microsoft 365

- Se connecter au centre d'administration Microsoft 365, développer Paramètres et cliquer sur Paramètres de l'organisation

- Cliquer sur Services dans la barre supérieure et choisir Authentification moderne 

- Cocher la case Activer l'authentification moderne pour Outlook 2013 pour Windows et versions ultérieures (recommandé) et cliquer sur Enregistrer

 Ajouter la clé de registre AlwaysUseMSOAuthForAutoDiscover

 

- Démarrer l'Éditeur du Registre sur le poste de travail qui rencontre le problème puis accéder au chemin HKEY_CURRENT_USER\Software\Microsoft\Exchange

- Ajouter une nouvelle valeur DWORD (32 bits) AlwaysUseMSOAuthForAutoDiscover avec la valeur data 1 et cliquez sur OK

Une fois la modification appliquée, démarrer Outlook. Le client Outlook ne demande plus de mot de passe et se connecte immédiatement.

 

 

 

 

Intune : Appareils Co-Managed - Sauvegarder la clé BitLocker dans Entra ID

Dans le cas des appareils dans l'AD OnPrem, Co-Managed et gérés par Intune, il est pratique d'avoir la clé BitLocker enregistrée dans Entra ID afin de la visualiser dans le portail Intune.

La sauvegarde de la clé BitLocker vers Entra ID est possible en utilisant un script de remédiation Intune.

Script de détection :

try{
$BLV = Get-BitLockerVolume -MountPoint $env:SystemDrive
        $KeyProtectorID=""
        foreach($keyProtector in $BLV.KeyProtector){
            if($keyProtector.KeyProtectorType -eq "RecoveryPassword"){
                $KeyProtectorID=$keyProtector.KeyProtectorId
                break;
            }
        }

       $result = BackupToAAD-BitLockerKeyProtector -MountPoint "$($env:SystemDrive)" -KeyProtectorId $KeyProtectorID -whatif
return $true
}
catch{
     return $false
}

Script de remédiation :

try{
$BLV = Get-BitLockerVolume -MountPoint $env:SystemDrive
        $KeyProtectorID=""
        foreach($keyProtector in $BLV.KeyProtector){
            if($keyProtector.KeyProtectorType -eq "RecoveryPassword"){
                $KeyProtectorID=$keyProtector.KeyProtectorId
                break;
            }
        }

       $result = BackupToAAD-BitLockerKeyProtector -MountPoint "$($env:SystemDrive)" -KeyProtectorId $KeyProtectorID -whatif
return $true
}
catch{
     return $false
}

 

[Exchange Online] Comment supprimer un mail depuis une boîte aux lettres sur O365

Scénario

Dans les organisations, il peut arriver que certains e-mails soient envoyés au mauvais destinataire, et le rappel de cet e-mail via Outlook ne permet pas de le rappeler ou encore, les e-mails reçus présentent un risque de sécurité tels que :

  • Message contenant des données sensibles
  • Messages envoyés par erreur
  • Message contenant des logiciels malveillants ou des virus
  • Message d’hameçonnage

En tant qu’administrateur, vous pouvez utiliser la fonctionnalité de "la recherche de contenu" de la page d'administration "Sécurité et conformité" afin de rechercher et supprimer des messages.

Cet article vous guidera dans la suppression de message d’une boîte aux lettres utilisateur O365 avec l’aide d’eDiscovery et du PowerShell.

A noter que les actions de suppression de message seront enregistrées dans l’audit et que des alertes seront également déclenchées lors de l’exécution d’une eDiscovery.

1. Création d'une recherche de contenu

  1. Connectez-vous au centre de protection Office 365 https://protection.office.com
  2. Cliquez sur Recherche et enquête, puis sélectionnez Recherche de contenu
  3. À partir de la recherche de contenu, cliquez sur l’icône « Nouveau »
  4. Entrez un nom pour cette tâche de recherche
  5. Sélectionnez des boîtes aux lettres spécifiques ou « toutes les boîtes aux lettres »
  6. Sélectionnez « Rechercher tous les sites », les dossiers publics sont une option en fonction de vos critères de recherche
  7. Cliquez sur Suivant
  8. Entrez des mots-clés pour la recherche ou laissez vide pour rechercher tout le contenu
  9. Ajouter des conditions : dans mon exemple, je recherche un objet (par exemple, une activité de connexion inhabituelle à un compte Microsoft)

  10. Cliquez sur Rechercher

La recherche commencera et les résultats s’afficheront dans le volet de droite.
Une fois terminé, vous pouvez prévisualiser les résultats et les exporter sous forme de rapport.

2. Suppression du contenu

Maintenant que vous avez généré une recherche, vous pouvez passer à la suppression du contenu que vous aviez recherché.
Pour ce faire, connectez-vous de nouveau au Centre de sécurité et de conformité via powershell:

$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange
-connectionUri https://ps.compliance.protection.outlook.com/powershell-liveid 
-Credential $UserCredential -Authentication Basic -AllowRedirection

Import-PSSession $Session -AllowClobber -DisableNameChecking
$Host.UI.RawUI.WindowTitle = $UserCredential.UserName

Une fois authentifié et connecté , vous pouvez créer une nouvelle action pour supprimer les éléments trouvés dans notre recherche précédente via la commande suivante:

New-ComplianceSearchAction -SearchName "Phishing" -Purge -PurgeType SoftDelete -Confirm:$false

Exécutez la commande PowerShell ci-dessous pour voir si la purge est terminée.

Get-ComplianceSearchAction -Identity "Phishing"

La sortie PowerShell affiche l’état Terminé

Windows 11 : Fix de l'upgrade Windows Pro à Enterprise via licence 365

Le script de remédiation Intune ci-dessous permettait de fixer le bug d'upgrade de Windows Pro à Enterprise via licence 365.

Script de détection / remédiation :

# Define the registry key path and value
$registryPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\MfaRequiredInClipRenew"
$registryValueName = "Verify Multifactor Authentication in ClipRenew"
$registryValueData = 0  # DWORD value of 0
$sid = New-Object System.Security.Principal.SecurityIdentifier("S-1-5-4")  # Interactive group SID

# Check if the registry key already exists
if (-not (Test-Path -Path $registryPath)) {
    # If the key doesn't exist, create it and set the DWORD value
    New-Item -Path $registryPath -Force | Out-Null
    Set-ItemProperty -Path $registryPath -Name $registryValueName -Value $registryValueData -Type DWORD
    Write-Output "Registry key created and DWORD value added."
} else {
    Write-Output "Registry key already exists. No changes made."
}

# Add read permissions for SID (S-1-5-4, interactive users) to the registry key with inheritance
$acl = Get-Acl -Path $registryPath
$ruleSID = New-Object System.Security.AccessControl.RegistryAccessRule($sid, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.AddAccessRule($ruleSID)
Set-Acl -Path $registryPath -AclObject $acl
Write-Output "Added 'Interactive' group and SID ($sid) with read permissions (with inheritance) to the registry key."

# Start the scheduled task
Get-ScheduledTask -TaskName 'LicenseAcquisition' | Start-ScheduledTask
Write-Output "Scheduled task 'LicenseAcquisition' started."



Intune : Désactiver le compte Administrateur local par défaut

Afin de désactiver le compte Administrateur local par défaut dans Windows, ceci peut être simple en utilisant un script de remédiation Intune.

Script de détection :

$user = (Get-WmiObject -Class Win32_UserAccount -Filter 'LocalAccount = True ' | Where-Object SID -Like 'S-1-5-*-500').Name
$Status= (Get-WmiObject -Class Win32_UserAccount -Filter 'LocalAccount = True ' | Where-Object SID -Like 'S-1-5-*-500').Disabled 
if ($Status -eq $false)
{
  Write-Host "$user is Enabled" 
  Exit 1
} 
Else {
  Write-Host "$user is not Enabled"
  Exit 0
}

Script de remédiation :

$user = (Get-WmiObject -Class Win32_UserAccount -Filter 'LocalAccount = True ' | Where-Object SID -Like 'S-1-5-*-500').Name
$Status= (Get-WmiObject -Class Win32_UserAccount -Filter 'LocalAccount = True ' | Where-Object SID -Like 'S-1-5-*-500').Disabled
if ($Status -eq $false)
{
try{

NET USER $user /active:No
Exit 0
}
Catch {
Write-Host "$user is already Disabled"
Write-error $_
Exit 1
}
}
Else {
Write-Host "$user is already Disabled"
Exit 1
}



[Powershell] - Fonction pour obtenir les membres des groupes Active Directory supérieur à 5000 objets.

Problème :

Il existe une limitation à la commande "Get-ADGroupMember" et cette dernière est de 5000, ce qui veut dire que si le groupe détient plus de 5000 membres vous obtiendrez un joli message d'erreur du type :

Get-ADGroupMember : The size limit for this resquest was exceeded

Solution :

Voici une fonction Powershell qui vous permettra de récupérer l'intégralité des membres d'un groupe même s'il y en a 10 000 dedans.

Vous pourrez choisir de retourner :

  • Les utilisateurs
  • Les groupes
  • Le tout
Function Get-AllMembers {
     <#
    .SYNOPSIS
    Return a list of members for a group.

    .DESCRIPTION
    Get-AllMembers is a function that returns a list of members for a specific group.
    
    .PARAMETER Name
    The name of the group you want to get the member list.

    .EXAMPLE
    Get-AllMembers "Domain Admins", "DNS Admins"

    .INPUTS
    String

    .OUTPUTS
        PSCustomObject

    .NOTES
        Author:  ADELAIDE Mathieu
    #>
    PARAM (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)]
        [STRING]$Name,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 1)]
        [ValidateSet("UsersOnly","GroupsOnly","All")]
        [STRING]$Return
        )
    Process {
        $Name | Foreach {
            $GroupName = $_
            $ArrayUsers = @()
            $ArrayGroups = @()
            $ArrayAll = @()
            Try {
                $DistinguishedName = Get-ADGroup -Identity $GroupName -ErrorAction Stop | select -ExpandProperty DistinguishedName
                # Searching all Users who's member of current Group
                Try {
                    $AllUsersMembers = Get-ADUser -LDAPFilter "(&(objectCategory=user)(memberOf=$DistinguishedName))" -ErrorAction Stop
                    $AllUsersMembers | foreach {
                        $ArrayUsers += New-Object psobject -Property @{
                            GroupName = $GroupName
                            DistinguishedName = $_.DistinguishedName
                            Enabled = $_.Enabled
                            GivenName = $_.GivenName
                            Name = $_.Name
                            ObjectClass = $_.ObjectClass
                            ObjectGUID = $_.ObjectGUID
                            SamAccountName = $_.SamAccountName
                            SID = $_.SID
                            Surname = $_.Surname
                            UserPrincipalName = $_.UserPrincipalName
                            }

                        # Collect All
                        $ArrayAll += New-Object psobject -Property @{
                            GroupName = $GroupName
                            DistinguishedName = $_.DistinguishedName
                            Enabled = $_.Enabled
                            GivenName = $_.GivenName
                            Name = $_.Name
                            ObjectClass = $_.ObjectClass
                            ObjectGUID = $_.ObjectGUID
                            SamAccountName = $_.SamAccountName
                            SID = $_.SID
                            Surname = $_.Surname
                            UserPrincipalName = $_.UserPrincipalName
                            }
                        }
                    }
                Catch {
                    Write-Warning -Message "Unable to find all users member of $Name"
                    }
                # Searching all Groups who's member of current Group
                Try {
                    $AllGroupsMembers = Get-ADGroup -LDAPFilter "(&(objectCategory=group)(memberOf=$DistinguishedName))" -ErrorAction Stop
                    $AllGroupsMembers | foreach {
                        $ArrayGroups += New-Object psobject -Property @{
                            GroupName = $GroupName
                            DistinguishedName = $_.DistinguishedName
                            GroupCategory = $_.GroupCategory
                            GroupScope = $_.GroupScope
                            Name = $_.Name
                            ObjectClass = $_.ObjectClass
                            ObjectGUID = $_.ObjectGUID
                            SamAccountName = $_.SamAccountName
                            SID = $_.SID
                            }

                        # Collect All
                        $ArrayAll += New-Object psobject -Property @{
                            GroupName = $GroupName
                            DistinguishedName = $_.DistinguishedName
                            Enabled = $_.Enabled
                            GivenName = $_.GivenName
                            Name = $_.Name
                            ObjectClass = $_.ObjectClass
                            ObjectGUID = $_.ObjectGUID
                            SamAccountName = $_.SamAccountName
                            SID = $_.SID
                            Surname = $_.Surname
                            UserPrincipalName = $_.UserPrincipalName
                            }
                        }
                    }
                Catch {
                    # Return an error message if member not found.
                    Write-Warning -Message "Unable to find all groups member of $Name"
                    }
                }
            Catch {
                # Return an error message if Group was not found.
                Write-Warning -Message "Unable to find $Name"
                }
            
            Switch ($Return) {
                "UsersOnly" {Return $ArrayUsers}
                "GroupsOnly" {Return $ArrayGroups}
                "All" {Return $ArrayAll}
                }

            # Release
            $GroupName = $null
            $DistinguishedName = $null
            $AllUsersMembers = $null
            $AllGroupsMembers = $null
            }
        }
    }

Intune : Désactiver le webmail dans Adobe Acrobat Reader

Par mesure de sécurité, il est conseillé de désactiver le "Webmail" dans Adobe Acrobat Reader.

Ceci est possible en utilisant un script de remédiation dans Intune.

Script de détection :

$regkey64 = "HKLM:\SOFTWARE\Policies\Adobe\Adobe Acrobat\DC\FeatureLockDown\cWebmailProfiles"
$regkey32 = "HKLM:\SOFTWARE\Policies\Adobe\Acrobat Reader\DC\FeatureLockDown\cWebmailProfiles"
$name = "bDisableWebmail"
    try
    {
        $exists64 = Get-ItemProperty $regkey64 $name -ErrorAction SilentlyContinue
        $exists32 = Get-ItemProperty $regkey32 $name -ErrorAction SilentlyContinue
        #Write-Host "Test-RegistryValue: $exists"
        if ((($exists64 -eq $null) -and ($exists32 -eq $null)) -or (($exists64.bDisableWebmail -ne 1) -and ($exists32.bDisableWebmail -ne 1)))
        {
            Write-Host "Webmail enabled"
            exit 1
        }
        else
        {
            Write-Host "Webmail disabled"
            exit 0
        }
    }
    catch
    {
        return $false
    }

Script de remédiation :

$regkey64 = "HKLM:\SOFTWARE\Policies\Adobe\Adobe Acrobat\DC\FeatureLockDown\cWebmailProfiles"
$regkey32 = "HKLM:\SOFTWARE\Policies\Adobe\Acrobat Reader\DC\FeatureLockDown\cWebmailProfiles"
$name = "bDisableWebmail"
New-item -Path $regkey64 -ErrorAction SilentlyContinue
New-item -Path $regkey32 -ErrorAction SilentlyContinue
New-ItemProperty -Path $regkey64 -Name $name -Value "1"  -PropertyType "DWORD" -Force -ErrorAction SilentlyContinue
New-ItemProperty -Path $regkey32 -Name $name -Value "1"  -PropertyType "DWORD" -Force -ErrorAction SilentlyContinue