Cet article a fait l’objet d’une traduction automatique. Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez également afficher le texte anglais dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte traduit.
Traduction
Anglais

Créer des travaux du minuteur à distance dans SharePoint

Créer des travaux du minuteur à distance dans SharePoint pour effectuer des tâches d'arrière-plan pour gérer ou à gérer votre environnement.

Dernière modification :vendredi 7 août 2015

S’applique à :SharePoint 2013 | SharePoint Add-ins | SharePoint Online

Note Remarque

Le nom « Applications pour SharePoint » est remplacé par « Compléments SharePoint ». Lors de la période de transition, il se peut que la documentation et l’interface utilisateur de certains produits SharePoint et outils Visual Studio utilisent toujours le terme « applications pour SharePoint ». Pour plus d’informations, voir Nouveau nom des applications pour Office et SharePoint.

Créer des travaux du minuteur à distance pour gérer les SharePoint en surveillant et entreprendre une action sur les données SharePoint. Travaux du minuteur distant n'exécutez pas sur votre serveur SharePoint. Au lieu de cela, les travaux du minuteur à distance sont des tâches planifiées qui s'exécutent sur un autre serveur. Voici quelques exemples d'utilisation des travaux du minuteur :

  • Effectue des tâches de gouvernance, telles que l'affichage d'un message sur le site lorsque certains critères ne sont pas remplies, ou en appliquant des stratégies de rétention.

  • Processus planifiée qui sollicitent beaucoup le processeur de sont en cours d'exécution.

Contribuer à ce contenu

Vous pouvez obtenir les dernières mises à jour ou contribuer à cet article sur Github. Vous pouvez également contribuer à cet article et d’autres exemples sur GitHub. Pour obtenir la liste complète des exemples, consultez le Centre des développeurs des pratiques et modèles. Nous accueillons avec plaisir vos contributions.

Pour commencer, téléchargez le complément exemple Core.TimerJobs.Samples à partir du projet de pratiques et modèles de développeur Office 365 sur les référentiels.

Pour démarrer à l'aide de la solution Core.TimerJobs.Samples, vous devez sélectionner un projet de démarrage, par exemple le projet SimpleJob, en ouvrant le menu contextuel (clic droit) l' Core.TimerJobs.Samples.SimpleJob et puis en sélectionnant définir comme projet de démarrage.

Remarque Remarque

Lorsque vous créez un nouveau projet dans Visual Studio, pour commencer à créer votre nouveau travail de minuteur à distance, ajoutez le package NuGet OfficeDevPnP.Core à votre projet. Dans Visual Studio, choisissez Outils > Gestionnaire de Package NuGet > Gérer les Packages NuGet pour la Solution.

Un travail du minuteur peut être programmé pour s'exécuter une seule fois, ou peut être une tâche périodique. Pour planifier votre travail du minuteur à distance dans votre environnement de production, vous devez compiler votre code dans un fichier .exe, puis exécutez le fichier .exe à l'aide de Windows du Planificateur de tâches ou un Microsoft Azure WebJob. Vous en apprendrez plus sur les options de déploiement du travail du minuteur.

Dans Core.TimerJobs.Samples.SimpleJob, principal dans Program.cs effectue les opérations suivantes :

  1. Crée un objet SimpleJob qui hérite de la classe de base OfficeDevPnP.Core.Framework.TimerJobs.TimerJob .

  2. Définit les informations d'identification de l'utilisateur à utiliser lors de l'exécution du travail du minuteur à l'aide de TimerJob.UseOffice365Authenticationles Office 365. Les informations d'identification de l'utilisateur doivent avoir un accès approprié aux collections de sites. Vous en apprendrez plus au niveau de l'authentification.

  3. Ajoute les sites que le travail du minuteur doit effectuer des tâches à l'aide de TimerJob.AddSite. Si vous le souhaitez, vous pouvez répéter l'instruction TimerJob.AddSite pour ajouter plusieurs sites, ou ajoutez tous les sites sous une URL particulière en utilisant le caractère générique *. Par exemple, http://contoso.sharepoint.com/sites/ * exécutera le travail du minuteur sur tous les sites sous le chemin d'accès géré sites.

  4. Imprime les informations sur le travail du minuteur et exécute le travail du minuteur à l'aide de PrintJobSettingsAndRunJob.

Remarque Remarque

Le code dans cet article est fourni tel quel, sans garantie d’aucune sorte, expresse ou implicite, y compris mais sans s’y limiter, aucune garantie implicite d’adéquation à un usage particulier, à une qualité marchande ou une absence de contrefaçon.

 static void Main(string[] args)
        {
            SimpleJob simpleJob = new SimpleJob();
            
            // The user credentials must have access to the site collections you supply.
            simpleJob.UseOffice365Authentication(User, Password);

            // Use the following code if you are using SharePoint Server 2013 on-premises. 
            //simpleJob.UseNetworkCredentialsAuthentication(User, Password, Domain);
            
            // Add one or more sites that the timer job should work with.
            simpleJob.AddSite("https://contoso.sharepoint.com/sites/dev");
            
            // Prints timer job information and then calls Run().
            PrintJobSettingsAndRunJob(simpleJob);
        }

Lorsque l'objet simpleJob est instanciée, le constructeur SimpleJob :

  1. Appelle le constructeur de classe de base du travail de minuteur.

  2. Attribue le Gestionnaire d'événements pour gérer les événements de TimerJobRunSimpleJob_TimerJobRun . SimpleJob_TimerJobRun s'exécute lorsqu'un appel est effectué à TimerJob.Run, qui est décrite plus en détail plus loin dans cet article.

public SimpleJob() : base("SimpleJob")
        {
            TimerJobRun += SimpleJob_TimerJobRun;
        }

Lors de l'exécution de PrintJobSettingsAndRunJob , sortie à partir du travail de minuteur est écrit dans la fenêtre de la console, puis TimerJob.Run est appelée.

 private static void PrintJobSettingsAndRunJob(TimerJob job)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("************************************************");
            Console.WriteLine("Job name: {0}", job.Name);
            Console.WriteLine("Job version: {0}", job.Version);
            Console.WriteLine("Use threading: {0}", job.UseThreading);
            Console.WriteLine("Maximum threads: {0}", job.MaximumThreads);
            Console.WriteLine("Expand sub sites: {0}", job.ExpandSubSites);
            Console.WriteLine("Authentication type: {0}", job.AuthenticationType);
            Console.WriteLine("Manage state: {0}", job.ManageState);
            Console.WriteLine("SharePoint version: {0}", job.SharePointVersion);
            Console.WriteLine("************************************************");
            Console.ForegroundColor = ConsoleColor.Gray;

            // Run job.
            job.Run();
        }

TimerJob.Run déclenche les événements de TimerJobRun . TimerJob.Run appelle SimpleJob_TimerJobRun dans SimpleJob.cs, que vous définissez comme gestionnaire d'événements pour gérer les événements de TimerJobRun dans le constructeur de SimpleJob. Dans SimpleJob_TimerJobRun, vous pouvez ajouter votre code personnalisé que vous souhaitez que votre travail du minuteur à effectuer lors de l'exécution du travail du minuteur. SimpleJob_TimerJobRun exécute votre code personnalisé sur les sites que vous avez ajouté à l'aide de TimerJob.AddSite dans Program.cs. Dans cet exemple de code, SimpleJob_TimerJobRun utilise le ClientContext à partir du travail de minuteur pour écrire le titre du site dans la fenêtre de console. Si plusieurs sites ont été ajoutés à l'aide de TimerJob.AddSite, SimpleJob_TimerJobRun est appelée pour chaque site.

 void SimpleJob_TimerJobRun(object sender, TimerJobRunEventArgs e)
        {
            e.WebClientContext.Load(e.WebClientContext.Web, p => p.Title);
            e.WebClientContext.ExecuteQueryRetry();
            Console.WriteLine("Site {0} has title {1}", e.Url, e.WebClientContext.Web.Title);
        }

Le projet Core.TimerJobs.Samples.ContentTypeRetentionEnforcementJob illustre comment vous pouvez utiliser les travaux du minuteur SharePoint pour appliquer les stratégies de rétention sur des types de contenu. À l'aide de l'élément ContentTypeRetentionPolicyPeriod dans app.config, spécifiez :

  • clé, qui est l'ID de type de contenu du type de contenu auquel s'applique la période de rétention.

  • valeurqui correspond à la période de rétention en jours. La période de rétention s'appliqueront à tous les éléments de liste créées à l'aide du type de contenu spécifié dans la clé.

<ContentTypeRetentionPolicyPeriod>
    <!-- Key is the content type ID, and value is the retention period in days -->
    <!-- Specifies an audio content type should be kept for 183 days -->
    <add key="0x0101009148F5A04DDD49cbA7127AADA5FB792B006973ACD696DC4858A76371B2FB2F439A" value="183" />
    <!-- Specifies a document content type should be kept for 365 days -->   
    <add key="0x0101" value="365" />
  </ContentTypeRetentionPolicyPeriod>

ContentTypeRetentionEnforcementJob_TimerJobRun est défini en tant que gestionnaire d'événements pour l'événement TimerJobRun . Lorsque TimerJob.Run est appelé dans Program.cs, ContentTypeRetentionEnforcementJob_TimerJobRun effectue les étapes suivantes sur chaque site qui a été ajouté à l'aide de TimerJob.AddSite dans Program.cs :

  1. Obtient toutes les bibliothèques de documents sur le site.

  2. Pour chaque document library sur le site, lit les informations de configuration spécifiées en ContentTypeRetentionPolicyPeriod dans app.config. Pour chaque type de contenu ID et rétention period paire qui a été lu à partir de app.config, ApplyRetentionPolicy est appelée.

 void ContentTypeRetentionEnforcementJob_TimerJobRun(object sender, TimerJobRunEventArgs e)
        {
            try
            {
                Log.Info("ContentTypeRetentionEnforcementJob", "Scanning web {0}", e.Url);

                // Get all document libraries. Lists are excluded.
                var documentLibraries = GetAllDocumentLibrariesInWeb(e.WebClientContext, e.WebClientContext.Web);

                // Iterate through all document libraries.
                foreach (var documentLibrary in documentLibraries)
                {
                    Log.Info("ContentTypeRetentionEnforcementJob", "Scanning library {0}", documentLibrary.Title);

                    // Iterate through configured content type retention policies specified in app.config.
                    foreach (var contentTypeName in configContentTypeRetentionPolicyPeriods.Keys)
                    {
                        var retentionPeriods = configContentTypeRetentionPolicyPeriods.GetValues(contentTypeName as string);
                        if (retentionPeriods != null)
                        {
                            var retentionPeriod = int.Parse(retentionPeriods[0]);
                            ApplyRetentionPolicy(e.WebClientContext, documentLibrary, contentTypeName, retentionPeriod);
                        }
                    }
                }
            }
            catch(Exception ex)
            {
                Log.Error("ContentTypeRetentionEnforcementJob", "Exception processing site {0}. Exception is {1}", e.Url, ex.Message);
            }
        }

ApplyRetentionPolicy met en œuvre vos actions de stratégie de rétention personnalisée par :

  1. Le calcul validationDate. La méthode ApplyRetentionPolicy met en œuvre les actions de stratégie de rétention sur les documents modifiés avant validationDate. Puis validationDate est au format de date CAML et est affectée à camlDate.

  2. Exécution d'une requête CAML pour filtrer les documents dans la bibliothèque de documents en fonction de l'ID de type de contenu, qui a été spécifié dans app.config et où la date de Modification est inférieure à camlDate.

  3. Pour chaque élément de liste, l'application des actions de rétention personnalisée à effectuer sur les documents à l'aide de code personnalisé.

private void ApplyRetentionPolicy(ClientContext clientContext, List documentLibrary, object contentTypeId, int retentionPeriodDays)
        {
            // Calculate validation date. You need to enforce the retention policy on any document modified before validation date.
            var validationDate = DateTime.Now.AddDays(-retentionPeriodDays);
            var camlDate = validationDate.ToString("yyyy-MM-ddTHH:mm:ssZ");

            // Get old documents in the library that match the content type.
            if (documentLibrary.ItemCount > 0)
            {
                var camlQuery = new CamlQuery();
                
                camlQuery.ViewXml = String.Format(
                    @"<View>
                        <Query>
                            <Where><And>
                                <BeginsWith><FieldRef Name='ContentTypeId'/><Value Type='ContentTypeId'>{0}</Value></BeginsWith>
                                <Lt><FieldRef Name='Modified' /><Value Type='DateTime'>{1}</Value></Lt>
                            </And></Where>
                        </Query>
                    </View>", contentTypeId, camlDate);

                var listItems = documentLibrary.GetItems(camlQuery);
                clientContext.Load(listItems,
                    items => items.Include(
                        item => item.Id,
                        item => item.DisplayName,
                        item => item.ContentType));

                clientContext.ExecuteQueryRetry(); 

                foreach (var listItem in listItems)
                {
                    Log.Info("ContentTypeRetentionEnforcementJob", "Document '{0}' has been modified earlier than {1}. Retention policy will be applied.", listItem.DisplayName, validationDate);
                    Console.WriteLine("Document '{0}' has been modified earlier than {1}. Retention policy will be applied.", listItem.DisplayName, validationDate);
                    
                    // Apply your custom retention actions here. For example, archiving documents, or starting a disposition workflow.
                }
            }
        }

Le projet Core.TimerJobs.Samples.GovernanceJob utilise des travaux du minuteur pour garantir deux administrateurs sont affectées à vos collections de sites et dans le cas contraire, affiche un message de notification sur le site.

SiteGovernanceJob_TimerJobRun est défini en tant que gestionnaire d'événements pour l'événement TimerJobRun . Lorsque TimerJob.Run est appelé dans Program.cs, SiteGovernanceJob_TimerJobRun effectue les étapes suivantes sur chaque collection de sites qui a été ajoutée à l'aide de TimerJob.AddSite dans Program.cs :

  1. Obtient le nombre d'administrateurs assignés à la collection de sites à l'aide de la méthode d'extension GetAdministrators qui fait partie de OfficeDevPnP.Core.

  2. Télécharge le fichier JavaScript dans la liste de SiteAssets ou de la bibliothèque de styles à l'aide de UploadFile, qui fait partie de OfficeDevPnP.Core.

  3. Si le site comporte moins de deux administrateurs, AddJSLink ajoute un message de notification à un site à l'aide de JavaScript. Vous en apprendrez plus à Personnaliser votre site SharePoint l'interface utilisateur à l'aide de JavaScript.

  4. Si le site comporte deux ou plusieurs administrateurs, le message de notification est supprimé à l'aide de DeleteJsLink.

void SiteGovernanceJob_TimerJobRun(object o, TimerJobRunEventArgs e)
        {
            try
            {
                string library = "";

                // Get the number of administrators.
                var admins = e.WebClientContext.Web.GetAdministrators();

                Log.Info("SiteGovernanceJob", "ThreadID = {2} | Site {0} has {1} administrators.", e.Url, admins.Count, Thread.CurrentThread.ManagedThreadId);

                // Get a reference to the list.
                library = "SiteAssets";
                List list = e.WebClientContext.Web.GetListByUrl(library);

                if (!e.GetProperty("ScriptFileVersion").Equals("1.0", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (list == null)
                    {
                        // Get a reference to the list.
                        library = "Style%20Library";
                        list = e.WebClientContext.Web.GetListByUrl(library);
                    }

                    if (list != null)
                    {
                        // Upload js file to list.
                        list.RootFolder.UploadFile("sitegovernance.js", "sitegovernance.js", true);

                        e.SetProperty("ScriptFileVersion", "1.0");
                    }
                }

                if (admins.Count < 2)
                {
                    // Show notification message because you need at least two site collection administrators.
                    e.WebClientContext.Site.AddJsLink(SiteGovernanceJobKey, BuildJavaScriptUrl(e.Url, library));
                    Console.WriteLine("Site {0} marked as incompliant!", e.Url);
                    e.SetProperty("SiteCompliant", "false");
                }
                else
                {
                    // Remove the notification message because two administrators are assigned.
                    e.WebClientContext.Site.DeleteJsLink(SiteGovernanceJobKey);
                    Console.WriteLine("Site {0} is compliant", e.Url);
                    e.SetProperty("SiteCompliant", "true");
                }

                e.CurrentRunSuccessful = true;
                e.DeleteProperty("LastError");
            }
            catch(Exception ex)
            {
                Log.Error("SiteGovernanceJob", "Error while processing site {0}. Error = {1}", e.Url, ex.Message);
                e.CurrentRunSuccessful = false;
                e.SetProperty("LastError", ex.Message);
            }
        }
Afficher: