Importez dans Copilot via un connecteur 🔌

J’ai reçu un mail il y a quelques jours de la part de Microsoft (oui oui, seulement un 🤣) m’invitant tester par moi-même un premier connecteur Copilot pour Microsoft 365, en suivant simplement un pas à pas technique. N’ayant pas d’expérience en .NET, je me suis dit … pourquoi pas ! Je vous propose de le réaliser ensemble pour que vous puissiez vous-même reproduire cet exercice sur votre tenant Copilot.

Dans cet article, nous reprendrons brièvement quelques concepts et nous testerons nous-même de créer un connecteur Microsoft Graph personnalisé afin d’enrichir les résultats Copilot dans Microsoft 365.

Voici encore un rappel des articles écrits autour des solutions Copilot de Microsoft :

Qu’est-ce qu’un connecteur Microsoft Graph ?

Les connecteurs Microsoft Graph vous permettent d’ingérer vos données métier non structurées dans Microsoft Graph, afin que Copilot pour Microsoft 365 puissent raisonner sur l’intégralité du contenu de votre entreprise. Le contenu ingéré via les connecteurs Graph est ajouté à Microsoft Graph ; cela déverrouille la compréhension sémantique des invites de vos utilisateurs dans Copilot pour Microsoft 365.

Microsoft Learn

Quel est l’impact d’un connecteur dans Copilot pour 365 ?

L’impact de connecteur dans les résultats Copilot peut changer la donne dans les résultats de recherche documentaire car il va fouiner en dehors de Microsoft 365.

Voici un exemple montrant des résultats avec des références externes à Microsoft 365, améliorant donc l’expérience de recherche de l’utilisateur Copilot :

Voici également une courte vidéo montrant un peu plus à ce sujet :

Peut-on gérer les droits d’accès aux données remontées via un connecteur ?

Oui, ce qui est stocké en dehors de Microsoft 365 reste accessible selon une configuration ACL de votre choix. Les documents pourraient alors être visibles par :

  • Tous les membres de votre organisation
  • Un ou des groupes 365
  • Un ou des utilisateurs 365

Important : Les autorisations d’accès au contenu externe sont directement stockées dans le système externe.

Existe-t-il des connecteurs déjà disponibles sur étagères ?

Oui, Microsoft propose déjà un site web référençant des connecteurs de plusieurs grands éditeurs :

Quelles sont les sources de données possibles via un Connecteur ?

Microsoft a déjà créé plusieurs connecteurs dont voici certains exemples de source de données :

Azure Data Lake Storage Gen2, Azure DevOps Work Items, Azure DevOps Wiki, Azure SQL and Microsoft SQL Server, Confluence Cloud, Confluence On-premises, CSV, Custom connector, Enterprise websites, Jira Cloud, MediaWiki, File share, Oracle SQL, Salesforce, ServiceNow Knowledge, ServiceNow Catalog, ServiceNow Tickets

Peut-on créer un connecteur personnalisé ?

La réponse est encore oui. Dans l’objectif de vous aider à tester Copilot avec un connecteur Microsoft Graph personnalisé, Microsoft a mis à disposition la documentation suivante.

Grâce à celle-ci, vous pouvez facilement tester intégration du contenu externe à Copilot for Microsoft 365 à l’aide de connecteurs Microsoft Graph construits avec .NET.

Dans cet exercice Microsoft, les tâches que nous allons réaliser seront donc les suivantes :

Commençons par un bref rappel des prérequis.

Etape 0 – Rappel des prérequis :

Pour réaliser cet exercice sur un connecteur Microsoft Graph, il vous faudra disposer des éléments suivants :

  • Un tenant Microsoft
  • Une licence Copilot pour Microsoft 365
  • Une des licences 365 suivantes :
    • Microsoft 365 E5
    • Microsoft 365 E3
    • Office 365 E3
    • Office 365 E5
    • Microsoft 365 A5
    • Microsoft 365 A3
    • Office 365 A5
    • Office 365 A3
    • Microsoft 365 Business Standard
    • Microsoft 365 Business Premium

Avant de créer le connecteur Microsoft Graph personnalisé, faisons un premier de test de prompt à Copilot pour évaluer les réponses obtenues.

Etape I – Premier test Copilot sans connecteur :

Pour cela, ouvrez votre navigateur internet sur la page web de Copilot en mode Work :

Saisissez le prompt suivant :

please find a doc how to install a Microsoft Graph SDK

Copilot vous informe qu’il ne trouve aucun document stocké dans les données d’entreprise, ou qu’aucun document ne vous est accessible.

Notez que le Plugin Web n’est pas activé, ce qui aurait pu donner un résultat également différent :

Nous allons maintenant mettre en place un connecteur Microsoft Graph personnalisé afin d’en mesurer le changement des réponses de Copilot.

Etape II – Préparation du poste local :

Pour plus de facilité, commencez par télécharger Visual Studio Code via la page officielle de téléchargement :

Une fois l’installeur téléchargé, exécutez celui-ci

Acceptez les conditions d’utilisation, puis cliquez sur Suivant :

Définissez le répertoire d’installation, puis cliquez sur Suivant :

Cliquez sur Suivant :

Cliquez sur Suivant :

Cliquez sur Installer :

Attendez 1 minute que l’installation de Visual Studio Code se termine :

Cliquez sur Terminer :

Une fois dans Visual Studio Code, allez dans le menu Extensions, puis installez l’extension simplement nommée C# :

Retournez sur votre navigateur internet afin de télécharger la version 8.0.1 du SDK .NET :

Une fois l’installation téléchargée, exécutez celle-ci :

Cliquez sur Installer :

Confirmez l’action de sécurité Windows en cliquant sur Oui :

Attendez 1 minute que l’installation de .NET se termine :

Cliquez sur Fermer :

Redémarrer votre poste Windows afin de prendre en compte la nouvelle version .NET :

Notre poste est maintenant prêt pour la création d’un connecteur Microsoft Graph personnalisé.

Nous allons commencer par la préparation de notre tenant à gérer les authentification de notre connecteur à Microsoft 365 à l’API de Microsoft Graph.

Etape III – Création d’une Inscription d’application Entra :

Rendez-vous sur la page du portail Azure disponible juste ici, puis ouvrez le service Microsoft Entra ID :

Dans le menu Inscriptions d’applications, cliquez-ici pour créer une nouvelle Inscription :

Nommez votre application, puis cliquez sur Inscrire :

Attendez quelques secondes la notification suivante :

Cliquez sur le menu Certificats et secrets, puis ajoutez un nouveau secret client comme ceci :

Nommez-le, puis cliquez sur Ajouter :

Copiez la valeur de votre secret. Ce dernier sera utilisé par votre connecteur Microsoft Graph afin qu’il s’authentifie automatiquement :

Dans le menu des Permissions API, cliquez-ici pour ajouter des permissions supplémentaires :

Choisissez l’API Microsoft Graph :

Cliquez sur Permissions d’application :

Recherchez et cochez les 2 permissions suivantes en utilisant la barre de recherche, puis cliquez sur Ajouter les permissions :

  • ExternalConnection 
    • ExternalConnection.ReadWrite.OwnedBy
  • ExternalItem 
    • ExternalItem.ReadWrite.OwnedBy

Enfin, cliquez sur le bouton suivant afin d’appliquer ces permissions au niveau du tenant :

Confirmez votre choix en cliquant sur Oui :

Leur statut s’en retrouve alors changé comme ceci :

La configuration du côté du tenant est en partie terminée. Nous allons maintenant nous intéresser l’écriture du code en .NET de notre connecteur Microsoft Graph.

Etape IV – Création du connecteur Microsoft Graph personnalisé :

Dans l’explorateur Windows, créez un dossier pour y stocker le codes et les données de votre futur connecteur Microsoft Graph :

Retournez dans Visual Studio Code, puis cliquez ici pour vous positionnez sur ce nouveau répertoire :

Cliquez sur Oui :

Dans la console située en bas de votre écran, vérifiez le bon positionnement de votre dossier, puis lancez la commande suivante pour créer une nouvelle console dédiée à votre application .NET :

dotnet new console

Notez l’apparition de fichiers suivants dans l’explorateur Windows :

Ajoutez la bibliothèque suivante pour s’authentifier auprès des services Microsoft 365 :

dotnet add package Azure.Identity

Ajoutez la bibliothèque cliente suivante pour communiquer à l’API Microsoft Graph :

dotnet add package Microsoft.Graph

Ajoutez la bibliothèque suivante pour gérer les secrets :

dotnet add package Microsoft.Extensions.Configuration.UserSecrets

Ajoutez la bibliothèque suivante pour intégrer des commandes dans l’application :

dotnet add package System.CommandLine --prerelease

Afin de stocker les secrets de notre application, lancez la commande suivante :

dotnet user-secrets init

Conservez les 3 informations de votre Inscription d’application pour vous authentifier automatiquement auprès de Microsoft 365 :

  • ID de l’application
  • Valeur du secret
  • ID du tenant

Saisissez les commandes suivantes pour les stocker de manière sécurisée en remplaçant les 3 valeurs en gras par celles récupérées juste avant :

dotnet user-secrets set "EntraId:ClientId" "[application id]"
dotnet user-secrets set "EntraId:ClientSecret" "[secret value]"
dotnet user-secrets set "EntraId:TenantId" "[tenant id]"

Continuons la configuration par la connexion entre le connecteur personnalisé et l’API Microsoft API.

Etape V – Configuration de la connexion avec l’API Microsoft Graph :

Le premier fichier va être utile à gérer les informations de la connexion entre le connecteur personnalisé et l’API Microsoft Graph.

Dans Visual Studio Code, créez un premier fichier texte en cliquant juste ici :

Choisissez le type de fichier texte :

Collez le code suivant dans votre fichier, puis sauvegardez-le via la commande clavier Ctrl Shift+S avec le nom GraphService.cs :

using Azure.Identity;
using Microsoft.Graph;
using Microsoft.Extensions.Configuration;

class GraphService
{
  static GraphServiceClient? _client;

  public static GraphServiceClient Client
  {
    get
    {
      if (_client is null)
      {
        var builder = new ConfigurationBuilder().   AddUserSecrets<GraphService>();
        var config = builder.Build();

        var clientId = config["EntraId:ClientId"];
        var clientSecret = config["EntraId:ClientSecret"];
        var tenantId = config["EntraId:TenantId"];

        var credential = new ClientSecretCredential(tenantId, clientId,    clientSecret);
        _client = new GraphServiceClient(credential);
      }

      return _client;
    }
  }
}

Le second fichier contient la connexion externe elle-même avec Microsoft 365 et les schémas de données envoyées à Microsoft 365.

Créer à nouveau un fichier texte, collez le code suivant dans votre fichier, puis sauvegardez-le via la commande clavier Ctrl Shift+S avec le nom ConnectionConfiguration.cs :

using Microsoft.Graph.Models.ExternalConnectors;
static class ConnectionConfiguration
{
  public static ExternalConnection ExternalConnection
  {
    get
    {
      return new ExternalConnection
      {
        Id = "msgraphdocs",
        Name = "Microsoft Graph documentation",
        Description = "Documentation for Microsoft Graph API which    explains what Microsoft Graph is and how to use it."
      };
    }
  }
  public static Schema Schema
  {
    get
    {
      return new Schema
      {
        BaseType = "microsoft.graph.externalItem",
        Properties = new()
        {
          new Property
          {
            Name = "title",
            Type = PropertyType.String,
            IsQueryable = true,
            IsSearchable = true,
            IsRetrievable = true,
            Labels = new() { Label.Title }
          },
          new Property
          {
            Name = "description",
            Type = PropertyType.String,
            IsQueryable = true,
            IsSearchable = true,
            IsRetrievable = true
          },
          new Property
          {
            Name = "iconUrl",
            Type = PropertyType.String,
            IsRetrievable = true,
            Labels = new() { Label.IconUrl }
          },
          new Property
          {
            Name = "url",
            Type = PropertyType.String,
            IsRetrievable = true,
            Labels = new() { Label.Url }
          }
        }
      };
    }
  }
}

Créer un troisième fichier texte contant les demandes d’établissement de connexion entre le connecteur personnalisé et l’API de Microsoft Graph.

Collez le code suivant dans votre fichier, puis sauvegardez-le via la commande clavier Ctrl Shift+S avec le nom ConnectionService.cs :

using Microsoft.Graph.Models.ExternalConnectors;

static class ConnectionService
{
  async static Task CreateConnection()
  {
    Console.Write("Creating connection...");

    await GraphService.Client.External.Connections
      .PostAsync(ConnectionConfiguration.ExternalConnection);

    Console.WriteLine("DONE");
  }

  async static Task CreateSchema()
  {
    Console.WriteLine("Creating schema...");

    await GraphService.Client.External
      .Connections[ConnectionConfiguration.ExternalConnection.Id]
      .Schema
      .PatchAsync(ConnectionConfiguration.Schema);

    do
    {
      var externalConnection = await GraphService.Client.External
        .Connections[ConnectionConfiguration.ExternalConnection.Id]
        .GetAsync();

      Console.Write($"State: {externalConnection?.State.ToString()}");

      if (externalConnection?.State != ConnectionState.Draft)
      {
        Console.WriteLine();
        break;
      }

      Console.WriteLine($". Waiting 60s...");

      await Task.Delay(60_000);
    }
    while (true);

    Console.WriteLine("DONE");
  }

  public static async Task ProvisionConnection()
  {
    try
    {
      await CreateConnection();
      await CreateSchema();
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.Message);
    }
  }
}

Enfin, ouvrez le fichier Program.cs créé automatiquement dans votre dossier afin de signaler à notre l’application .NET de créer la connexion et son schéma.

Pour ce faire, remplacez le code de départ par celui-ci, puis sauvegardez-le via la commande clavier Ctrl Shift+S :

using System.CommandLine;

var provisionConnectionCommand = new Command("provision-connection",    "Provisions external connection");
provisionConnectionCommand.SetHandler(ConnectionService.   ProvisionConnection);

var rootCommand = new RootCommand();
rootCommand.AddCommand(provisionConnectionCommand);
Environment.Exit(await rootCommand.InvokeAsync(args));

Un premier test de création de connexion vers Microsoft 365 via l’API Microsoft Graph depuis notre connecteur personnalisé est déjà possible.

Etape VI – Test de connection :

Pour cela, utilisez la commande .NET suivante pour construire votre projet :

dotnet build

Démarrez l’application en exécutant la commande suivante, puis attendez :

dotnet run -- provision-connection

Ouvrez la page Search & intelligence suivante dédiée aux connecteurs de sources de données :

Continuez d’attendre la construction complète de la connexion :

Retournez sur cette même page afin de constater le changement du status de la connexion :

Nous venons de créer une connexion externe afin d’indexer nos futurs documents à venir dans Microsoft 365.

La prochaine étape consiste justement à importer de la donnée afin d’alimenter les index de Microsoft 365.

Etape VII – Configuration de l’import de contenu externe :

Un connecteur Microsoft Graph se connecte à un système externe, exporte son contenu et l’importe dans Microsoft 365. Au cours de ce processus, un connecteur graphique transforme le contenu exporté en éléments externes mettant en correspondance le contenu avec le schéma configuré sur la connexion externe.

Le contenu définit l’essentiel de l’élément qui est indexé pour la recherche en texte intégral. Pour un document ou une page wiki, il s’agit du corps du document. Pour un produit, il peut s’agir de sa description. Les connecteurs graphiques vous permettent d’importer du contenu au format texte ou HTML. Si vous importez du contenu binaire, comme des vidéos ou des images, vous devez obtenir leur représentation textuelle avant de les importer dans Microsoft 365.

Microsoft Learn

Afin de simuler facilement du contenu, Microsoft met à disposition sur GitHub des fichiers de contenu pour notre connecteur Microsoft Graph personnalisé.

Téléchargez ce contenu via ce lien GitHub, puis débloquez la protection sur l’archive ZIP :

Décompressez le contenu de l’archive dans l’arborescence de votre projet comme ceci :

Depuis l’explorateur Windows, vérifiez que le contenu de votre projet se présente sous cette forme :

Vérifiez la présence de cette nouvelle arborescence dans Visual Studio Code :

Dans Visual Studio Code, ouvrez le seul fichier .csproj présent dans votre projet :

Ajoutez le code suivant dans le fichier .csproj avant la balise </Project> pour copier le contenu, puis sauvegardez-le via la commande clavier Ctrl Shift+S :

<ItemGroup>
  <ContentFiles Include="content\**"    CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

<Target Name="CopyContentFolder" AfterTargets="Build">
  <Copy SourceFiles="@(ContentFiles)" DestinationFiles="@   (ContentFiles->'$(OutputPath)\content\%(RecursiveDir)%(Filename)%   (Extension)')" />
</Target>

Afin d’importer les fichiers de contenu au format Markdown vers Microsoft 365, nous devons extraire les métadonnées et convertir les contenus au format texte :

Pour y arriver, nous avons besoin d’autres bibliothèques :

dotnet add package Markdig
dotnet add package YamlDotNet

Créez un quatrième fichier texte consacré à la gestion du contenu à importer. Celui-ci va réaliser les actions suivantes :

  • Configuration du traitement du format markdown
  • Extraction des contenus markdown et YAML
  • Transformation du contenu en éléments externes
  • Chargement des éléments externes dans Microsoft 365

Collez le code suivant dans votre fichier, puis sauvegardez-le via la commande clavier Ctrl Shift+S avec le nom ContentService.cs :

using YamlDotNet.Serialization;
using Microsoft.Graph.Models.ExternalConnectors;
using Markdig;
public interface IMarkdown
{
  string? Markdown { get; set; }
}

class DocsArticle : IMarkdown
{
  [YamlMember(Alias = "title")]
  public string? Title { get; set; }
  [YamlMember(Alias = "description")]
  public string? Description { get; set; }
  public string? Markdown { get; set; }
  public string? Content { get; set; }
  public string? RelativePath { get; set; }
}

static class ContentService
{
static IEnumerable<DocsArticle> Extract()
{
  var docs = new List<DocsArticle>();

  var contentFolder = "content";
  var contentFolderPath = Path.Combine(Directory.GetCurrentDirectory(),    contentFolder);
  var files = Directory.GetFiles(contentFolder, "*.md", SearchOption.   AllDirectories);

  foreach (var file in files)
  {
    try
    {
      var contents = File.ReadAllText(file);
      var doc = contents.GetContents<DocsArticle>();
      doc.Content = Markdown.ToHtml(doc.Markdown ?? "");
      doc.RelativePath = Path.GetRelativePath(contentFolderPath, file);
      docs.Add(doc);
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.Message);
    }
  }

  return docs;
}

  static IEnumerable<ExternalItem> Transform(IEnumerable<DocsArticle> content)
{
  var baseUrl = new Uri("https://learn.microsoft.com/graph/");

  return content.Select(a =>
  {
    var docId = GetDocId(a.RelativePath ?? "");
    return new ExternalItem
    {
      Id = docId,
      Properties = new()
      {
        AdditionalData = new Dictionary<string, object> {
            { "title", a.Title ?? "" },
            { "description", a.Description ?? "" },
            { "url", new Uri(baseUrl, a.RelativePath!.Replace(".md",    "")).ToString() }
        }
      },
      Content = new()
      {
        Value = a.Content ?? "",
        Type = ExternalItemContentType.Html
      },
      Acl = new()
      {
          new()
          {
            Type = AclType.Everyone,
            Value = "everyone",
            AccessType = AccessType.Grant
          }
      }
    };
  });
}

static async Task Load(IEnumerable<ExternalItem> items)
{
  foreach (var item in items)
  {
    Console.Write(string.Format("Loading item {0}...", item.Id));

    try
    {
      await GraphService.Client.External
        .Connections[Uri.EscapeDataString(ConnectionConfiguration.   ExternalConnection.Id!)]
        .Items[item.Id]
        .PutAsync(item);

      Console.WriteLine("DONE");
    }
    catch (Exception ex)
    {
      Console.WriteLine("ERROR");
      Console.WriteLine(ex.Message);
    }
  }
}

  public static async Task LoadContent()
  {
    var content = Extract();
    var transformed = Transform(content);
    await Load(transformed);
  }

  static string GetDocId(string relativePath)
{
  var id = relativePath.Replace(Path.DirectorySeparatorChar.ToString(),    "__").Replace(".md", "");
  return id;
}
}

Créez un cinquième fichier texte consacré à l’extraction de contenu fichiers de contenu.

Collez le code suivant dans votre fichier, puis sauvegardez-le via la commande clavier Ctrl Shift+S avec le nom MarkdownExtensions.cs :

// from: https://khalidabuhakmeh.com/parse-markdown-front-matter-with-csharp
using Markdig;
using Markdig.Extensions.Yaml;
using Markdig.Syntax;
using YamlDotNet.Serialization;

public static class MarkdownExtensions
{
  private static readonly IDeserializer YamlDeserializer =
      new DeserializerBuilder()
      .IgnoreUnmatchedProperties()
      .Build();

  private static readonly MarkdownPipeline Pipeline
      = new MarkdownPipelineBuilder()
      .UseYamlFrontMatter()
      .Build();
      public static T GetContents<T>(this string markdown) where T :    IMarkdown, new()
{
  var document = Markdown.Parse(markdown, Pipeline);
  var block = document
      .Descendants<YamlFrontMatterBlock>()
      .FirstOrDefault();

  if (block == null)
    return new T { Markdown = markdown };

  var yaml =
      block
      // this is not a mistake
      // we have to call .Lines 2x
      .Lines // StringLineGroup[]
      .Lines // StringLine[]
      .OrderByDescending(x => x.Line)
      .Select(x => $"{x}\n")
      .ToList()
      .Select(x => x.Replace("---", string.Empty))
      .Where(x => !string.IsNullOrWhiteSpace(x))
      .Aggregate((s, agg) => agg + s);

  var t = YamlDeserializer.Deserialize<T>(yaml);
  t.Markdown = markdown.Substring(block.Span.End + 1);
  return t;
}
}

Enfin, rouvrez à nouveau le fichier Program.cs modifié précédemment pour y ajouter la commande de chargement du contenu, puis sauvegardez-le via la commande clavier Ctrl Shift+S :

var loadContentCommand = new Command("load-content", "Loads content   into the external connection");
loadContentCommand.SetHandler(ContentService.LoadContent);
rootCommand.AddCommand(loadContentCommand);

Etape VIII – Test d’importation :

Pour cela, utilisez la commande .NET suivante pour reconstruire à nouveau votre projet :

dotnet build

Commencez à charger le contenu vers Microsoft 365 en exécutant la commande suivante :

dotnet run -- load-content

Retournez sur la page Search & intelligence afin de constater l’ajout d’objets indexés en haut à droite :

Notre environnement 365 contient maintenant l’accès à ces nouveaux documents. Il nous faut maintenant activer cette source dans 365 pour que Copilot puisse les ressortir en résultat.

Etape IX – Activation de la connexion externe dans Copilot :

Toujours sur cette même page d’administration 365, rendez-vous sur l’onglet Personnalisations, puis cliquez-ici pour activer votre connecteur dans les résultats :

Cochez les cases suivantes pour activer votre connecteur dans les résultats Copilot :

Etape X – Second test Copilot avec connecteur :

Sur votre utilisateur ayant la licence Copilot pour Microsoft 365, retournez sur la page de Copilot en mode Work en ayant toujours aucun plugin d’actif :

Saisissez à nouveau le prompt suivant :

please find a doc how to install a Microsoft Graph SDK

Constatez l’apparition d’un résultat avec une ou plusieurs références de type Externe :

Refaite la même opération en promptant sur le même sujet, puis cliquez sur la source externe :

Constatez l’ouverture d’un nouvel onglet pointant vers la documentation Microsoft Learn car le document dispose d’une URL pointant vers celle-ci :

Conclusion

Par les extensions, Microsoft nous montre que l’IA n’en est qu’à ses débuts dans les différents systèmes de données. Les entreprises ont tout y gagner à connecter une IA sur un ensemble de plusieurs systèmes d’informations.

Savoir que je peux interroger mes stocks de marchandises, et les modifier au besoin dans mes autres systèmes au moyen d’une IA connectée me fait espérer beaucoup d’innovations pour les années à venir :

Je souhaite donc continuer à écrire d’autres articles sur l’IA. Par exemple, en testant les Quickstarts proposés par Microsoft, comme Build your first custom Microsoft Graph connector.

Votre Copilot a faim ! 🍔

Copilot pour Microsoft 365 fait maintenant partie de votre quotidien depuis plusieurs semaines ? Vous êtes donc un utilisateur régulier de Copilot dans plusieurs applications 365 ? En ressentez-vous déjà les premiers impacts sur votre productivité ?

Copilot pourrait-il en faire plus ?

Il est possible que vous soyez prêts à élargir le périmètre de votre Copilot ! Pour cela, prenez le temps de savoir comment Copilot pourrait exploiter d’autres données, et surtout comment il s’y prendrait.

Voici déjà quelques articles écrits sur ce blog autour des solutions Copilot de Microsoft :

Comme le rappelle Microsoft, Copilot est en soit l’IA générative actuellement la plus adaptée aux applications et données présentes dans Microsoft 365 :

En soi, Copilot pour Microsoft 365 est un outil de productivité puissant pour maintenir les utilisateurs dans le flux de leur travail dans les applications Microsoft 365. Il fournit aux utilisateurs des compétences générales telles que la compréhension, la synthèse, la prédiction, le rappel, la traduction et la génération de contenu.

Il s’appuie sur une base de référence de vos connaissances organisationnelles en indexant du contenu dans Microsoft Graph, tel que les e-mails, les conversations et les documents auxquels les utilisateurs ont l’autorisation d’accéder.

Microsoft Learn

Copilot pour Microsoft 365 a été annoncé il y a longtemps, mais les choses évoluant très rapidement, prenez-le temps de regarder cette vidéo en français pour comprendre un peu mieux Copilot pour Microsoft 365 :

Je pense que ce schéma a déjà dû passer sous vos yeux à plusieurs reprises, mais il est facile à comprendre car il montre les avantages natifs d’un Copilot déjà connecté aux données de votre tenant.

De ce fait, et sans rien faire d’autres qu’acheter des licences Copilot pour Microsoft 365, le schéma technique de votre IA Copilot ressemble déjà à ça :

Alors, pourquoi en faire plus ?

Car l’IT d’une entreprise a de nombreuses vies et ne se limite pas aux outils 365 et aux données stockées dans SharePoint, OneDrive et autres.

Bien souvent, d’autres outils proviennent d’éditeurs tiers ou sont créés en internes pour des besoins métiers. La donnée peut donc se trouver en dehors de l’environnement 365 et possiblement sous des formats spécifiques.

Techniquement, Copilot pour Microsoft 365 ne peut donc pas s’inspirer de cette donnée inconnue ou même la proposer si un utilisateur lui en fait la demande via un prompt.

Mais une fois en place, votre Copilot pour Microsoft 365 dispose de plusieurs possibilités pour étendre son périmètre pour coller toujours plus aux besoins :

Pour vous faire une meilleure idée, voici un exemple assez parlant donné par Microsoft :

  • Suivi des problèmes pour l’équipe d’ingénierie : Supposons que votre équipe d’ingénierie s’appuie sur un logiciel de gestion de projet. Vous pouvez créer un outil personnalisé qui permet aux utilisateurs de surveiller les tickets ouverts. Un utilisateur peut demander des informations sur tous les problèmes qui lui sont attribués, et Copilot pour Microsoft 365 peut récupérer et présenter ces données en toute transparence à partir de votre plugin.

Imaginez alors d’autres données relatives aux ressources humaines, à la comptabilité, aux outils de productions industrielles ou encore à la finance ? Tout cela à la portée d’un simple prompt à Copilot ?

Oui mais, comment s’y prend-on ?

Rien n’est automatique, mais Microsoft vous propose déjà 2 approches pour y parvenir :

  • Plugin : Ideal pour les données structurées. Développez des plugins qui utilisent le schéma OpenAI pour ajouter des fonctionnalités personnalisées aux expériences Microsoft Copilot, en connectant les données de votre propre application à Microsoft Copilot. Les plugins permettent à une expérience Copilot d’interagir avec vos propres API, améliorant ainsi l’expérience pour effectuer un plus grand nombre d’actions. (Source : Microsoft)
  • Connecteur : Ideal pour les données non structurées. Le connecteur vous permet d’ingérer vos données métier non structurées dans Microsoft Graph, afin que Copilot pour Microsoft 365 puissent raisonner sur l’intégralité du contenu de votre entreprise. Le contenu ingéré via les connecteurs Graph est ajouté à Microsoft Graph ; cela déverrouille la compréhension sémantique des invites de vos utilisateurs dans Copilot pour Microsoft 365. (Source : Microsoft)

Mais alors, lequel choisir ?

Pour vous aider au mieux à comprendre, cette vidéo de Microsoft vous montre justement les impacts en situation réelle :

Pour vous aider à faire votre choix, Microsoft a également mis à disposition cet arbre de décision :

Attention, la structure de la donnée pourrait avoir elle aussi un impact sur votre choix :

ConnecteursPlugins
StructureDonnées non structurées ou aplatisDonnées structurées
Volume de donnéesJusqu’à 5 millions d’éléments par connexionConvient pour les données à volume élevé (plus de 5 M)
Activité des donnéesJusqu’à 20 demandes par secondeAdapté à une activité élevée (plus de 20 req/s.)
Lecture/ÉcritureLecture seuleInscriptible

Enfin, Microsoft liste ici les avantages techniques des 2 solutions :

ConnecteursPlugins
AvantagesPertinence basée sur les activités de l’utilisateur. Détection sémantique du contenu sans activation d’un plugin. Activités (telles que l’affichage, la modification et le partage) avec aide sur le classement et la pertinence des résultats de recherche. Les données restent dans les limites de conformitéDétectabilité dans le Windows Store. Activation de l’expérience de marque. Meilleure expérience utilisateur avec les cartes adaptatives
Fonctionnalités de l’expérience développeurConnexion rapide, schéma d’inscription et éléments d’indexKit de ressources Teams pour Visual Studio & VS Code. Chargement de version test pour le développement & test
Fonctionnez également avecIQ de contexte, Viva Topics, Recherche d’entreprise dans M365.com, SharePoint et Bing @ work. Recommandations de contenu dans les applications M365Conversation Teams, Outlook

Existe-t-il des limitations techniques ?

En effet, les 2 options présentent des limitations techniques qui peuvent influer sur votre choix :

ConnecteursPlugins
Limites30 connecteurs maximum dans le locataire.

Volume de données et activité relativement faibles.

Visibilité de l’application pour les utilisateurs.
Maximum d’un million de plugins activés par utilisateur. Les plugins doivent être activés manuellement. Les données peuvent quitter la limite de conformité. Orchestrator ne peut raisonner qu’avec 10 plugins par invite. Les performances dépendent des développeurs & l’hébergement.
Limitations de l’expérience des développeursAucun outil pour Visual Studio & VS Code. Aucun chargement indépendant. Vous devez rester synchronisé avec la liste de contrôle d’accès (ACL) manuellement si vous êtes dans des groupes externes en dehors du groupe Id Entra (Azure AD)Courbe d’apprentissage abrupte.
Plus de temps pour développer.
Vous devez gérer les invites à paramètres multiples.
Plus d’informationsLimites de l’API connecteurs GraphConditions techniques requises pour les plugins d’extension de message

Important : il n’est pour l’instant pas possible d’acheter et de provisionner des licences acheter Copilot for Microsoft 365 sur un tenant créé à partir du Microsoft 365 Developer Program.

Et Copilot Studio dans tout ça ?

Pas de secret, Microsoft Copilot Studio s’appuie déjà sur du connu et reconnu ! 😎🙏

Un grand merci à Elliott Pierret pour cette vidéo très explicative sur comment jouer avec Copilot Studio pour créer son propre Copilot ou enrichir un Copilot existant grâce aux outils suivants :

  • Copilot Builder
  • Plugin Builder
  • Prompt Builder

Conclusion

Quelle que soit votre stratégie Copilot, l’objectif de cette IA générative est avant tout de simplifier la vie à vos utilisateurs. Beaucoup de tâches sans grande valeur ajoutée peuvent et ont également intérêt à être traitées par l’intelligence artificielle.

Je vous invite à regarder cette interview très intéressante de Jean-François Bérenguer faite par Seyfallah Tagrerout sur le potentiel de Copilot et les services IT possibles avec une valeur ajoutée pour les entreprises dans leur transition vers l’IA :

  • Accompagnement au prompt
  • Mise en place du gouvernance de la donnée (protection)
  • Personnalisation de Copilot (Connecteurs, plugins)

Attendez-vous très prochainement à voir plusieurs articles sur des essais pratiques de Copilot 😎

Windows Server 2025 🪟

Depuis seulement quelques jours, La nouvelle release de Windows Server s’appelle maintenant Windows Server 2025 ! Seulement disponible via le programme Windows Server Insider, la version Build v26040 de Windows Server 2025 promet de nouvelles fonctionnalités comme le Hotpatching pour tous ou encore Active Directory et SMB en version Next Gen, et sûrement encore plein d’autres à découvrir.

Cette annonce de Windows Server 2025 a été faite sur le site TechCommunity juste ici.

De précédentes annonces concernant Windows Server avaient été annoncées durant le dernier Ignite juste :

Je ne vais pas rentrer tout de suite dans les détails de Windows Server 2025, que je ne connais pas encore car je ne l’ai pas testé. Mais je trouvais intéressant de partager avec vous une méthode de déploiement facile et rapide du dernier OS de Microsoft sur Azure.

En effet, et comme vous pouvez vous en doutez, ce dernier n’est pas encore directement accessible via le portail Azure lors de la création d’une machine virtuelle.

D’où mon petit exercice très rapide sur le sujet :

Commençons par un bref rappel des prérequis.

Etape 0 – Rappel des prérequis :

Pour réaliser cet exercice sur Windows Server 2025, il vous faudra disposer de :

  • Un tenant Microsoft
  • Une souscription Azure valide

La suite se passera par l’inscription au programme Windows Insider.

Etape I – Programme Windows Insider :

Afin de récupérer l’image de la dernière version disponible de Windows Server 2025, il est donc nécessaire de s’inscrire au programme Windows Insider (de Windows Server).

La documentation officielle de Microsoft l’explique bien et est accessible via ce lien :

Vous pouvez vous inscrire directement Programme Windows Insider via cette page, en utilisant un compte Microsoft Entra ou même un compte personnel Microsoft :

Lisez les informations du programme, puis acceptez ses termes si vous êtes d’accord :

Cliquez-ici pour rejoindre la page dédiée à Windows Server :

Choisissez la version suivante de Windows Server afin de pouvoir l’installer sous Azure :

Sélectionnez la seule langue disponible actuellement, puis cliquez sur Confirmer :

Cliquez-ici pour commencer le téléchargement du fichier au format VHDX :

Attendez quelques minutes la fin du téléchargement sur votre poste :

Une fois téléchargé, le fichier VHDX doit être converti en VHD pour être exploité sous Azure.

Etape II – Préparation du fichier image VHD :

En effet Azure ne support que le format VHD. Nous allons donc devoir effectuer une conversion de format. Cela est possible facilement en PowerShell.

Note : Pour utiliser la commande Convert-VHD, les outils Hyper-V sont nécessaires.

Ouvrez PowerShell, puis lancez la commande suivante pour convertir le fichier téléchargé au format VHDX en fichier au format VHD :

Convert-VHD –Path c:\2025\Windows_InsiderPreview_ServerDatacenter_Azure_Edition_en-us_VHDX_26040.vhdx –DestinationPath c:\2025\Windows_InsiderPreview_ServerDatacenter_Azure_Edition_en-us_VHDX_26040.vhd -VHDType Fixed

Attendez environ 5 minutes que le traitement de conversion se termine :

Une fois le fichier image converti au format VHD, ouvrez le portail Azure, puis recherchez le Service de stockage :

Créez un nouveau compte de stockage Azure en cliquant ici :

Nommez votre compte de stockage, puis lancez la validation Azure :

Une fois la validation Azure réussie, démarrez la création de la ressource :

Environ 1 minute plus tard, cliquez-ici pour vous connecter au nouveau compte de stockage :

Créez un nouveau contenaire blob :

Nommez-le puis lancez sa création :

Dans ce contenaire blob, cliquez sur Téléverser :

Sélectionnez votre fichier VHD, choisissez le format Page Blob, puis cliquez sur Téléverser :

La notification Azure suivante doit apparaitre :

Suivez l’évolution de l’envoi vers Azure en bas à droite de l’écran :

Attendez environ 15 minutes que l’envoi vers Azure se termine :

Une fois l’envoi vers Azure terminé, cliquez sur votre blob pour en copier l’URL :

Votre source est enfin prête. Nous allons maintenant créer une galerie d’images de VM en faisant appel à notre fichier blob.

Etape III – Création de la galerie d’images :

Pour cela, commencez par rechercher le service Azure suivant :

Créez une nouvelle galerie d’images VM en cliquant ici :

Nommez votre galerie d’images VM, puis lancez la validation Azure :

Une fois la validation Azure réussie, cliquez-ici pour démarrer la création de la ressource :

Environ 1 minute plus tard, la galerie d’images VM est créée, puis cliquez ici :

Cliquez-ici pour créer une nouvelle définition d’image VM :

Renseignez tous les champs nécessaires, puis lancez la validation Azure :

Une fois la validation Azure réussie, lancez la création de la ressource :

Environ 2 minutes plus tard, cliquez-ici pour ajouter une nouvelle version :

Cliquez-ici pour ajouter une nouvelle version à votre définition d’images VM :

Renseignez les champs et reprenez pour le disque OS l’URL du blob copiée précédemment :

Lancez la validation Azure :

Une fois la validation Azure réussie, lancez la création de la ressource :

Environ 10 minutes plus tard, cliquez-ici pour retourner sur votre version :

Notre environnement est enfin prêt, nous allons maintenant créer notre première machine virtuelle sous Windows Server 2025.

Etape IV – Création de la machine virtuelle :

Cliquez-ici pour créer une nouvelle machine virtuelle à partir de cette image :

Renseignez tous les champs de base :

Définissez un compte administrateur local, puis cliquez sur Suivant :

Aucune modification n’est à faire sur cet onglet, cliquez sur Suivant :

Retirez l’IP publique de votre VM, puis cliquez sur Suivant :

Retirez l’extinction automatique, puis lancez la validation Azure :

Une fois la validation Azure réussie, cliquez-ici pour lancer la création de la ressource :

Environ 5 minutes plus tard, cliquez-ici pour consulter la machine virtuelle créée :

Dans la foulée, déployez le service Azure Bastion afin de pouvoir ouvrir une connexion RDP :

Attendez 5 minutes la création du service Azure Bastion :

Etape V – Test et connexion :

Une fois le service Azure Bastion déployé, ouvrez une session RDP par ce dernier :

Définissez la politique d’envoi de données à Microsoft :

Depuis Server Manager, vérifiez la bonne version de votre Windows Server :

Depuis Paramètres, vérifiez la bonne version de votre Windows Server :

De retour sur Azure, profitez-en pour installer Windows Admin Center :

Attendez environ 1 minute que l’extension Windows Admin Center soit installée :

Vérifiez sa bonne installation par cet écran :

Ajoutez votre utilisateur Entra ID le rôle RBAC suivant :

Ajoutez une IP publique et une règle entrante NSG pour pouvoir vous connecter à Windows Admin Center depuis le portail Azure :

Ouvrez une connexion à Windows Admin Center :

Vérifiez la bonne disponibilité des informations via Windows Admin Center :

Redémarrez par le portail Azure votre VM si Windows Admin Center reste trop longtemps sur cette page :

Conclusion

Microsoft continue de faire avancer Windows Server dans sa gamme de produit OS, et promet à coup sûr de belles choses à venir 😎. Quand j’aurais pris le temps de faire mes tests dessus🤣, comptez sur moi pour d’autres articles à suivre !

Microsoft 365 Backup

Une des grandes annonces du dernier Ignite portait sur l’introduction d’une solution native de sauvegarde 365, appelée Microsoft 365 Backup. Attendue depuis de nombreuses années et faisant la part belle aux solutions tierces, voyons ce que ce nouveau venu propose puisque la préversion publique est ouverte depuis maintenant une semaine.

Oui, Microsoft 365 Backup est en préversion depuis une semaine et son déploiement se fait progressivement sur l’ensemble des tenants du Cloud Public de Microsoft. Cette approche est d’ailleurs similaire à celle utilisée lors du déploiement de Microsoft 365 Archive, dont je vous invite à lire l’article ici. Aucune date de GA n’a encore été annoncée si ce n’est pour 2024.

Quelles sont les termes et conditions de Microsoft 365 Backup ?

Le lien officiel Microsoft est disponible juste ici. On peut résumer les points suivants :

  • Fonctionnalités en préversion
  • Microsoft 365 Backup permet de sauvegarder des objets des services suivants :
    • des comptes OneDrive
    • des sites SharePoint
    • des boîtes mails Exchange Online
  • Nécessite une souscription Azure
  • Tarif à la consommation (PAYG) actuel de 0,15 $/Go/Mois

Microsoft a déjà à disposition une première FAQ.

Quelles sont les limites de la préversion de Microsoft 365 Backup ?

Le lien officiel Microsoft est disponible juste . On peut résumer les points suivants :

  • Performances potentiellement dégradées
  • Une seule police de sauvegarde par service :
    • OneDrive
    • SharePoint
    • Exchange Online
  • Limitations renforcées pour éviter l’engorgement des ressources Microsoft

Combien coûte Microsoft 365 Backup ?

Une sauvegarde IT est rarement gratuite, elle peut même vite représenter des coûts très importants. Pour Microsoft 365 Backup, le seul prix actuel connu est celui de la préversion, à savoir $0.15/Go de données sauvegardées.

Le volume total de données sauvegardées est la somme des boîtes Outlook protégées, des sites SharePoint protégés et des comptes OneDrive protégés.

Pour vous aider à estimer vos coûts, Microsoft a mis un disposition un Calculateur dédié à Microsoft 365 Backup sous format Excel. Vous pouvez alimenter cette feuille Excel en lisant cette notice et en vous basant sur les usages de votre tenant :

Il est à noter que la volume total dépendra également de la rétention de données anciennes sauvegardées. Autrement dit, une grosse boite mail supprimée continuera d’impacter les sauvegardes et donc les coûts sur plusieurs mois.

Existe-t-il des limitations à la sauvegarde / restauration ?

Actuellement, chacun des 3 services dispose des limites suivantes :

  • SharePoint :
    • Fréquences des sauvegardes (< 14 jours) : toutes les 15 minutes
    • Fréquences des sauvegardes (> 14 jours) : toutes les semaines
    • Durée de rétention : 1 année
    • Tâches de restauration actives (max) : 25
    • Sites en cours de restauration dans le cadre de tâches de restauration actives (max) : 1000
    • Nombre total de sites restaurés (actifs et achevés) aujourd’hui (max) : 10000
  • Exchange :
    • Fréquences des sauvegardes : toutes les 10 minutes
    • Durée de rétention : 1 année
    • Tâches de restauration actives (max) : 25
    • Boîtes aux lettres d’utilisateurs restaurées dans le cadre de tâches de restauration actives (max) : 1000
    • Nombre total de boîtes aux lettres restaurées (actives et terminées) aujourd’hui (max) : 10000
  • OneDrive :
    • Fréquences des sauvegardes (< 14 jours) : toutes les 15 minutes
    • Fréquences des sauvegardes (> 14 jours) : toutes les semaines
    • Durée de rétention : 1 année
    • Tâches de restauration actives (max) : 25
    • Comptes en cours de restauration dans les tâches de restauration actives (max) : 1000
    • Nombre total de comptes restaurés (actifs et terminés) (max) : 10000

Pourrons-nous suivre les coûts de Microsoft 365 Backup ?

Mon hypothèse est que les coûts seront visibles de la même manière que les autres ressources Azure, via le Cost Management :

Comme toujours je vous propose de réaliser un petit exercice sur le sujet :

Commençons par un bref rappel des prérequis.

Etape 0 – Rappel des prérequis :

Pour réaliser cet exercice sur Microsoft 365 Backup, il vous faudra disposer de :

  • Un tenant Microsoft
  • Une souscription Azure valide

Dans mon cas, j’ai utilisé un tenant Microsoft 365 disposant de licences Microsoft 365 E5 issues de la plate-forme CDX. J’y ai ensuite rajouté une souscription Azure MSDN.

Etape I – Préparation de l’environnement Azure :

Avant de pouvoir tester cette fonctionnalité, il est nécessaire de créer un groupe de ressources sur votre souscription Azure pour y stocker les sauvegardes 365.

Une fois la validation Azure réussie, lancez la création, puis attendez environ 1 minute :

Et c’est tout, rien de plus n’est nécessaire du côté d’Azure ! La suite va se passer du côté de Microsoft 365.

Etape II – Activation de la fonction de sauvegarde :

Recherchez la rubrique suivante, puis cliquez dessus :

Commencez par cliquez ici pour configurer Syntex, alias SharePoint Premium :

Sélectionnez la souscription Azure de votre choix :

Reprenez le groupe de ressources Azure créé précédemment, puis choisissez la localisation des sauvegardes :

Cochez la case des conditions d’utilisation et de facturation, puis cliquez sur Sauvegardez :

Attendez environ 1 minute que Microsoft finalise la configuration de votre tenant :

La notification suivante apparaît alors sur ce même onglet :

Cliquez ensuite sur ce lien pour visualiser la liste des services disponibles :

Vérifiez que la fonction de sauvegarde est bien présente, puis cliquez dessus :

Activez la fonction de sauvegarde comme ceci :

Confirmez votre choix après avoir lu au besoin les termes et conditions du service :

La mise en route est maintenant terminée, il ne nous reste plus qu’à configurer les polices de sauvegarde en cliquant ici :

Commençons par le service Exchange.

Etape III – Police de sauvegarde Exchange :

Retrouvez toutes les polices de sauvegarde 365 depuis cette page disponible sur la console d’administration :

Cliquez-ici pour configurer la police de sauvegarde d’Exchange :

Cliquez sur Suivant :

Intégrés les comptes Outlook à protéger, puis cliquez sur Suivant :

Prenez en compte la politique de sauvegarde non modifiable, puis cliquez ici pour créer la police :

Attendez quelques secondes pour finaliser la création de la police :

La police est maintenant créée, attendez quelques minutes la mise en application de celle-ci sur votre tenant :

Quelques minutes plus tard, le statut est passé sur actif, cliquez-ici pour voir les options :

Il est possible de mettre en pause la police, cliquez-ici pour rajouter un compte Exchange :

Constatez le nouveau traitement une fois un autre compte exchange rajouté :

Continuons avec la police de sauvegarde SharePoint.

Etape IV – Police de sauvegarde SharePoint :

Cliquez-ici pour configurer la police de sauvegarde SharePoint :

Cliquez sur Suivant :

Intégrés les sites SharePoint à protéger, puis cliquez sur Suivant :

Prenez en compte la politique de sauvegarde non modifiable, puis cliquez ici pour créer la police :

Attendez quelques secondes pour finaliser la création de la police :

La police est maintenant créée, cliquez-ici pour revenir sur la page précédente :

Attendez quelques minutes la mise en application de celle-ci sur votre tenant :

Terminons par la police de sauvegarde OneDrive.

Etape V – Police de sauvegarde OneDrive :

Cliquez-ici pour configurer la police de sauvegarde OneDrive :

Cliquez sur Suivant :

Intégrés les comptes OneDrive à protéger, puis cliquez sur Suivant :

Prenez en compte la politique de sauvegarde non modifiable, puis cliquez ici pour créer la police :

Attendez quelques secondes pour finaliser la création de la police :

La police est maintenant créée, cliquez-ici pour revenir sur la page précédente :

La police est maintenant créée, attendez quelques minutes la mise en application de celle-ci sur votre tenant :

Commençons les tests de restauration.

Etape VI – Restauration de mails Outlook :

Commençons par supprimer quelques mails depuis Outlook stockés dans la boite de réception :

Supprimez ces mêmes mails Outlook depuis la corbeille :

Supprimez enfin ces mêmes mails Outlook depuis la seconde corbeille :

Attendez au minimum 10 minutes

Retournez sur la page Microsoft 365 Backup du portail d’administration 365, puis cliquez-ici pour entamer la restauration :

Conservez le choix du service à restaurer, puis cliquez sur Suivant :

Choisissez les objets à restaurer parmi la liste disponible, puis cliquez sur Suivant :

Définissez le fuseau horaire et la sauvegarde la plus proche, puis cliquez sur Suivant :

Affinez votre sauvegarde en cliquant ici :

Choisissez un point de restauration antérieur à l’évènement, puis cliquez sur Sauvegarder :

Cliquez sur Suivant :

Choisissez la méthode de restauration, puis cliquez sur Suivant :

Cliquez-ici pour démarrer le travail de restauration :

La tâche de restauration est prise en compte, cliquez-ici pour revenir sur la page précédente :

Il ne reste plus qu’à patienter :

Quelques minutes plus tard, le statut de la restauration a changé :

Le dossier est bien visible côté utilisateur et ce dernier contient bien les mails précédemment supprimés :

Continuons avec la restauration SharePoint.

Etape VII – Restauration de sites SharePoint :

Retournez sur la page Microsoft 365 Backup du portail d’administration 365, puis cliquez-ici pour entamer la restauration :