Arquivo da tag: SharePoint 2013

SharePoint 2013 Apps – Uma nova visão! Criando timer jobs utilizando apps

Olá SharePointers,

Desde que o SharePoint 2013 foi lançado e trouxe o seu novo conceito de APPs (impulsionado pelo Office 365) muito foi falado sobre o assunto.

Desde então fornecedores, profissionais e clientes têm travado uma “guerra” pensando se devem ou não utilizar esse modelo de desenvolvimento quando o assunto é ambiente OnPremises.

É comum, pelo menos aqui no Brasil, ainda mantermos o foco do desenvolvimento utilizando Farm Solutions. Mas, e quando o cliente não quer? Que opção nos resta?

A primeira opção que nos vem a cabeça é No-Code Sandbox Solutions. Faço tudo com Javascript e faço o deploy pelo Browser, não preciso de um administrador para essa tarefa e tudo resolvido.

Esse modelo é muito legal e interessante, ainda mais pelo fato de que a Microsoft está fazendo um esforço muito grande em liberar toda a API que temos disponível via Server Object Model para a versão client. Mas, ainda temos limitações. Por exemplo, fazer um impersonate, ou seja, fazer uma ação com um usuário que não seja o seu… Ou ainda, não criar um usuário apenas para “integração”, que você precisa fornecer tanto o login quanto a senha para acessar o ambiente… Como fazer?

Nesse caso, podemos utilizar Apps de um jeito que não tinhamos pensado antes.. Não apenas como SharePoint-Hosted Apps e Provider-Hosted Apps. Vou explicar:

Pense em um cenário que você precisa criar um “TimerJob”, mas não tem acesso ao ambiente. Como fazer?

Vou mostrar passo-a-passo como fazer isso de forma simples utilizando apps:

1- Criar um Console Application (Console Application? É isso mesmo?  Acreditem, isso mesmo!! 😀 )

1

2 – Clicar com o botão direito na Solution e ir em Manage Nuget Packages.

2

 

3 – Procure por SharePoint app e clique para instalar o pacote App for SharePoint Web Toolkit

3

 

4 – Abrir a URL “_layouts/AppRegNew.aspx” no seu SharePoint

4

Clicar no botão gerar do ID do Cliente e do Segredo do Cliente. Digitar o Título da App preencher um domínio para a APP (pode ser localhost) e uma URL de redirecionamento (pode ser a URL do seu SharePoint). Não iremos utilizar o domínio e a URL, mas são obrigatórios 😀

Quando clicar em Criar, o SharePoint mostrará na próxima tela os dados gerados.

IMPORTANTE: Anote o ID e o SEGREDO do Cliente gerados. Você precisará desses valores posteriormente.

5 – Adicionem os valores abaixo no arquivo app.config

 5

Lembrem de substituir o valor do ClientID e do ClientSecret com o que foi gerado na etapa anterior.

6 – Dar permissões ao App

Para dar permissões ao App, abra a URL “_layouts/AppInv.aspx”

6

Digite o ClientID (gerado na etapa anterior) e clique em pesquisar. Os campos serão preenchidos automaticamente.

No campo XML de Solicitação de Permissão do Aplicativo cole o XML abaixo:

<AppPermissionRequests AllowAppOnlyPolicy=”true”>

    <AppPermissionRequest Scope=”http://sharepoint/content/tenant” Right=”Manage” />

</AppPermissionRequests>

Com esse XML, você dará permissão em todo o Tenant para o App. Você pode alterar se precisar, mas para o nosso cenário, essa permissão está ok.

7 – Codificar

7

Agora é só codificarmos a nossa necessidade.

string siteUrl = “http://localhost”;

Uri uri = new Uri(siteUrl);

string realm = TokenHelper.GetRealmFromTargetUrl(uri);

// Pegar o access token

string accessToken = TokenHelper.GetAppOnlyAccessToken(

    TokenHelper.SharePointPrincipal,

    uri.Authority, realm).AccessToken;

// conectar no site com o contexto do APP

using (var ctx = TokenHelper.GetClientContextWithAccessToken(uri.ToString(), accessToken))

{

    /// codigo vai aqui

}

Agora é só agendar esse executável no agendador de tarefas do Windows e pronto. Para esse caso, criar um serviço do Windows é mais interessante, mas por funções educativas, utilizei o Console Application.

Fiz o upload da solution de testes, para quem quiser baixá-la e utilizar para testes em seu próprio ambiente: http://1drv.ms/1Hh8WIl

O que acharam?

Atualizações do SharePoint 2013 virão pelo Windows Update (!?)

Olá SharePointers,

É verdade! Todos os updates a partir de Fevereiro/2015 serão automaticamente distribuídos através do Windows Update.

Para quem vive o dia-a-dia de administrar uma farm SharePoint sabe o quanto essa notícia pode ser “assustadora”.

Dessa forma, a sua farm estará sempre atualizada, necessitando apenas, ocasionalmente, que você rode o Configuration Wizard para atualizar o schema do banco e os binários.

Mas para quem conhece o ambiente de SharePoint e sempre tem algum receio de colocar as atualizações assim que são publicadas, devem alterar as configurações do Windows Update para que ele não saia instalando atualizações automaticamente :D.

Referências

http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?List=56f96349-3bb6-4087-94f4-7f95ff4ca81f&ID=552&Web=48e6fdd1-17db-4543-b2f9-6fc7185484fc&utm_content=bufferd826c&utm_medium=social&utm_source=linkedin.com&utm_campaign=buffer

http://blogs.technet.com/b/stefan_gossner/archive/2015/02/12/sharepoint-cus-and-windows-update.aspx

 

Fiquem espertos 😀

Abraços!

 

SharePoint 2013 e seus modelos de desenvolvimento

Olá SharePointers,

Passando por alguns projetos recentes e após várias dúvidas comuns a profissionais do ramo, resolvi escrever um post sobre o assunto.

Com a introdução do SharePoint 2013, a Microsoft nos apresentou um recurso muito interessante: Apps for SharePoint. Durante todo o tempo em que esse conceito era apresentado para nós, era comum notarmos que a mensagem que era divulgada é “Apps é o futuro”.

Após esse período inicial, quando todos começaram a trabalhar com o produto, notamos uma grande resistência da comunidade em utilizá-lo. Para mais informações sobre como criar componentes reutilizáveis no SharePoint, veja: https://msdn.microsoft.com/en-us/library/office/jj163953(v=office.15).aspx.

Entretanto, nós profissionais, devemos filtrar a mensagem e entender o que está por trás disso tudo: Office 365. A Microsoft tem investido cada vez mais em sua plataforma de nuvem e é natural que ela concentre os seus esforços em sua “menina dos olhos”. Dessa forma, com os “famosos” apps, ela consegue resolver um problema crítico em um cenário de nuvem (com ambiente compartilhado entre os clientes): permitir que cada cliente possa customizar o seu espaço sem interferir nos demais e não ter um time para validar cada pacote, antes de ser colocado no ambiente SharePoint, para garantir que ele não contenha nenhuma operação potencialmente perigosa para o ambiente.

Com os apps não perdemos o nosso poder de customização e não dependemos de algum IT Pro para instalar, gerenciar os Change Requests no ambiente e potencialmente causar indisponibilidade no mesmo. Fantástico, não? 😀

Sendo assim, a Microsoft conseguiu criar um ambiente muito mais estável e gerenciável, permitindo entregar muita qualidade e evitando que um cliente degrade performance de outro. Combinação matadora para um ambiente de nuvem.

E quem não utiliza essa plataforma e ainda prefere/quer investir em sua plataforma on-premises?

Embora para alguns casos o modelo de Apps possa ser utilizado também, por exemplo em ambientes muito controlados onde customizações não são permitidas, esse modelo é super válido. Permite agregar valor para o usuário de forma rápida e, ainda em uma futura migração de versões do produto, é bem fácil migrar a solução.

Em um cenário onde você tem outras alternativas de desenvolvimento, como farm solutions, avaliá-las pode e deve fazer parte das atividades dos arquitetos de sistema. Escrevi um post uma vez comparando Farm Solutions com Apps (SharePoint 2013 : Farm Solution x Apps), ele aborda os detalhes técnicos com mais detalhes.

Mas, para um time que já investiu tempo (e dinheiro) criando uma série de framework e utilitários para farm solutions, não vale a pena investir esforço migrar para esse modelo novo (a não ser que tenha previsão de migrar para o Office 365 um dia). Além de termos muito mais controle com Farm Solutions, conseguimos evitar alguns comportamentos, na minha opinião, estranhos. Exemplo:

Utilizando REST APIs, ao referenciarmos um campo, devemos utilizar o Display Name do campo sem espaços; Se o campo tem o InternalName: NomePai e o Display Name: Nome do Pai, devo utilizar NomedoPai. Se o display name desse campo mudar, tem que alterar o código..

Não posso deixar de comentar que o investimento que a Microsoft está fazendo em APIs client é absurdo, buscando chegar no mesmo nível do Server Object Model. No mundo ideal, todas as APIs que temos disponíveis no lado do server estará disponível no Client. 🙂

A própria adição do “JSLink” (https://msdn.microsoft.com/en-us/magazine/dn745867.aspx) é sensacional.

Além disso, para uma farm on-prem suportar o modelo de Apps, é necessário realizar uma série de configurações adicionais no ambiente (inclusive no DNS – https://technet.microsoft.com/en-us/library/fp161236(v=office.15).aspx).

Autenticação não funcionará com Kerberos. É impossível lidar com tantas URLs diferentes que são geradas quando utilizamos Apps.

É muito rápido e fácil criar customizações server-side. Em pouco tempo estamos com uma solução pronta para utilização do usuário.

 

Para mim, sempre que possível, o modelo de desenvolvimento para ambientes on-prem é através de Farm Solutions.

 

Para ajudar na decisão de qual modelo escolher, recomendo a leitura desse link: https://msdn.microsoft.com/en-us/library/office/dn268593(v=office.15).aspx

Essa é uma discussão bem longa, gostaria de saber mais de vocês que utilizam o SharePoint no dia-a-dia. O que acham desse assunto? Qual modelo de desenvolvimento utilizam e porquê?

 

SharePoint 2013: Site em modo de manutenção

Olá SharePointers,

Após restaurar um site collection, ele aparecia com a mensagem em vermelho abaixo.

Além disso, a página de Quota e Locks e estava como read-only e tudo bloqueado. Não dava para alterar nada.

 

image

Para resolver isso, é só rodar o script PowerShell abaixo e tudo volta ao normal 😀

$Admin = new-object Microsoft.SharePoint.Administration.SPSiteAdministration('http://url_do_site') $Admin.ClearMaintenanceMode()

image

 

Explicação: No SharePoint 2013 foi criado uma propriedade para o Site Collection (SPSite) para identificar que o site está em manutenção (e read-only). Essa flag pode ser removida utilizando o objeto SPSiteAdministration http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spsiteadministration_members.aspx

 

Abraços 😀

SharePoint 2013 List View Lookup Threshold alterado

Olá SharePointers,

No Cumulative Update de Junho de 2013 para SharePoint 2013, o List View Lookup Threshold foi alterado para 12 ao invés de 8 que conhecíamos.

Essa, aparentemente, não é uma informação nova, pois existe um post do time de escalation falando dessa informação desde 02/12/2013: http://blogs.msdn.com/b/spses/archive/2013/12/02/sharepoint-2010-2013-list-view-lookup-threshold-uncovered.aspx#comments

Além disso, essa informação também vale para o Office 365: http://blogs.office.com/2013/09/05/sharepoint-online-improves-limits-and-makes-it-easier-to-restore-documents/

Lembrando que esse item fala sobre a quantidade de campos lookups em uma VIEW de lista. E vale lembrar, que o SharePoint já possui alguns campos lookups nativos e que devem ser contados para esse “limite”, são elas:

Name ( linked to Document) , Link (Edit to edit item) , Name ( linked to Document with edit menu), type ( icon linked to document)

clip_image002

 

Para saber mais sobre os limites do SharePoint, recomendo a leitura desse artigo: Software boundaries and limits for SharePoint 2013.

 

Abraços!

Instalando SharePoint 2013 no Windows Server Technical Preview

Olá SharePointers,

Hoje vou mostrar um passo-a-passo para quem quiser instalar o SharePoint Server 2013 SP1 no Windows Server Technical Preview que acabou de sair.. 😀

Nesse tutorial, abordarei apenas os pontos críticos que diferem de um ambiente normal.

Atenção: Não tentem replicar isso em um ambiente produtivo.. Esse cenário foi utilizado apenas para testes. As alternativas (ou “workarounds”) que utilizei não são válidos em ambientes reais. 😀

Após a instalação do Windows Server, criei um domínio de testes e instalei o SQL Server 2012.image

Ativei as Roles de Web Server

image

e o .NET 4.5

image

 

Após terminar essa etapa do domínio, fui tentar instalar os Pré-requisitos do SharePoint… E… ERRO!

image

 

Sendo assim, tive que fazer o download dos pré-requisitos manualmente e instalei um-por-um. Atenção especial ao AppFabric, que precisa ser executado o comando abaixo para instalar conforme o SharePoint precisa:

.\WindowsServerAppFabricSetup_x64 / i CacheClient,CachingService,CacheAdmin / gac

 

Eu não consegui achar um jeito para instalar o Windows Identity Foundation que o setup do SharePoint estava buscando. (ver erro abaixo).

OBS: Assim que descobrir como fazer para instalar, edito o post 😀

Untitled

Então utilizei o Process Monitor (Link para download aqui: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) para identificar o que o Setup estava tentando fazer e dar um “ByPass”.

 

image

Com isso, só adicionar as chaves no Regedit (arquivos .reg disponíveis aqui: http://1drv.ms/1pJknLj) e PRONTO! Finalmente apareceu a tela que eu tanto queria! 😀

image

image

Na hora de rodar o Configuration Wizard, deu o erro abaixo.

Isso era porque estava faltando a dll Microsoft.IdentityModel.Extensions na pasta C:\Program Files\Reference Assemblies\Microsoft\Microsoft Identity Extensions\1.0.

Mesmo após colocá-la, só consegui avançar reiniciando a máquina.

 

image

 

Após isso, sucesso!

 

image

 

image

 

O que acharam?

SharePoint 2013: Shredded storage

Olá SharePointers,

Hoje vou falar um pouco sobre Shredded storage e como o SharePoint se comporta utilizando esse recurso.

Antes de mais nada, vamos ao significado do verbo “Shred” que significa cortar, despedaçar, retalhar. Trazendo para o mundo do SharePoint, Shredded storage é uma grande melhoria na gestão de objetos binários (os “BLOBs” – que basicamente são arquivos como Planilhas do Excel, Documentos do Word, Vídeos, etc.).

Quem trabalha com o SharePoint desde as versões anteriores (pode ser a 2010 :D) sabe que versionamento, por exemplo, era um grande problema quando o ponto de vista era armazenamento. A cada alteração no documento, o SharePoint realizava uma cópia completa do arquivo e armazenava isso no banco de dados.

Agora, imaginem o seguinte cenário: Supondo que em arquivo de 10MB seja alterado 5 vezes por dia, logo, consumirá 50MB de espaço por dia.

É importante ressaltar que os softwares client da Microsoft (leia: o Pacote Office – Word, Excel, PowerPoint, etc.) já possuiam a tecnologia para que quando um arquivo aberto do SharePoint fosse salvo, somente o diferencial era enviado pela rede (over-the-wire, de volta ao SharePoint) e o SharePoint fazia o trabalho de fazer um “Merge” do arquivo original com o diferencial e salvar esse arquivo inteiro novamente.

O que mudou?

Com o SharePoint 2013 e a criação do Shredded storage (que utiliza o Cobalt –Sincronização de arquivos via SOAP – HTTP), esse BLOB que antes era armazenado em 1 linha do banco de dados SQL Server, agora é dividido em várias linhas. Quando um usuário faz a alteração em algum arquivo, o SharePoint é capaz de identificar qual registro foi alterado e alterar somente esse pedaço – bem reduzido – do arquivo, reduzindo o overhead de utilização de disco, estimada em 2x.

Isso funciona somente com arquivos do Office?

Não. A grande sacada é que funciona com qualquer tipo de arquivo. Não precisa ser do Office e nem muito menos a versão mais atual do Office. Qualquer arquivo se beneficiará dessa tecnologia.

 

Como ficou o armazenamento do BLOB?

Até a versão 2010, os documentos eram armazenados da seguinte forma: os metadados (propriedades do arquivo e do formato) e o stream contendo a representação binária do arquivo.

Com o SharePoint 2013, isso mudou! Temos uma tabela adicional no banco de dados de conteúdo (DocStreams) para armazenar cada pedaço do BLOB do arquivo e, ainda, temos um cache para otimizar a leitura do arquivo.

image

 

Para mais detalhes sobre o assunto, consultem as referências abaixo:

http://blogs.technet.com/b/wbaer/archive/2012/11/12/introduction-to-shredded-storage-in-sharepoint-2013.aspx

http://www.metalogix.com/blog/blog-article/13-03-18/Dispelling_the_Myths_of_Shredded_Storage_in_SharePoint_2013

http://www.microsoft.com/en-us/download/details.aspx?id=39719

SharePoint Apps: Como utilizar o People Picker?

Olá SharePointers,

Hoje vou falar sobre como utilizar o People Picker quando estamos desenvolvendo uma app para SharePoint.

O primeiro passo, é carregar os scripts que serão utilizados (ver imagem abaixo) e colocar a div quer será utilizada para criação do controle dinamicamente.

image

 

Após a criação dos controles acima, basta colocar o código abaixo em um arquivo .js e adicioná-lo a página como referência que o People Picker funcionará perfeitamente.

 

// Run your custom code when the DOM is ready. $(document).ready(function () { // Specify the unique ID of the DOM element where the // picker will render. initializePeoplePicker('peoplePickerDiv'); }); // Render and initialize the client-side People Picker. function initializePeoplePicker(peoplePickerElementId) { // Create a schema to store picker properties, and set the properties. var schema = {}; schema['PrincipalAccountType'] = 'User,DL,SecGroup,SPGroup'; schema['SearchPrincipalSource'] = 15; schema['ResolvePrincipalSource'] = 15; schema['AllowMultipleValues'] = true; schema['MaximumEntitySuggestions'] = 50; schema['Width'] = '280px'; // Render and initialize the picker. // Pass the ID of the DOM element that contains the picker, an array of initial // PickerEntity objects to set the picker value, and a schema that defines // picker properties. this.SPClientPeoplePicker_InitStandaloneControlWrapper(peoplePickerElementId, null, schema); } // Query the picker for user information. function getUserInfo() { // Get the people picker object from the page. var peoplePicker = this.SPClientPeoplePicker.SPClientPeoplePickerDict.peoplePickerDiv_TopSpan; // Get information about all users. var users = peoplePicker.GetAllUserInfo(); var userInfo = ''; for (var i = 0; i < users.length; i++) { var user = users[i]; for (var userProperty in user) { userInfo += userProperty + ': ' + user[userProperty] + '<br>'; } } $('#resolvedUsers').html(userInfo); // Get user keys. var keys = peoplePicker.GetAllUserKeys(); $('#userKeys').html(keys); // Get the first user's ID by using the login name. getUserId(users[0].Key); } // Get the user ID. function getUserId(loginName) { var context = new SP.ClientContext.get_current(); this.user = context.get_web().ensureUser(loginName); context.load(this.user); context.executeQueryAsync( Function.createDelegate(null, ensureUserSuccess), Function.createDelegate(null, onFail) ); } function ensureUserSuccess() { $('#userId').html(this.user.get_id()); } function onFail(sender, args) { alert('Query failed. Error: ' + args.get_message()); }

Bem simples, não acharam?

 

Abraços! 😀

 

Referência

http://msdn.microsoft.com/en-us/library/jj713593.aspx

Troubleshooting SharePoint/Office365: Sideloading of apps is not enabled on this site

Olá SharePointers,
Estava desenvolvendo uma SharePoint Hosted app para o Office 365 e, para minha surpresa, apareceu o erro abaixo.
Esse erro acontecia quando quando tentava fazer o deploy via Visual Studio.

 

Para resolver esse erro, basta rodar o script que está disponível nesse link: http://1drv.ms/1qDs0oy

 

Referência:

http://blogs.msdn.com/b/officeapps/archive/2013/12/10/enable-app-sideloading-in-your-non-developer-site-collection.aspx

Abraços! 😀

Troubleshooting: Failed to call GetTypes on assembly Microsoft.Office.TranslationServices

 

Olá SharePointers,

Hoje peguei um cenário “diferente”.

Após aplicar o Cumulative Update de Março/2013 no SharePoint 2013 RTM, todas as vezes que tentava rodar o Configuration Wizard aparecia o erro abaixo:

Failed to initial the upgrade sequence.

An exception of type Microsoft.SharePoint.Upgrade.SPUpgradeException was thrown. Additional exception information: Exception of type ‘Microsoft.SharePoint.Upgrade.SPUpgradeException’ was thrown.

Fui no REGEDIT e alterei o valor da chave SetupType para CLEAN_INSTALL. O caminho da chave é: "HKLMSoftwareMicrosoftShared ToolsWeb Server Extensions14.0WSS".

Após esse processo, rodei novamente o erro abaixo apareceu:

image

 

Após verificar o Cumulative Update, identifiquei que o que foi utilizado era para SharePoint Foundation e não SharePoint Server, o que fez com que algumas dlls não estivessem mais disponíveis.

 

Abraços 😀