| | | | Essa indicação veio diretamente de um de meus alunos o Alexandre Bueno, links com diagramas e boas práticas para o planejamento e implementação do SharePoint 2010
Diagramas técnicos (SharePoint Server 2010)
Planejamento e arquitetura para o SharePoint Foundation 2010
http://technet.microsoft.com/pt-br/library/cc288426.aspx
Vale a pena conferir, mesmo se você ja tiver experiência no assunto
Valeu Alexandre |  |  |
240
|  |
| | | | Este é um assunto até bem antigo, mas esta semana estava visitando uma empresa onde já trabalhei e por acaso vi um desenvolvedor tentando explicar para outro desenvolvedor um WSP que eu tinha montado a muito tempo atrás.
Ele até estava indo bem até chegar a uma feature que usava uma property para definir o ContentType padrão de uma lista, aí ele se enrolou e explicou para o pobre desenvolvedor que aquele xml servia para associar o contentype à lista. Neste ponto tive de intervir e explicar o que realmente acontecia e como percebi que isso não é um recurso muito usado decidi fazer um post sobre isso.
Vamos lá, primeiro vamos dar uma olhada em um arquivo Feature.xml
<?xml
version="1.0"
encoding="utf-8"?>
<Feature
Id="fedbb99f-827c-45b6-bc9e-64752bd4750f"
Title="Decisões: 04-Content Type Binding"
Description="Associa ContentTypes as listas de destino"
Version="12.0.0.0"
Hidden="FALSE"
Scope="Site"
DefaultResourceFile="core"
ReceiverAssembly="Jujuba.Decisoes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0385420579cd9c88"
ReceiverClass="Jujuba.Decisoes.ContentTypesBinding"
AlwaysForceInstall ="TRUE"
xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementManifest
Location="elements.xml"/>
</ElementManifests>
<Properties >
<!--format for lists property: [listname],[DefaultContentType];[listname],[DefaultContentType]-->
<Property
Key ="Lists"
Value ="Gerências,Gerência;
Divisões,Divisão;
Diretorias,Diretoria;
Pauta,Pauta;
Participantes,Participante;
Reuniões,Reunião;
Controles Internos,Controle Interno;
Controle de Decisões,Assunto;
Documentos Decisões,Documento Decisão"/>
<!--format for Fields property: [FieldGuid],[SearchFieldGuid]|[SearchFieldGuid];[FieldGuid],[SearchFieldGuid]|[SearchFieldGuid]-->
<Property
Key ="SearchFields"
Value ="{8228535D-ABAB-4296-894F-8DE064493D02},fa564e0f-0c70-4ab9-b863-0177e6ddd247;
{2CE52FDD-D5F5-4d86-A935-A7E6C2E4D840},fa564e0f-0c70-4ab9-b863-0177e6ddd247;
{376966B2-CFB7-4eb4-8F4A-02356AE464CA},fa564e0f-0c70-4ab9-b863-0177e6ddd247|24EDC1D3-E42F-49c8-B89C-70E96C5FF57A|433FF1AA-93C4-4b29-B5A4-5AC4B952CC23|FB9AB2E6-BB3C-4f18-8837-37FD0CA6633A;
{F3AD6FDA-0BA1-4a16-B1A3-38BE5631DC9F},fa564e0f-0c70-4ab9-b863-0177e6ddd247;
{142EA72C-E98C-4e8e-92C6-12EF3BF537E5},fa564e0f-0c70-4ab9-b863-0177e6ddd247;
{3EA66448-46D4-422c-81F1-006CFFBE19BE},fa564e0f-0c70-4ab9-b863-0177e6ddd247;
{72A7FB3E-677B-4bc8-A817-7327E5607A71},fa564e0f-0c70-4ab9-b863-0177e6ddd247|24EDC1D3-E42F-49c8-B89C-70E96C5FF57A;
{CE3A570B-A3B3-4729-B8E4-EF3335ADE940},fa564e0f-0c70-4ab9-b863-0177e6ddd247|24EDC1D3-E42F-49c8-B89C-70E96C5FF57A"/>
</Properties>
</Feature>
Normal praticamente igual a qualquer outro Feature.xml que você já viu antes com excessão da TAG <Properties> e suas SubTags <Property> logo abaixo do elementmanifest.
Esta Tag Property serve para que você armazene as propriedades (DÂ) da feature, mas pra eu ia querer isso? Para passar parâmetros para o Feature Receiver que é um assembly compilado dando grande flexibilidade ao Receiver.
Neste meu exemplo eu tenho duas properties uma chamada Lists e outra chamada SearchFields, cada uma com seu Value específico, no meu caso a property Lists armazena 2 valores o Nome de uma lista e o Nome do ContentType padrão para aquela lista, representados pelo par separado por virgulas ex.: Gerências,Gerência.
Legal, como eu uso essa trolha?
No meu Feature Receiver eu tenho o seguinte :
public
override
void FeatureActivated(SPFeatureReceiverProperties properties)
{
Utility oUtil = new
Utility();
SPWeb web = properties.Feature.Parent as SPWeb;
if (web == null)
{
SPSite site = properties.Feature.Parent as SPSite;
if (site != null)
{
web = site.RootWeb;
}
}
try
{
string[] arrLists = properties.Feature.Properties["Lists"].Value.Split(';');
foreach (string List in arrLists)
{
string strList = List.Replace("\r\n", "");
strList = strList.TrimStart(' ');
oUtil.SetDefaultContentType(web.Lists[strList.Split(',')[0]], strList.Split(',')[1]);
}
}
catch (Exception ex)
{
throw ex;
}
oUtil.FixPickers(properties);
}
Todos os eventos de Feature recebem como parâmetro um objeto do Tipo SPFeatureReceiverProperies o nosso caso properties, que são as propriedades associadas ao evento da feature, este objeto por sua vez contém uma propriedade Feature com as definições da Feature e o que é mais importante para nosso caso um array chamado Properties com todas as propriedades lá do Feature.xml, conforme linha abaixo
string[] arrLists = properties.Feature.Properties["Lists"].Value.Split(';');
De posse do array é muito fácil ler seus valores e fazer o que te der na telha no meu caos eu passo para um método que remove o contenttype Item da lista e adiciona o Contentype definido como padrão para a lista.
As possibilidades de usp destas propriedades dependem só da sua imaginação, podendo inclusive alterar valores de configuração depois de feito o deploy, basta ira la na HIVE editar o xml e desativar e reativar a feature.
|  |  |
240
|  |
| | | | Olá pessoal, finalmente consegui arrumar tempo para dar uma cara nova ao blog, apesar de gostar muito do template padrão do SP2010, quria alguma coisa diferente e que fosse mais clean.
Os posts também irão voltar com certo nivel de regularidade, pelo menos uma vez por semana.
Valeu e até mais |  |  |
240
|  |
| | | | Esta semana tive de resolver um problema bem interessante em um projeto que estamos desenvolvendo, era necesário que o SharePoint a partir de informações de um sistema legado cria-se uma série de subsites, por uma série de motivos que não vale a pena comentar aqui, não foi criado um site definition o que seria o mais recomendável e como o site de modelo usava os recusros de publicação não era possivel gerar um template. Neste momento surge um engraçadinho e diz que é possível se gerar o modelo acessando diretamente a página em _layouts/savetmpl.aspx, isso é parcialmente verdade primeiro porque é uma ação não suportada e segundo porque o modelo gerado nem sempre funciona. E agora o que fazer? Supreendentemente a abordagem foi bem simples apelamos para o stsadm e exportamos o site gerando um arquivo *.cmp, o comando é bem simples vejamos C:\Windows\system32>stsadm -o export Missing required argument: url. Missing required argument: filename. stsadm.exe -o export -url <URL to be exported> -filename <export file name> [-overwrite] [-includeusersecurity] [-haltonwarning] [-haltonfatalerror] [-nologfile] [-versions <1-4> 1 - Last major version for files and list items (default) 2 - The current version, either the last major or the last minor 3 - Last major and last minor version for files and list items 4 - All versions for files and list items] [-cabsize <integer from 1-1024 megabytes> (default: 24)] [-nofilecompression] [-quiet] [-usesqlsnapshot] Os dois parametros principais são a url do site e o nome do arquivo, os demais indicam como deve ser tratado o versionamento, segurança e compressão, nada muito complicado, similarmente o processo de importação é parecido C:\Windows\system32>stsadm -o import Missing required argument: url. Missing required argument: filename. stsadm.exe -o import -url <URL to import to> -filename <import file name> [-includeusersecurity] [-haltonwarning] [-haltonfatalerror] [-activatesolutions] [-nologfile] [-updateversions <1-3> 1 - Add new versions to the current file (default) 2 - Overwrite the file and all its versions (delete then insert) 3 - Ignore the file if it exists on the destination] [-includeusercustomaction <1-2> 1 - Ignore user custom actions 2 - Include user custom actions (default)] [-nofilecompression] [-quiet] Legal, via stsadm é possível exportar e importar um site ou conteúdo de um SharePoint para outro, mas como isso me ajuda? Bem, o processo de importação não obriga que a url de destina seja a mesma de origem permitindo que eu’faça um reparenting do site, assim au posso ter um Site A que é exportado e posteriormente importado como Site B e até mesmo em uma estrutura diferente da original. Fantástico neste ponto estamos a meio caminho andado de resolver o problema, resta agora uma forma de executar esses comandos via object model, apesar de não ser tão simples quanto o stsadm, também não é nada muito complicado, vejamos: Private m_webName = String.Empty Privatem_webParentUrl = String.Empty Public Overloads Overrides SubFeatureActivated(ByVal properties AsSPFeatureReceiverProperties) DimstrSiteUrl As String= String.Empty strSiteUrl = "http://vm-dev/novosite" Dimsettings As NewSPImportSettings() Withsettings .SiteUrl = strSiteUrl .FileLocation = SPUtility.GetGenericSetupPath("TEMPLATE\FEATURES\SiteCreator\model") .FileCompression = True .UpdateVersions = SPUpdateVersions.Overwrite .IncludeSecurity = SPIncludeSecurity.All .UserInfoDateTime = SPImportUserInfoDateTimeOption.ImportAll .BaseFileName = "modelo.cmp" End With Usingsite AsSPSite = NewSPSite(settings.SiteUrl) Me.m_webParentUrl = site.ServerRelativeUrl Me.m_webName = ConvertToServiceRelUrl(Me.GetServerRelUrlFromFullUrl(settings.SiteUrl), site.ServerRelativeUrl) End Using Dimimport As NewSPImport(settings) Dimhandler AsEventHandler(OfSPDeploymentEventArgs) = NewEventHandler(OfSPDeploymentEventArgs)(AddressOf Me.OnStarted) AddHandler import.Started, handler import.Run() Usingsite AsSPSite = NewSPSite(settings.SiteUrl) UsingoWeb AsSPWeb = site.OpenWeb(Me.GetServerRelUrlFromFullUrl(settings.SiteUrl)) oWeb.MasterUrl = "/_catalogs/masterpage/default_modelo.master" oWeb.CustomMasterUrl = "/_catalogs/masterpage/default_modelo.master" oWeb.Title = "Novo Site" oWeb.Update() DimpubWeb AsPublishingWeb = PublishingWeb.GetPublishingWeb(oWeb) DimWelcomePage As String= SPHttpUtility.UrlPathDecode("paginas/default.aspx", True) DimPageFile AsSPFile = pubWeb.Web.GetFile(WelcomePage) pubWeb.DefaultPage = PageFile pubWeb.Update() End Using End Using End Sub Private Sub OnStarted(ByVal sender As Object, ByVal args As SPDeploymentEventArgs)
Dim rootObjects As SPImportObjectCollection = args.RootObjects
If (rootObjects.Count <> 0) Then
If (rootObjects.Count = 1) Then
If (rootObjects.Item(0).Type = SPDeploymentObjectType.Web) Then
rootObjects.Item(0).TargetParentUrl = Me.m_webParentUrl
rootObjects.Item(0).TargetName = Me.m_webName
ElseIf Not Me.m_webParentUrl.EndsWith("/", StringComparison.OrdinalIgnoreCase) Then
rootObjects.Item(0).TargetParentUrl = (Me.m_webParentUrl & "/" & Me.m_webName)
Else
rootObjects.Item(0).TargetParentUrl = (Me.m_webParentUrl & Me.m_webName)
End If
Else
Dim flag As Boolean = False
Dim i As Integer
For i = 0 To rootObjects.Count - 1
rootObjects.Item(i).TargetParentUrl = Me.m_webParentUrl
If (rootObjects.Item(i).Type = SPDeploymentObjectType.Web) Then
If flag Then
Throw New SPException(SPResource.GetString("ImportOperationMultipleRoots", New
Object(0 - 1) {}))
End If
flag = True
rootObjects.Item(i).TargetName = Me.m_webName
Return
End If
Next i
End If
End If
End Sub
Neste exemplo eu usei o evento featureactivated para criar um site com base no cmp, o códigoé bastante auto explicativo mas vamos a
alguns detalhes
strSiteUrl = "http://vm-bovespadev/novosite"
Dim settings As New SPImportSettings()
With settings
.SiteUrl = strSiteUrl
.FileLocation = SPUtility.GetGenericSetupPath("TEMPLATE\FEATURES\SiteCreator\model")
.FileCompression = True
.UpdateVersions = SPUpdateVersions.Overwrite
.IncludeSecurity = SPIncludeSecurity.All
.UserInfoDateTime = SPImportUserInfoDateTimeOption.ImportAll
.BaseFileName = "modelo.cmp"
End With
Este trecho cria um objeto SPImportSettings que formece instruções ao importador de como tratar o arquivo de forma muito similar aos
parâmetros do stsadm e novamente os mais importantes são a url do site e o path do arquivo, assim na variável strSiteUrl definimos a url
de destino e através do método utilitário SPUttility.GetGenericSetupPath definimos o local onde se encontra o cmp, no caso na pasta da
feature la na hive 12, como neste caso é uma feature poderia ter usado a propriedade properties.Feature.Definition.RootDirectory, optei
pelo sputility porque a versão final seria executada em um timerjob onde não teria acesso a esta propriedade.
Dim import As New SPImport(settings)
Dim handler As EventHandler(Of SPDeploymentEventArgs) = New EventHandler(Of SPDeploymentEventArgs)(AddressOf
Me.OnStarted)
AddHandler import.Started, handler
import.Run()
Neste trecho temos o segredo para o reparenting, passamos o settings para o importador e registramos um evento handler no evento OnStarded do importador, este evento será disparado para cada item e nele poderemos definir quem é o item pai como vemos abaixo
Private Sub OnStarted(ByVal sender As Object, ByVal args As SPDeploymentEventArgs)
Dim rootObjects As SPImportObjectCollection = args.RootObjects
If (rootObjects.Count <> 0) Then
If (rootObjects.Count = 1) Then
If (rootObjects.Item(0).Type = SPDeploymentObjectType.Web) Then
rootObjects.Item(0).TargetParentUrl = Me.m_webParentUrl
rootObjects.Item(0).TargetName = Me.m_webName
ElseIf Not Me.m_webParentUrl.EndsWith("/", StringComparison.OrdinalIgnoreCase) Then
rootObjects.Item(0).TargetParentUrl = (Me.m_webParentUrl & "/" & Me.m_webName)
Else
rootObjects.Item(0).TargetParentUrl = (Me.m_webParentUrl & Me.m_webName)
End If
Else
Dim flag As Boolean = False
Dim i As Integer
For i = 0 To rootObjects.Count - 1
rootObjects.Item(i).TargetParentUrl = Me.m_webParentUrl
If (rootObjects.Item(i).Type = SPDeploymentObjectType.Web) Then
If flag Then
Throw New SPException(SPResource.GetString("ImportOperationMultipleRoots",
New Object(0 - 1) {}))
End If
flag = True
rootObjects.Item(i).TargetName = Me.m_webName
Return
End If
Next i
End If
End If
End Sub
A cada chamada o evento recebe uma coleção rootobjects indicando o que esta sendo importado, se o evento receber 1 item e este for do tipo
web ele é o novo site, sendo assim seu pai será o site pai de NovoSite indicado na url no caso http://vm-dev, por outro lado se a coleção tiver
mais de um item seu site pai será o próprio NovoSite.
O resto do código define uma nova master para o site, troca o título e define uma nova welcome page.
Voltando a nosso problema original, este código foi colocado em um timerjob que diariamente acessa um sistema legado e identifica os novos
resgistros e cria automaticamente um novo site para cada novo item.
Bem amigos foi um post longo, mas espero que possa ser útil para vocês
Até mais. |  |  |
240
|  |
| | | | Finalmente esta na rua, ontem foi liberado para os assinantes MSDN o download do Sharepoint Server 2010, é um marco importante pois a partir de agora as empresas passarão a considerar o SP2010 como um cenário possivel para novos projetos.
E é justamente neste momento de criação de soluções que é necessário pensar nos impactos de performance e capacidade da ferramenta, o SP2010 é uma ferramenta fantástica mas ela não é blindada contra um desgin ruim. Pensando nisso a Microsoft liberou uma série de documentos cobrindo diversos aspectos como Access Services, Large Lists etc, veja a lista abaixo
Title | Description | Estimate performance and capacity requirements for Access Services | Provides guidance on how using Access Services impacts topologies running SharePoint Server 2010. | Capacity Planning and Sizing for SharePoint Server 2010-based Divisional Portal | Provides guidance on performance and capacity planning for a SharePoint 2010 based divisional portal. | Designing Large Lists and Maximizing List Performance | Provides guidance on performance of large document libraries and lists. This document is specific to SharePoint Server 2010, although the throttles and limits that are discussed also apply to Microsoft SharePoint Foundation 2010. | SharePoint Server 2010 Capacity Management for InfoPath Solutions | Provides guidance on the footprint that usage of InfoPath Forms Services has on topologies running SharePoint Server 2010. | Estimate performance and capacity requirements for PerformancePoint Services | Provides guidance on the footprint that usage of PerformancePoint Services has on topologies running SharePoint Server 2010. | Estimate performance and capacity requirements for Search in SharePoint Server 2010 | Provides capacity planning information for different deployments of Search in SharePoint Server 2010, including small, medium, and large farms. | SharePoint Server 2010 Capacity Management for Web Content Management Deployments | Provides guidance on performance and capacity planning for a Web Content Management solution. | Word Automation Services 2010 Capacity Planning Guidance | Provides capacity planning guidance for Word Automation Services in SharePoint Server 2010. | Estimate Performance and Capacity Requirements for Workflow in SharePoint Server 2010 | Provides guidance on the footprint that usage of Workflow has on topologies running SharePoint Server 2010. |
São documentos extremamente importantes e de leitura obrigatória para quem esta planejando uma solução em SharePoint 2010.
Os documentos podem ser encontrados no link abaixo:
http://www.microsoft.com/downloads/details.aspx?FamilyID=fd1eac86-ad47-4865-9378-80040d08ac55&displaylang=en
Alé mais
PS.: Não esqueçi da série de posts, só fiz uma pequena inserção :)
|  |  |
240
|  |
| | | | O SharePoint é uma ferramenta fantástica, que surgiu como uma ferramenta de colaboração e gestão de conteúdo e evoluiu como uma verdadeiraplataforma de desenvolvimento.
Com milhares de soluções dos mais diversos segmentos sendo desenvolvidas tendo como base o Sharepoint, até a própria microsoft tem feito diversos produtos orbitar o sharepoint como o TFS, o CRM, o Office etc.
Isso demonstra quão poderosa a ferramenta é, mas em contrapartida ressalta os gaps da ferramenta, e vamos combinar que apesar de sob o ponto de vista do usuário o sharepoint ser bem simples de manipular, do ponto de vista de desenvolvimento isso não é bem verdade, não existe um conjunto de ferramentas coeso e boa parte das soluções beira ao artesanato, quem já teve de criar um content-type via feature sabe do que eu estou falando
É preciso definir com xml os sitecolumns ou pelo menos saber o guid de uma coluna existente, depois é preciso definir o xml do content-type, depois é preciso definir o xml para a feature, criar o ddf e usar makecab para criar um wsp que será instalado via stsadm diretamente no console da máquina com o sharepoint.
Como podemos ver isso passa bem longe do que um usuário comum pode fazer, mas com o SP2010 o cenário começa a mudar, o visual studio tem todo um novo conjunto de ferramentas para o desenvolvimento com o sharepoint onde boa parte da manipulação de XML é abstraída para elementos visuals e mesmo o Sharepoint Designer empacota as customizações como WSPs, facilitando o desenvolvimento e obviamente reduzindo o grau de conhecimento necessário para se criar um wsp.
Mas e quanto ao deploy? De que adianta se criar o wsp no sharepoint designer se o usuário vai depender o de outra área para fazer o deploy, ou mesmo que tenha acesso ao console da máquina, ser obrigado a conhecer o stsadm.
Pensando nisso, o time de produto criou uma funcionalidade bem bacana chamada Sandboxed Solutions, que permite ao usuário do site fazer o upload do um wsp diretamente na interface do sharepoint e fazer a ativação a partir dali, permitindo por exemplo que um designer faça customizações de layout em um ambiente de desenvolvimento, empacote e faça o deploy em produção.
Outro cenário, que tende a ser comum é o desenvolvimento de uma webpart, o desenvolvedor cria o wsp e envia para o susário final e ele mesmo faz o deploy, desonerando a area de ti, que não precisará alocar um recurso para fazer o deploy.
Neste ponto alguém vai levantar a mão e gritar "Você pirou? Deixar o usuário instalar um pedaço de código sem o aval da TI? O que impede que um bloco de código mal comportado, por exemplo um relatório que demora horas para processar ou mesmo um erro de código que gera um loop infinito derrube o servidor?"
Bem, eles pensaram nisso também e adicionaram o conceito de throttle, o administrador da farm define o limite de execução de sandboxed solutions baseado no número de execução, consumo de memória e processador e ao atingir este limite o recurso para de funcionar até que o próximo ciclo seja iniciado, assim fica bem difícil uma solução assim derrubar o servidor.
Neste ponto, mas alguém levanta a mão e diz "Mas o que impede que alguem crie uma webpart com um botãozinho que ao ser clicado exclua todos os sites dentro de um application?"
E novamente esse cenário também esta coberto, quando uma solução é instalada como sandboxed, o sharepoint limita a execução a um subconjunto do object model que permite apenas aquilo que é permitido naquela estrutura de site, assim um sandboxed solution não consegue excluir um arquivo em outro site collection por exemplo.
O SharePoint bloqueia por exemplo a execução de blocos de código com RunWithElevatedPrivileges evitando que alguém cause problemas no ambiente como um todo.
A soma de throttling e limitação de object model garante que seja seguro a todo administrador permitir que seus usuários possam fazer uso deste recurso sem se preocupar, mesmo contido dentro do site onde esta o sandbox o grau de funcionalidades permitidas abre um grande leque de coisas que os usuários avançados poderão fazer sem a intervenção de departamentos de TI.
|  |  |
240
|  |
| | | | Não, eu não esqueçi do blog, do último post até aqui fui arrastado para uma série de projetos que simplesmente acabaram com todo o meu tempo livre, mas enfim as coisas se acalmaram e tenho um monte de coisas que quero escrever para vocês, mas vou retomar de onde eu parei a minha lista das features mais legais no sharepoint 2010.
O eleito da vez é o Claims Authentication, nome pomposo, mas o que vem a ser isso ?
Rapidamente, é um modelo de autenticação onde o mecanismo responsável pela autenticação é transferido para outro sistema e/ou serviço que possui uma relação de confiança com o sistema/serviço que requer a autenticação, alem disso essa autenticação é feita na forma de um Claim (reinvindicação).
Mas isso não é o que o SharePoint faz com o AD?
Sim e não, sim porque é o AD quem autentica o usuário para o sharepoint, mas toda a autenticação efetivamente esta no sharepoint, ele apenas confia no AD para saber se o usuário é quem ele diz ser.
No Claims Authentication, to do o processo foi movido para um serviço externo baseado no WIF (Windows Identity Foundation) e esse serviço é responsavel por dizer dizer sim ou não para determinada claim sobre um usuário, por exemplo vamos supor que o conteúdo do site seja restritoa maiores de 18 anos, neste caso o sharepoint solicitaria uma claim para o serviço de autenticação "o usuário tem mais de 18 anos?" o serviço responderia sim ou não e o conteúdo seria ou não exibido baseado nesta resposta.
No exemplo acima o sharepoint não precisaria sequer saber quem é o usuário, apenas o serviço de autenticação e o sharepoint confia em sua resposta.
Com isso em mente fica claro que esse modelo traz inúmeras vantagens e a principal delas é poder utilizar qualquer mecanismo de autenticação: LDAP, Forms, LiveID, GoogleID, etc, uma vez que WIF é baseado em padroes abertos e extensíveis, neste momento qquem ja teve de implementar um FBA deve estar dando pulos de alegria.
Outro exmplo exemplo são cenários de Single Sign-On, a arquitetura permite que seja construído um conector para que o sharepoint seja autenticado pelo SAP por exemplo.
No link abaixo, você pode encontrar informações detalhadas sobre o Geneva Framework (WIF) sob o ponto de vista de desenvolvimento, o assunto é bem extenso mas vale a pena dar uma olhada.
http://download.microsoft.com/download/7/d/0/7d0b5166-6a8a-418a-addd-95ee9b046994/GenevaFrameworkWhitepaperForDevelopers.pdf
|  |  |
240
|  |
| | | | Por que esse assunto é tão importante?
Simples, no mundo de hoje todos tem acesso a um volume tão grande de informações que é virtualmente impossível que alguém assimile toda essa informação e mais ainda que pssa extrair relações entre elas, cada vez mais e mais pessoas estão produzindo conteúdo no mais diversos formatos e mídias assim fica óbvio que existea necessidade de trazer um pouco de ordem ao caos é ai que entram taxonomias e tags.
A idéia aqui é classificar o conteúdo de forma estrutura ou não de modo a destacar os elementos relevantes facilitando assim o processo de busca e relacionamento, esse conceito não é novo no SharePoint afinal você pode criar suas colunas de metadados, tipos de conteúdo e estruturar a informação da forma que achar conveniente, você pode inclusive criar esquemas de taxonomia complexos com ele, não é uma experiência agradável mas é tecnicamente possivel.
O que há de novo aqui é a forma como o SharePoint lida com isso agora, primeiro ele possui ferramentas que podem extrair esses metadados de forma automática assim por exemplo ao se fazer o upload de uma imagem em uma Asset Library ele tenta encontrar os dados EXIF da jimagem ou com base no local por exemplo ao carregar o documento numa pasta janeiro ele atribui o metadado Mes=Janeiro ao documento e o melhor de tudo é que essas regras são configuráveis.
Além disso, todo o conteúdo possui um rating permtindo aos usuários votar na relevância do conteúdo e esse rating é utilizado nos cálculos de relevância da Busca.
Outra novidade é a possibilidade de gerenciar de forma centralizada a criação de Taxonomias, no Central Admin existe um serviço de metadados nele é possivel se criar taxonomias definir se os usuários podem ou não modificar a estrutura, quais são os sinônimos e traduções
Como é um service application uma mesma taxonomia pode ser aplicada a todos os applications ou pode ser criado uma store para cada um
Do ponto de vista do usuário essa taxonomia é apresentada na forma de um field type que voce atribui a uma lista, ao criar ou editar um item é apresentado ao usuário um picker para que ele possa escolher.
Além do repositório central o SharePoint 2010 permite a criação de Folksonomias que é um tipo de de tagueamento descentralizado e não gerenciado, os usuários podem atribuir tags próprias para o conteúdo ou mesmo utilizar tags de outras pessoas, o recurso é tão avançado que permite que o usuário classifique não 'só o conteúdo do portal como também conteúdos externos, os adminsitradores contam com relatórios que mostram quais são as tags mais utilizadas permitindo por exemplo que eles incorporem essas tags como termos na taxonomia corporativa.
Enfim, no SharePoint 2010 metadados serão um dos pilares da plataforma, em todo lugar seja num item de lista, post de blog ou wiki o usuário terá semre a sua disposição uma forma de classificar o conteúdo.
Technorati Tags: SP2010,SharePoint 2010,SharePoint,Tags,Taxonomia,EMM
|  |  |
240
|  |
| | | | Os desenvolvedores SharePoint se habituaram a viver num mundinho isolado com maneiras e ferramentas únicas tanto para desenvolver como para confugurar e administrar o SharePoint, com o SharePoint 2010 a Microsoft deu um passo gigantesco no sentido consolidar ferramentas e métodos, por isso teremos melhor suporte do Visual Studio, maior aderência com os novos recursos do .Net Framework e como não poderia deixar de ser o mesmo vale para a administração e configuração, nesta nova versão finalmente poderemos ficar livres do STSADM, nada contra ele faz o seu trabalho direitinho, pemrite ate um certo grau de extensibilidade, mas não é nenhum pouco intuitivo e com certeza nenhum pouco performático.
Assim entra em cena o PowerShell, mas o que é o PowerShell?? É a nova interface de linha de comando e linguagem de script desenvolvida para administradores, foidesenvolvida em cima do .Net CLR e seu charme esta no fato de ao contrário de outras shells onde você passa texto e retorna texto como por exemplo o CMD.exe ou DOS, no PowerShell voce trabalha com XML e objetos isso somado a capacidade interligar comandos contribui e muito para o controle, eficiência e consequentemente produtividade do adminsitrador ou desenvolvedor.
O principal conceito do PowerShell é o CMDLET (pronuncía-se: "command-let"), o cmdlet é uma função que pode ser executada de forma isolada ou combinada com outros cmdlets de forma a executar tarefas complexas. Nativamente o Windows PowerShell vem com uma série de cmdlets prontos para tarefas corriqueiras de administração do Windows o SharePoint adicionou a esta lista tudo aquilo que você tinha no STSADM mais os novos comandos específicos do 2010, além disso a plataforma é completamente extensível você pode facilmente abrir o Visual Studio e criar um novo cmdlet batsa implementar um interface.
os cmdlets por sua natureza são extremamente intuitivos seus nomes são compostos de verbos e substantivos explicitando o que o comando faz como por exemplo Get-SPSite
O comando como o próprio nome diz retorna o SPSite da url http://localhost, mas ao contrario do stsadm ou outras shells ele não retorna uma string do SPSite e sim o objeto SPSite própriamente dito que pode ser utilizado por outros comandos, assim introduzimos o conceito de pipe os objetos retornados podem ser passados (ou piped) para outro comandos como parametro de entrada isso é feito simplesmento colocando um | entre os comandos como no exemplo:
$password = Read-Host "What is the password for all acounts?" -assecurestring ; Get-Content usernames.txt | ForEach-Object {New-SPManagedAccount -password $password -username litwareinc\$_; Set-SPManagedAccount -identity $_ -autogenerate -confirm:$False}
Neste caso o conteúdo do arquivo usernames.txt obtido com o comando Get-Content é passado ao comando ForEach-Object que por sua vez executa os comandos dentro do {} para cada objeto obtido do arquivo usernames.txt. simples, bem simples.
Isso quer dizer que não tem mais STSADM? O que eu faço com o monte de BAT`s que eu criei? Calma ele ainda existe no mesmo lugar onde sempre existiu justamente para manter a compatibilidade, voce pode inclusive executar o STSADM a partir de um script PowerShell:
foreach ($site in (get-spsite -limit 5000000 -Webapplication $WebApp)) { Write-Host "Activating feature " $solutionName "on" $site.url "..."; Write-Host stsadm "-o activatefeature -url" $site.url "-filename" $featureFileName; stsadm -o activatefeature -url $site.url -filename $featureFileName
if( $lastexitcode -ne 0 ) { Write-Host "Something went wrong activating the site feature. Exit code: " $lastexitcode "`n" -ForegroundColor Red; $failure = $true; $error.Clear(); } }
Contudo o mesmo script pode ser escrito da seguinte forma:
Get-SPSite –Limit ALL –WebApplication $WebAppNameorUrl |%{ Enable-SPFeature $FeatureIdOrName –url $_.Url }
Fora a diferen'ca obvia de tamanho e complexidade o segundo também é bem mais rápido para se ter uma idéia ao executar os 2 scripts contra 5500 site collections o primerio leva mais de 12 horas enquanto que o segundo em menos de 1 hora, impressionante!!!
Enfim é uma evelução fantástica em termos de como podemos configurar/administrar o SharePoint e com certeza conhecimentos de PowerShell serão de suma importância a todos que trabalham com Sharepoint
Technorati Tags: SP2010,Sharepoint 2010,PowerShell,Microsoft
|  |  |
240
|  |
View in Web Browser /_layouts/VisioWebAccess/VisioWebAccess.aspx?listguid={ListId}&itemid={ItemId}&DefaultItemOpen=1 0x0 0x1 FileType vdw 255 Compliance Details javascript:commonShowModalDialog('{SiteUrl}/_layouts/itemexpiration.aspx?ID={ItemId}&List={ListId}', 'center:1;dialogHeight:500px;dialogWidth:500px;resizable:yes;status:no;location:no;menubar:no;help:no', function GotoPageAfterClose(pageid){if(pageid == 'hold') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/hold.aspx?ID={ItemId}&List={ListId}'); return false;} if(pageid == 'audit') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/Reporting.aspx?Category=Auditing&backtype=item&ID={ItemId}&List={ListId}'); return false;} if(pageid == 'config') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/expirationconfig.aspx?ID={ItemId}&List={ListId}'); return false;}}, null); return false; 0x0 0x1 ContentType 0x01 898 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XsnLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 FileType xsn 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.2 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.3 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.4 255 View in Browser /_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsx 255 View in Browser /_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsm 255 View in Browser /_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsb 255 Document Set Version History javascript:SP.UI.ModalDialog.ShowPopupDialog('{SiteUrl}/_layouts/DocSetVersions.aspx?List={ListId}&ID={ItemId}') 0x0 0x0 ContentType 0x0120D520 330 Send To other location javascript:GoToPage('{SiteUrl}/_layouts/docsetsend.aspx?List={ListId}&ID={ItemId}') 0x0 0x0 ContentType 0x0120D520 350 Manage PowerPivot Data Refresh /_layouts/images/powerpivot/manage_refresh.gif javascript:window.location='{SiteUrl}/_layouts/PowerPivot/ViewDataRefreshHistory.aspx?list={ListId}&ID={ItemId}&Source=' + encodeURIComponent(window.location) 0x0 0x4 FileType xlsx 350 Manage PowerPivot Data Refresh /_layouts/images/powerpivot/manage_refresh.gif javascript:window.location='{SiteUrl}/_layouts/PowerPivot/ViewDataRefreshHistory.aspx?list={ListId}&ID={ItemId}&Source=' + encodeURIComponent(window.location) 0x0 0x4 FileType xlsb 350 Manage PowerPivot Data Refresh /_layouts/images/powerpivot/manage_refresh.gif javascript:window.location='{SiteUrl}/_layouts/PowerPivot/ViewDataRefreshHistory.aspx?list={ListId}&ID={ItemId}&Source=' + encodeURIComponent(window.location) 0x0 0x4 FileType xlsm 350 Edit Data Service Document /_layouts/images/powerpivot/atomsvc.gif /_layouts/PowerPivot/DataFeed.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType atomsvc 350 |
|
|
|