Obtendo as strings de conexão do Project Server (2007 e 2010)

Vou fazer uma pausa na minha série “Preparando uma VM com o Project Server 2010”, para mostrar como é possível ler diretamente da farm as strings de conexão das bases do Project Server 2007 ou 2010.

Estou fazendo o upgrade de uma ferramenta de relatórios para o Project Server 2010 que utilizava um método parecido com o que está abaixo, para obter a conexões da base de Reporting. Como eram utilizadas classes não documentados, infelizmente não funcionava na nova versão.

Resolvi investir um pouco mais de tempo e (tentar) fazer uma versão que funcionasse (pelo menos por enquanto) nas duas versões. O resultado está baixo.

O código foi baseado no seguinte post: https://www.projectserverhelp.com/Lists/Posts/Post.aspx?ID=97

ATENÇÃO: O código abaixo usa classes NÃO DOCUMENTADAS, portando não há garantia de que continuará funcionando após alguma atualização. Use por sua conta e risco.

Para utilizá-la, basta incluir a classe abaixo no seu projeto. Não é necessário adicionar nenhuma referência, pois o carregamento dos assemblies do SharePoint e ProjectServer é dinâmico e independente da versão. A única restrição é que ela só funciona se executada dentro do servidor onde está instalado o Project Server.

 

 

 using System;using System.Collections.Generic;using System.Reflection;namespace PServerUtil{    public class PServerConn    {        public static Dictionary<string, string> LeProjectServerCStrings(string PWAURL)        {            try            {                Type PlatformContextType = CarregaPlataformaContextType_2010ou2007();                Type SPSiteType = CarregaSPSiteType_2010ou2007();                object PWASite = SPSiteType.InvokeMember(null, BindingFlags.CreateInstance, null, SPSiteType, new object[] { PWAURL });                Guid PWAId = new Guid(LePropriedade(PWASite, "ID").ToString());                object ProjectSite = PlatformContextType.InvokeMember("GetProjectSite", BindingFlags.InvokeMethod, null, PlatformContextType, new object[] { PWAId });                Dictionary<string, string> Retorno = new Dictionary<string, string>();                Retorno.Add("Published", LePropriedade(LePropriedade(ProjectSite, "PublishedDatabase"), "DatabaseConnectionString").ToString());                Retorno.Add("Reporting", LePropriedade(LePropriedade(ProjectSite, "ReportingDatabase"), "DatabaseConnectionString").ToString());                Retorno.Add("Archive",   LePropriedade(LePropriedade(ProjectSite, "VersionsDatabase" ), "DatabaseConnectionString").ToString());                Retorno.Add("Draft",     LePropriedade(LePropriedade(ProjectSite, "WorkingDatabase"  ), "DatabaseConnectionString").ToString());                               return Retorno;            }            catch            {                return null;            }        }        private static object LePropriedade(object obj, string prop)        {            return obj.GetType().GetProperty(prop).GetValue(obj, null);        }        private static Type CarregaPlataformaContextType_2010ou2007()        {            Type Retorno = Type.GetType("Microsoft.Office.Project.Server.Base.PlatformContext, Microsoft.Office.Project.Server, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c");            if (Retorno == null)                Retorno = Type.GetType("Microsoft.Office.Project.Server.Base.PlatformContext, Microsoft.Office.Project.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c");             return Retorno;        }        private static Type CarregaSPSiteType_2010ou2007()        {            Type Retorno = Type.GetType("Microsoft.SharePoint.SPSite, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c");            if (Retorno == null)                Retorno = Type.GetType("Microsoft.SharePoint.SPSite, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c");            return Retorno;        }    }}

 

Até a próxima!