Pregunta

Estoy en un equipo que desarrolla un "portal" para la Fundación SharePoint 2010. Soy responsable de hacer que el instalador cree una nueva instancia de SharePoint. Maneja más que la instalación de los archivos de solución y la configuración de SharePoint. El instalador maneja los archivos que implementan archivos en el GAC y creando nuestro cliente de seguridad federado (utilizado para nuestra autenticación basada en reclamaciones de SharePoint).

Durante la instalación de una instancia, complete algunas tareas que están específicamente relacionadas con SharePoint y use la API de SharePoint en .NET 3.5:

  1. crear / configurar confianza
  2. Crear una aplicación web.
  3. implementar soluciones a la aplicación de la granja y la web
  4. Crear colección predeterminada del sitio
  5. Active las funciones predeterminadas en la colección del sitio
  6. Actualizar la aplicación web "Propiedades"

    Para saber, he podido tener un trabajo de instalación correctamente en un solo servidor de SharePoint, es decir, un servidor alberga la base de datos de la granja y otra es la pila completa de servicios de SharePoint. He comenzado a probar con una configuración que imitará la configuración del mundo real de SharePoint en nuestro entorno de alojamiento. Allí tenemos un servidor de base de datos y al menos tres servidores de SharePoint, solo uno de los cuales tiene administración central.

    El problema en el que he encontrado es que, en este caso, puedo y sin ningún error hacer todos los pasos anteriores, excepto la activación de las características. He eliminado el código que hace este paso y verifiqué que la aplicación web, la recopilación del sitio, la confianza, etc. (excepto las propiedades ") se han creado correctamente al iniciar correctamente el sitio, autenticando y viendo el tema predeterminado" Equipo " . Sin embargo, una vez que active las funciones predeterminadas, ya sea a través de API o a través de la configuración de la recopilación del sitio, ya no puedo acceder al sitio y recibir un error.

    Esto viene al quid de mi problema y el problema que enfrento al explicarlo aquí. Nuestra solución es altamente compleja, ya que implica una configuración de lote a partir de aspectos de seguridad y confianza en otros servicios fuera de SharePoint. No sé si algunos de nuestros ajustes no se propagan a través de los servidores que hacen un error interno en nuestra solución para causar la página de error. Tampoco lo sé si cuando estoy configurando las "Propiedades" si se están pegando en la situación de la granja. Tuve un problema en el que no estaba estableciendo este derecho cuando comencé a partir de esta tarea y causé un problema similar a lo que estoy viendo ahora.

    También estoy inseguro si las soluciones se están implementando correctamente, por lo tanto, corrompiendo las funciones. He configurado ULS Viewer en cada uno de los servidores de SharePoint, pero no puedo encontrar nada relacionado con la identificación de correlación para el error que recibo en la página de error. De hecho, no obtengo ningún evento en el Visor ULS en el servidor "Master" SharePoint. Puedo ver la implementación y retracción de soluciones en el espectador en los otros dos servidores.

    Debo faltar algo que sucede en una granja con múltiples servidores. Espero que alguien pueda echar un vistazo al bit de código que utilizo para implementar soluciones y establecer propiedades para ayudarme. También me gustaría realmente averiguar por qué no puedo ver el error que estoy recibiendo en ninguno de los espectadores ULS. ¿Alguien puede explicar esto por mí?

    También estoy buscando ejemplos más definitivos de cómo configurar y configurar SharePoint a través de la API C #. Hasta este punto, he estado descompilando el código para los comandos y replicando lo que puedo en el código. Todavía no tengo una forma de "correcta" para activar una característica a través de C # y simplemente estoy creando un proceso que ejecuta stsadm.exe para activar las características.

    Aquí está mi código para agregar y implementar una solución:

          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();
          }
    

    Aquí está mi código para activar las características. Simplemente usa un proceso para usar 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()));
            }
          }
        }
      }
    }
    

    Así es como actualizo una propiedad. Hago esto por último porque lo estaba haciendo después de implementar las soluciones, pero parece que las funciones activadoras estaban restableciendo los valores.

    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);
      }
    }
    

¿Fue útil?

Solución

Para responder a su pregunta general, la forma recomendada de implementar la solución en SharePoint 2010 es usar PowerShell.

de ¿Qué hay de nuevo: Windows PowerShell para SharePoint :

Windows PowerShell reemplaza la herramienta de administración STSADM.EXE. Avanzando, debe usar la tecnología de scripts de Windows PowerShell para desarrollar cualquier nuevo scripts de línea de comandos en SharePoint Foundation 2010.

Aquí hay algunas muestras y scripts para desplegar con PowerShell:

Otros consejos

Para ser totalmente honesto, nunca veo el punto más de hacer nada en el código que pueda hacer con Stsadm directamente.

Así que siempre solo usé el equivalente a lo que necesito:

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

entonces ...

Activar características
Opciones de solución de configuración
Aplicar plantilla maestra
Crear sub sitios
Crear listas
Añadir partes web
Permisos establecidos
Ocultar / Mostrar navegación y columnas
Añada cualquier dato a la implementación requerida
Acabado

He tenido muchos problemas que intentan implementar una solución utilizando el método que usa (simplemente busco publicado aquí y no encontré soluciones)

Licenciado bajo: CC-BY-SA con atribución
scroll top