PI Services

Le blog des collaborateurs de PI Services

SQL Server - Récupérer les permissions sysadmin lorsqu'aucun compte sysadmin n'est disponible

Lorsqu'une instance est créé dans un serveur SQL, l'authentification des utilisateurs peut être configurée de 2 façons différentes :

  • Windows Authentication - les comptes de la machine et/ou du domaine AD peuvent être utilisés pour se connecter avec différents niveaux de privilèges
  • Mixed mode - l'authentification Windows ainsi que l'authentification SQL (accès avec des comptes locaux à l'instance) peuvent être utilisé

Lorsque Windows Authentication est choisi, le compte local à l'instance appelé sa qui est membre du groupe sysadmin est désactivé.

sa (system administrator) est un compte utilisateur par défaut local à l'instance SQL dont le mot de passe n'est pas connu

sysadmin est un groupe par défaut local à l'instance SQL dont les membres ont les permissions les plus élevées sur l'instance SQL

 

Dans l'éventualité ou la personne qui a créé l'instance n'est pas disponible et qu'elle n'a pas configuré ou communiqué des accès de secours, par exemple, mixed mode ou ajout d'autres IT en tant que sysadmin, les accès administrateurs à l'instance SQL semblent impossible.

 

Les prérequis pour récupérer les permissions sysadmin

  • Être administrateur du serveur sur lequel le serveur SQL est installé
  • Avoir SQL Server Managmement Studio (SSMS) installé sur le serveur
  • Si l'instance concerne un environnement de production, avertir que lors de la récupération des accès, l'instance SQL sera indisponible

 

Récupérer les permissions sysadmin

1. Se connecter sur le serveur sur lequel le serveur SQL est installé

2. Ouvrir la console SQL Server Configuration Manager

3. Faire un clic droit sur l'instance SQL dont l'accès sysadmin doit être récupéré et cliquer sur Properties

4. Ouvrir l'onglet Startup Parameters, dans Specify a startup parameters saisir -m puis cliquer sur Add, le paramètre -m permet de mettre l'instance SQL en mode maintenance, un utilisateur qui est admin du serveur et qui se connecte à l'instance SQL via SSMS sera, dans ce mode, également sysadmin. Ce mode n'autorise qu'un seul utilisateur à se connecter à la fois.

5. Redémarrer l'instance SQL, dont l'accès sysadmin doit être récupéré, via la console SQL Server Configuration Manager en faisant un clic droit sur l'instance puis choisir Restart

6. Depuis la console SQL Server Configuration Manager, vérifier que le service SQL Server Agent n'est pas démarré, si c'est le cas l'arrêter, auquel cas il utilisera la seule connecxion disponible pour se connecter à l'instance SQL

7. Ouvrir la console SQL Server management Studio en tant qu'administrateur

8. Se connecter à l'instance SQL dont l'accès sysadmin doit être récupéré avec comme méthode d'authentification Windows Authentication

9. Dans l'arborescence de l'instance SQL, déplier le dossier Security puis faire un clic droit sur Logins et clique sur New login...

10. Dans l'onglet General, dans le champs Login name choisir le compte utilisateur ou le groupe qui sera sysadmin, choisir Windows Authentication

11. Aller dans l'onglet Server Roles et cocher sysadmin puis clique sur OK 

12. Le nouvel accès apparaît dans la liste des Login

13. Fermer SSMS

14. Dans SQL Server Configuration Manager retirer le paramètre -m de l'instance SQL dont les accès sysadmin ont été récupéré, en sélectionnant -m et en cliquant sur Remove

15. Depuis la console SQL Server Configuration Manager redémarrer l'instance SQL dont l'accès sysadmin a été récupéré

 

 

Intune : Filtrer un déploiement pour une version d'OS spécifique

Scénario:

Nous avons besoin d'appliquer une stratégie de conformité dans Intune à un groupe d'appareils qui contient des ordinateurs sous Windows 10 et Windows 11.

La configuration doit s'appliquer uniqument sur les appareils Windows 11.

Solution:

  • Créer un filtre pour les appareils Windows 11 dans Intune
  • Inclure le filtre dans le déploiement

1. Pour créer un filtre, connectez-vous au Microsoft Endpoint Manager admin center et sélectionnez Tenant administration > Filters. Sélectionnez Create

2. Pour inclure le filtre dans le déploiement, sélectionnez Devices > Windows > Compliance policies. Sélectionnez la stratégie de conformité à modifier et ajoutez un filtre dans Properties > Assignments > Edit filter

Maintenant, la stratégie de conformité "Compliance policy for Windows 11" s'appliquera uniquement sur les appareils Windows 11 dans le groupe INTUNE_BYOD_POC.

Exchange 2013_Impossible de supprimer l'autorisation Envoyer en tant / Accès total

Symptômes:

Lorsque vous essayez de supprimer l'autorisation « Accès total » ou « Envoyer en tant que »  sur une boite aux lettres, vous pouvez être confronté aux messages d’avertissements indiquant que l’entrée de contrôle d’accès ne peut pas être supprimée.

Ce problème apparaîtra quand vous essayez de supprimer l'autorisation à l'aide du PowerShell Exchange ou depuis l'interface graphique.

  •  A la suppression de l’autorisation « Envoyer en tant que» via la console d’administration ECP, vous aurez  le message d’avertissement ci-dessous :
  • Quand vous supprimez l’autorisation « Accès total» , pas de message d’avertissement , mais la délégation n’est pas supprimée.
  • A la suppression de l’autorisation « Full Access/ send as » depuis une BAL en powershell,  vous aurez les messages d’avertissement suivants :

Solution:

Les étapes suivantes s'appliquent pour les boites aux lettres liées. La solution de contournement consiste à déconnecter la BAL de l'utilisateur, modifier les autorisations puis la reconnecter :

Exemple : Supprimer l’autorisation de User01 sur la BAL de User02:

  • Exécutez la commande suivante: Set-User -Identity useridentity -LinkedMasterAccount $null Cette commande permet de dissocier la boîte aux lettres liée et la convertir en boîte aux lettres utilisateur.

    Le paramètre Identity spécifie l'utilisateur que vous souhaitez modifier. Vous pouvez utiliser n'importe quelle valeur qui identifie l'utilisateur de manière unique. Par exemple:

    • Name
    • Distinguished name (DN)
    • Canonical DN
    • GUID
    • UserPrincipalName
  • Supprimez par la suite les autorisations en exécutant les commandes suivantes :

    Pour supprimer la délégation Full Access  Remove-MailboxPermission -Identity MailboxAccount -User UserAccount -AccessRights FullAccess -InheritanceType All

    Exemple:  Remove-MailboxPermission -Identity "user02" -User "User01" -AccessRights FullAccess -InheritanceType All

    Pour supprimer la délégation Send As  Remove-ADPermission -Identity "MailboxAccount" -User "UserAccount" -ExtendedRights "Send As"

    Exemple: Remove-ADPermission -Identity " User02" -User " User01" -ExtendedRights "Send As"

  • Une fois les délégations supprimées, reconnectez de nouveau la boite aux lettres de l’utilisateur via la commande :

    Set-User -Identity “UserAccount” – LinkedDomainController “domaincontroller” -LinkedMasterAccount “DomainName\user

    Exemple:  Set-User -Identity User01@contoso.com – LinkedDomainController dc01.contoso.com -LinkedMasterAccount “contoso\User01”

  • Vérifier par la suite que les autorisations ont été bien supprimées.

Exchange 2013/2016_Le groupe de distribution dynamique renvoie tous les utilisateurs avec le filtre "RecipientContainer"

Lorsque vous créez un groupe de distribution dynamique dans Exchange 2016/2013 avec le filtre "RecipientContainer", l'onglet Aperçu n'existe plus, il fallait donc passer par Exchange Powershell pour afficher les membres du groupe.

Pour afficher l'appartenance au groupe de distribution dynamique, la commande Exchange PowerShell est simple et rapide:

Get-Recipient -RecipientPreviewFilter (Get-DynamicDistributionGroup "DynamicGroupName").RecipientFilter

Malheureusement, comme votre groupe de distribution utilise le paramètre "RecipientContainer", la commande ci-dessus ne fonctionnera pas correctement et affichera tous les destinataires quel que soit leurs unités organisationnelles.

Pour contourner le problème, utilisez plutôt les commandes suivantes:

  1. Créez tout d'abord une variable qui stockera les résultats de la commande:
    $DDL = Get-DynamicDistributionGroup "DynamicGroupName
  2. Utilisez la variable avec la commande Get-Recipient pour renvoyer les résultats requis : Get-DynamicDistributionGroup $DDL | ForEach {Get-Recipient -RecipientPreviewFilter $_.RecipientFilter -OrganizationalUnit $_.RecipientContainer} | Select DisplayName,PrimarySMTPAddress,OrganizationalUnit | Sort-Object -Property DisplayName

 

Outlook_Les messages supprimés d’une boîte aux lettres partagée ne se déplacent pas dans le dossier "éléments supprimés" de cette même boite

Description du Problème:

Lorsque vous supprimez des messages d'une boite aux lettres, les éléments supprimés sont placés dans votre propre dossier "Éléments supprimés" au lieu du dossier "Éléments supprimés" de la boîte aux lettres partagée. 

Contournement:

Pour contourner ce problème, il faut changer la destination des éléments supprimés vers le dossier Éléments supprimés du propriétaire de la boîte aux lettres à travers une modification du paramétrage du registre comme suit:

  1. Quittez Outlook
  2. Démarrez l’Éditeur du Registre: Appuyez sur touche de logo Windows+R pour ouvrir une boîte de dialogue Exécuter, tapez regedit.exe, puis appuyez sur OK.
  3. Trouvez la sous-clé de Registre suivante :

\HKEY_CURRENT_USER\Software\Microsoft\Office<x.0>\Outlook\Options\General

Note: L’espace réservé<x.0> représente votre version d’Office (16.0 = Office 2016, Office 2019, Office LTSC 2021 ou Microsoft 365, 15.0 = Office 2013).

  1. Cliquez avec le bouton droit sur la valeur DelegateWastebasketStyle, puis sélectionnez Modifier.

Si cette valeur de Registre n’est pas présente, procédez comme suit pour la créer :

  1. Cliquez avec le bouton droit sur le dossier Général dans le chemin défini à l’étape 3.
  2. Pointez sur Nouveau, puis sélectionnez Valeur DWORD.
  3. Tapez DelegateWastebasketStyle, puis appuyez sur Entrée
  4. Remplacez les données de valeur de la boîte de dialogue Modifier la valeur DWORD par l’une des valeurs suivantes :
  • 8 = Stocke les éléments supprimés dans votre dossier.
  • 4 = Stocke les éléments supprimés dans le dossier du propriétaire de la boîte aux lettres.
  1. Fermez l’Éditeur du Registre.
  2. Redémarrez Outlook. 

Exchange/Outlook_Problème de réception des invitations des RDV après la suppression d’un délégué de calendrier

 

Description du problème :

Lorsqu’un utilisateur 1 n'a plus besoin d'accéder au calendrier d’un autre utilisateur 2, la délégation peut être supprimée via le client Outlook ou par un administrateur Exchange en utilisant le PowerShell.

Après la suppression des droits de délégation, tout accès au calendrier est révoqué et les invitations aux réunions ne sont plus envoyées au délégué pour qu'il les accepte ou les refuse. Il est possible que même après la suppression des délégations, l'utilisateur 1 continue à recevoir des demandes de réunions envoyées à l’utilisateur 2.

 Diagnostic et résolution :

  • Vérifier si les droits délégués ont été correctement supprimés en exécutant la commande suivante: 

Get-MailboxFolderPermission -Identity UserEmailaddress:\Calendar  Si vous voyez encore l’ancien délégué, supprimez ses droits à l'aide de la commande: Remove-MailboxFolderPermission -Identity DelegatorUserEmailaddress:\Calendar -User UserEmailaddressdelegate

  • Vérifier s’il y a des règles de boîte de réception masquées : Si le droit de voir les éléments privés a été affecté au délégué, une règle de boîte de réception masquée sera créée au niveau de la boîte aux lettres du délégué. Lorsque ce dernier est supprimé du calendrier, il doit automatiquement supprimer la règle masquée depuis sa Boite aux lettres.

Les règles de boîte de réception masquées ne sont pas visibles pour l'utilisateur dans Outlook. Seul un administrateur Exchange peut les chercher et les supprimer. Rechercher la règle de boîte de réception masquée via la commande :

Get-InboxRule -Mailbox  “DelegatorUserEmailaddress” -IncludeHidden avec le paramètre Mailbox identifiant le délégant et non le délégué. 

Ci-dessous un exemple du résultat de la commande précédente pour une boîte aux lettres avec une règle de boîte de réception de délégué masquée :

Pour en savoir plus sur ce que fait cette règle, développez la commande précédente avec l'ajout du paramètre Identity. Notez que le paramètre identité n'est pas le nom de la règle mais plutôt la valeur de RuleIdentity 

Vous pouvez supprimer cette règle avec la cmdlet "Remove-InboxRule" : Get-InboxRule -Mailbox EmailAddress -IncludeHidden -Identity  XXXXXXXXXXXXX | Remove-InboxRule

Confirmer la suppression de la règle en réémettant la commande initiale :

Get-InboxRule -Mailbox EmailAddress -IncludeHidden

La suppression de la règle du transfert au délégué devrait résoudre le problème.

Sinon, vérifiez si le transfert de boîte aux lettres est configuré via une redirection: Get-Mailbox -Identity “DelegatorUserEmailaddress”  | Format-List Name,ForwardingSmtpAddress,ForwardingAddress Si un transfert de boîte aux lettres est présent, les valeurs seront renvoyées dans les champs ForwardingSmtpAddress et ForwardingAddress. Si ces champs sont vides, le transfert de boîte aux lettres n'est pas en place.

Pour supprimer la configuration du transfert depuis une BAL, exécutez la commande suivante:Set-Mailbox -Identity “DelegatorUserEmailaddress”  -ForwardingSmtpAddress $null -ForwardingAddress $null -DeliverToMailboxAndForward $false

Il est aussi possible que le transfert soit en place avec une règle standard au niveau de la boîte de réception de l’utilisateur. Pour cela, vérifiez si les règles de la boîte de réception incluent une action de transfert ou de redirection.

 

 

Office365/Exchange 2013/2016_Installation et configuration de l'agent des stratégies de routage du carnet d'adresses

Problématique:

Si vous avez plusieurs GAL dans l'environnement de messagerie séparées à l'aide de politiques de carnet d'adresses, un utilisateur de la GAL1 peut afficher les informations de contact de l'utilisateur GAL2. Pour éviter ça, vous pouvez activer l'agent de routage ABP.

Le routage des stratégies de carnet d’adresses contrôle la façon dont les destinataires sont résolus dans les organisations utilisant des stratégies de carnet d’adresses. Lorsque l'agent de routage ABP (Address Book Policy) est installé et configuré, les utilisateurs affectés à différentes listes d’adresses globales (GAL) apparaissent en tant que destinataires externes.

Pour Installer l'agent de routage des stratégies de carnet d'adresses :

  1. Exécuter la commande suivante dans un environnement Exchange powershell :

Install-TransportAgent -Name "ABP Routing Agent" -TransportAgentFactory "Microsoft.Exchange.Transport.Agent.AddressBookPolicyRoutingAgent.AddressBookPolicyRoutingAgentFactory" -AssemblyPath $env:ExchangeInstallPath\TransportRoles\agents\AddressBookPolicyRoutingAgent\Microsoft.Exchange.Transport.Agent.AddressBookPolicyRoutingAgent.dll

Ignorer pour le moment le message d’avertissement indiquant que le service de transport doit être redémarré pour que vos modifications soient appliquées et passer à l'étape 2 de manière à ne redémarrer le service de transport qu'une seule fois.

  1. Activer l’agent en exécutant la commande suivante :

Enable-TransportAgent "ABP Routing Agent"

  1. Redémarrer le service de transport en exécutant la commande suivante :

Restart-Service MSExchangeTransport

  1. Après le redémarrage du service, vérifier que l'agent de routage des stratégies de carnet d'adresses est installé et activé en exécutant la cmdlet suivante :

Get-TransportAgent

Si l’agent de routage de carnet d’adresses est répertorié, donc il a été correctement installé.

  1. Activer par la suite le routage des stratégies de carnet d'adresses pour l'organisation en exécutant la commande suivante :

Set-TransportConfig -AddressBookPolicyRoutingEnabled $true

Désormais, les autres utilisateurs de la liste d’adresses globale GAL1 ne peuvent plus afficher les autres utilisateurs de la liste d’adresses globale GAL2

Intune : Créer un groupe d'appareils dynamique dans Azure AD pour les ordinateurs gérés par Intune ou Co-Managed

Scénario:

Créer un groupe d'appreils dynamique dans Azure AD qui regroupe les ordinateurs qui sont gérés par Intune ou Co-managed (Mode de gestion hybride: MECM+INTUNE).

Solution:

Dans Azure AD, créer un groupe d'appareils dynamique en utilisant une règle d'appartenance dynamique basée sur la propriété Mobile Device Management Type.

Dans la configuration de la règle, nous devons sélectionner la propriété deviceManagementAppId.

En tant que valeur, il faut renseigner l'un des identifiants ci-dessous :

  • 54b943f8-d761-4f8d-951e-9cea1846db5a pour Co-managed
  • 0000000a-0000-0000-c000-000000000000 pour Intune

Exemple:

Ceci est un exemple de configuration d'une règle dynamique pour un groupe d'appareils Co-managed:

Selon l'opérateur que vous préférez, vous devez entrer l'intégralité de l'ID ou pouvez utiliser une partie de l'ID.

Script - Exemple de recherche d'ancien fichier de log dans une arborescence de dossier

Le script ci-dessous propose de rechercher dans une liste de dossiers specifiques (expression regulière FolderPattern) des fichiers de logs plus ou moins anciens, selon un seuil prédéfini (TimeDelta), ajoute un statut au tableau selon le cas rencontré, et exporte le resultat en fichier csv.

 

##############################################
### CHECK OLD LOG FILES ###
##############################################


<# 

    .SYNOPSIS 
        VERIFICATION DE LA PRESENCE ET DE L'ANCIENNETE DU LOG LE PLUS RECENT DANS UNE LISTE DE DOSSIER; 
        UN TABLEAU DES DOSSIERS DONT LE LOG LE PLUS RECENT EST PLUS ANCIEN QUE J-$TimeDelta EST AFFICHE ET EXPORTE EN FICHIER CSV.  

    .PARAMETER  
        RootFolder : Chemin du dossier racine
        TimeDelta : Seuil d'ancienneté du fichier de log le plus recent
        FolderPattern: Expression reguliere pour selectionner des noms de sous dossier
        

 
    .EXAMPLE 
     .\Check_Old_Log_Folders.ps1 -RootFolder "C:\MyRootFolder" -TimeDelta 15
#>




[CmdletBinding()]
param(
[Parameter(Mandatory,HelpMessage="Chemin du dossier racine")]
$RootFolder,

[Parameter(Mandatory,HelpMessage="Seuil d'ancienneté du fichier de log le plus recent")]
$TimeDelta,

[Parameter(HelpMessage="Expression reguliere pour selectionner des noms de sous dossier")]
[regex]$FolderPattern = "^(SRV|DEV).*"

)



# Date du jour - TimeDelta
$DateTimeMinus = (get-date).AddDays(-$TimeDelta)

# Verification que RootFolder existe 
if (!(Test-Path -Path $RootFolder))
    {
    write-host -B White -F Red "UNABLE TO FIND $RootFolder - CHECK PATH - END OF SCRIPT"
    EXIT 1
    }


# Creation d'un PSobject pour stocker les futurs valeurs LogFolder,LastLog et Status
$FileTab = @()

# Recuperation des noms de dossier
$Folders = Get-ChildItem -Path $RootFolder -Directory | Where-Object {$_.Name -match $FolderPattern}


# Pour chacun des dossier on cherche le dernier fichier modifié
$Folders | foreach {


$LogFolder = $_.Name
$LastLog = Get-ChildItem -Path $_.FullName | select -Last 1 -Property LastWriteTime -ExpandProperty LastWriteTime

# Si le dossier est vide (pas de Lastlog) le status est KO
 if (!$LastLog) {$status = "KO - DOSSIER VIDE"}

# Si LastLog est plus ancien ou plus recent que $DateTimeMinus  
 switch($LastLog)
    {
        
        {$LastLog -lt $DateTimeMinus} {$status = "KO - OLDER THAN $DateTimeMinus"}
        {$LastLog -gt $DateTimeMinus} {$status = "OK - NEWER THAN $DateTimeMinus"}
        default {$status = "UNKNOWN"}
    }


# remplissage du tableau
$FileTab += New-Object -TypeName psobject -Property @{LogFolder=$LogFolder;LastLog=$LastLog;Status=$status}

}


# Affiche le tableau $FileTab des dossiers dont le fichier le plus recent est plus ancien que $TimeDelta ou pour lequel il n'y a pas de log
Write-Host -F red -B White "LOG FOLDERS DONT LE FICHIER DE LOG LE PLUS RECENT EST PLUS ANCIEN QUE J $TimeDelta OU POUR LESQUELS IL N'EXISTE PAS DE LOG (DOSSIER VIDE)"
$KOFiles = $FileTab | Where-Object {$_.status -like 'KO*'} | select LogFolder,LastLog,Status | Sort LastLog
$KOFiles | ft -AutoSize


# Export CSV du tableau en supprimant les caractere '"'
$KOFilesCSV = $KOFiles | ConvertTo-Csv -Delimiter "," -NoTypeInformation | ForEach {$_.replace('"','')}


# Export du fichier CSV
$KOFilesCSV | Out-File "$($pwd.ProviderPath)\OldLogFolders.csv" -Force
write-host -F Blue -B White "Old Log Folders CSV File Exported as $($pwd.ProviderPath)\OldLogFolders.csv"


# Ouverture du fichier CSV
notepad.exe "$($pwd.ProviderPath)\OldLogFolders.csv"

 

[Powershell] - Autoriser l'envoie sur une liste de distribution dans un environnement en Split Model Permission

Contexte :

Dans le cas ou vous implémentez l'Active Directory Split Model Permission, vous réduisez les permissions de l'Exchange sur L'AD et par conséquent une partie des commandes disponible depuis l'Exchange.

Problème :

La modification doit être faite sur les fiches des objets AD et il faut connaitre l'attribut à modifier.

Par exemple pour autoriser un ou des utilisateur(s) à écrire à une liste de distribution, il faut pour chaque utilisateur ajouter son "DistinguishedName" dans l'attribut "authOrig" de la liste en question.

Solution :

Si vous ne souhaitez pas éditez les fiches AD, aller dans l'onglet éditeur d'attributs et éditer / modifier l'attribut (déjà 4 clics avec la validation) vous pouvez utiliser Powershell avec la ligne de commande suivante :

Set-ADGroup -Identity "SamAccountName_Du_Groupe" -Add @{authOrig=@("DistinguishedName_Du_User")}

Mais si vous devez le faire pour plusieurs utilisateurs et ne pas traiter cela unitairement, il vous est possible d'utiliser la fonction suivante en passant plusieurs utilisateurs pour l'attribut "SamAccountName" séparés par une virgule :

Function Allow-ToSendTo {
    param (
    [Parameter(Mandatory)][String]$GroupName,
    [Parameter(Mandatory)][String[]]$SamAccountName
    )

    Try {
        Get-ADGroup $GroupName -ErrorAction Stop
        foreach ($Sam in $SamAccountName) {
            Try {
                $CurrentUser = Get-ADUser $Sam -ErrorAction Stop
                Try {
                    Set-ADGroup -Identity $GroupName -Add @{authOrig=@($CurrentUser.DistinguishedName)} -ErrorAction Stop
                }
                Catch {
                    Write-Warning $($_)
                    }
            }
            Catch {
                Write-Warning $($_)
            }
        }
    }
    Catch {
        Write-Host "Group Not found sorry" -ForegroundColor Yellow
    }
}