Question

Je suis sur une équipe développant un "portail" pour SharePoint Foundation 2010. Je suis responsable de la création du programme d'installation qui établit une nouvelle instance de SharePoint. Il gère plus que l'installation des fichiers de solution et la configuration de SharePoint. Le programme d'installation gère le déploiement de fichiers sur le GAC et la création de notre client de sécurité fédérése (utilisé pour notre authentification basée sur les revendications SharePoint).

Lors de l'installation d'une instance, je complète quelques tâches spécifiquement liées à SharePoint et utilisez l'API SharePoint dans .NET 3.5:

  1. Créer / Configurer la confiance
  2. Créer une application Web.
  3. Déployer des solutions à la ferme et à l'application Web
  4. Créer une collection de sites par défaut
  5. Activez les fonctionnalités par défaut sur la collection Site
  6. Mettez à jour l'application Web "Propriétés"

    Jusqu'à savoir avoir pu avoir un travail d'installation correctement sur un seul serveur SharePoint, c'est-à-dire qu'un serveur héberge la base de données de la ferme et une autre est la pile complète de services SharePoint. J'ai commencé à tester avec une configuration qui imitera la configuration du monde réel de SharePoint dans notre environnement d'hébergement. Là, nous avons un serveur de base de données et au moins trois serveurs SharePoint, une seule administration centrale.

    Le problème que j'ai rencontré est que dans ce cas, je peux correctement et sans erreur, toutes les étapes ci-dessus, à l'exception de l'activation des fonctionnalités. J'ai supprimé le code qui fait cette étape et a vérifié que l'application Web, la collecte de site, la confiance, etc. (à l'exception des "propriétés") a été créée correctement en lançant le site, authentifiant et voir le thème "Team" par défaut . Cependant, une fois que j'échappe les fonctionnalités par défaut, via API ou via les paramètres de collecte de site, je ne peux plus accéder au site et recevoir une erreur.

    Cela vient au cœur de mon problème et le problème que je suis confronté lors de l'explication ici. Notre solution est très complexe en ce sens qu'elle implique une configuration de beaucoup d'aspects de la sécurité et de la dépendance à d'autres services en dehors de SharePoint. Je ne sais pas si certains de nos paramètres ne se propagent pas sur les serveurs provoquant une erreur interne dans notre solution pour provoquer la page d'erreur. Je ne sais pas non plus si lorsque je fixe les "propriétés" s'ils collent dans la situation de la ferme. J'avais un problème où je ne pouvais pas cesser ces points quand j'ai commencé à faire cette tâche et j'ai causé un problème similaire à ce que je vois maintenant.

    Je ne suis pas non sûr si les solutions sont correctement déployées, corrompre donc les fonctionnalités. J'ai mis en place ULS Viewer sur chacun des serveurs SharePoint, mais je ne trouve rien de ne rien trouver relatif à l'ID de corrélation de l'erreur que je reçois sur la page d'erreur. Je ne reçois aucun événement dans la visionneuse ULS sur "Master" SharePoint Server. Je peux voir le déploiement et la rétractation de solutions dans le spectateur sur les deux autres serveurs.

    Je dois manquer quelque chose qui se passe dans une ferme avec plusieurs serveurs. J'espère que quelqu'un peut jeter un coup d'œil au bit du code que j'utilise pour déployer des solutions et définir des propriétés pour m'aider. J'aimerais également vraiment comprendre pourquoi je ne peux pas voir l'erreur que j'entre dans l'un des téléspectateurs ULS. Quelqu'un peut-il expliquer cela pour moi?

    aussi Je cherche des exemples plus définitifs de la configuration et de la configuration SharePoint via l'API C #. Jusqu'à ce point, j'ai décompilé le code des commandes et reproduit ce que je peux en code. Je n'ai toujours pas de moyen "correct" d'activer une fonctionnalité via c # et je crée simplement un processus exécutant Stsadm.exe pour activer les fonctionnalités.

    Voici mon code d'ajout et de déploiement d'une solution:

          SPSolution newSolution = SPFarm.Local.Solutions.Add(Path.Combine(this.SharePointPointRootFolder, solutionDefinition.filename));
    
          if (!solutionDefinition.webApplicationSpecific)
          {
            Console.WriteLine("Adding a farm specific solution.");
    
            newSolution.Deploy(DateTime.Now, true, true);
    
            this.WaitForSolutionJobsToComplete(newSolution.Id);
    
            newSolution.Synchronize();
          }
          else //specific to a web application.  Load the new solution.
          {
            Console.WriteLine("Adding web application specific solution.");
    
            Collection<SPWebApplication> webAppCol = new Collection<SPWebApplication>();
            webAppCol.Add(this.WebApplication);
    
            newSolution.Deploy(DateTime.Now, true, webAppCol, true);
    
            this.WaitForSolutionJobsToComplete(newSolution.Id);
    
            newSolution = SPFarm.Local.GetObject(newSolution.Id) as SPSolution;
    
            newSolution.Synchronize();
    
            this.WaitForSolutionJobsToComplete(newSolution.Id);
    
            newSolution.Update();
          }
    

    Voici mon code pour activer des fonctionnalités. Il utilise simplement un processus pour utiliser Stsadm.exe:

    void UpdateFeatures(SPSite site)
    {
      Console.WriteLine("Updating features.");
    
      SPSolutionDefinitionCollection collection = SolutionConfigurer.LoadSolutionDefinitions();
    
      foreach (SPSolutionDefinition solutionDefinition in collection.spSolutionDefinition)
      {
    
        Guid id = new Guid(solutionDefinition.ID);
    
        if (solutionDefinition.spFeatureDefinition != null && solutionDefinition.spFeatureDefinition.Length > 0)
        {
          foreach (Models.SPFeatureDefinition fDef in solutionDefinition.spFeatureDefinition)
          {
            Guid fDefId = new Guid(fDef.ID);
    
            //this.Activate(fDefId, site);
    
            Process stsadmP = WebApplicationConfigurer.GetSTSADMProcess(this.STSADMPath, "-o activatefeature -id " + fDef.ID + " -url " + this.SiteCollectionUrl + " -force");
    
            Console.WriteLine(string.Format("Invoking STSADM.EXE for feature deployment: {0} with arguments:{1}", stsadmP.StartInfo.FileName, stsadmP.StartInfo.Arguments));
    
            stsadmP.Start();
            stsadmP.WaitForExit();
    
            if (stsadmP.ExitCode == 0)
            {
              Console.WriteLine(string.Format("STSADM.EXE successfully ran for feature id {0} and produced this output: {1}", fDefId, stsadmP.StandardOutput.ReadToEnd()));
            }
            else
            {
              Console.WriteLine(string.Format("STSADM.EXE did not produce a successful exit code for feature id {0} and produced this output: {1} + {2}", fDefId, 
                stsadmP.StandardOutput.ReadToEnd(), stsadmP.StandardError.ReadToEnd()));
            }
          }
        }
      }
    }
    

    Voici comment je mette à jour une propriété. Je le fais enfin parce que je le faisais après le déploiement des solutions, mais il semble que les fonctionnalités d'activation réinitialisent les valeurs.

    public void UpdatePropertiesWebApplication()
    {
      string dnsName = this.SigningCertificate.GetNameInfo(X509NameType.DnsName, false);
    
      SPWebApplication webApplication = SPFarm.Local.GetObject(this.WebApplicationId) as SPWebApplication;
    
      if (webApplication != null)
      {
        Console.WriteLine("Updating property information for the web application.");
    
        if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.ESB_ROOT))
        {
          webApplication.Properties.Add(Constants.PropertyBagKeys.ESB_ROOT, this.ESBUrl);
        }
        else
        {
          Console.WriteLine("Updating ESB Root URL. " + this.ESBUrl);
          webApplication.Properties[Constants.PropertyBagKeys.ESB_ROOT] = this.ESBUrl;
        }
    
        Console.WriteLine("ESB Root Url: " + webApplication.Properties[Constants.PropertyBagKeys.ESB_ROOT]);
    
        if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.REALM))
        {
          webApplication.Properties.Add(Constants.PropertyBagKeys.REALM, this.SharePointTrustPoint);
        }
        else
        {
          Console.WriteLine("Updating realm. " + this.SharePointTrustPoint);
          webApplication.Properties[Constants.PropertyBagKeys.REALM] = this.SharePointTrustPoint;
        }
    
        Console.WriteLine("Realm: " + webApplication.Properties[Constants.PropertyBagKeys.REALM]);
    
        if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.SSO_ROOT))
        {
          webApplication.Properties.Add(Constants.PropertyBagKeys.SSO_ROOT, this.SSOUrl);
        }
        else
        {
          Console.WriteLine("Updating the broker url. " + this.SSOUrl);
          webApplication.Properties[Constants.PropertyBagKeys.SSO_ROOT] = this.SSOUrl;
        }
    
        Console.WriteLine("Broker Url: " + webApplication.Properties[Constants.PropertyBagKeys.SSO_ROOT]);
    
        if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT))
        {
          webApplication.Properties.Add(Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT, dnsName);
        }
        else
        {
          Console.WriteLine("Updating trusted cert dns identity. " + dnsName);
          webApplication.Properties[Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT] = dnsName;
        }
    
        Console.WriteLine("Trusted Certificate Identity: " + webApplication.Properties[Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT]);
    
        webApplication.Update(true);
      }
    }
    

Était-ce utile?

La solution

Pour répondre à votre question générale, la manière recommandée de déployer une solution dans SharePoint 2010 est d'utiliser PowerShell.

de Quoi de neuf: Windows PowerShell pour SharePoint :

Windows PowerShell remplace l'outil d'administration Stsadm.exe. Avancer de l'avant, vous devez utiliser la technologie de script Windows PowerShell pour développer de nouveaux scripts de ligne de commande à SharePoint Foundation 2010.

Voici quelques échantillons et scripts pour le déploiement avec PowerShell:

Autres conseils

Pour être totalement honnête, je ne vois plus jamais le point de faire quoi que ce soit dans le code que je puisse faire avec Stsadm directement.

Alors je n'utilise toujours que l'équivalent à ce dont j'ai besoin:

stsadm -o deletesolution -name solution.wsp -override
stsadm -o addsolution -filename c:\path\solution.wsp
stsadm -o deploysolution -name solution.wsp -allowgacdeployment -local -force

Alors ...

Activer les fonctionnalités de
Options de la solution de configuration
Appliquer Master Modèle
Créer des sous-sites
Créer des listes
Ajouter des pièces Web
Définir les autorisations
Masquer / Afficher la navigation et les colonnes
Ajoutez des données au déploiement de

Terminer

J'ai eu à de nombreux problèmes d'essayer de déployer une solution à l'aide de la méthode que vous utilisez (juste la recherche que j'ai publiée ici et n'a trouvé aucune solution)

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top