quarta-feira, 30 de dezembro de 2015

SharePoint 2013: ScopeNotFoundException: Workflow publicado não é exibido


O evento abaixo ocorre, se o (sub)escopo do subsite no Workflow Manager não foi criado. Isso pode ocorrer após a importação de um subsite.

Maiores detalhes sobre o escopo do fluxo de trabalho:
"A scope is a named and securable container for Activities, Workflows, Instances, configuration and child Scopes.. It also provides a boundary for multi-tenancy and messaging (notifications). Scopes can be created and modified using the Workflow Client API. It is represented in the Client API by the T:Microsoft.Workflow.Client.ScopeInfo class."

Evento no log do SharePoint:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Microsoft.Workflow.Client.ScopeNotFoundException: Scope '/SharePoint/default/<site collection GUID>/<subsite GUID>' was not found. HTTP headers received from the server - ActivityId: <GUID>. NodeId: <Server name>. Scope: /SharePoint/default/<site collection GUID>/<subsite GUID>. Client ActivityId : <GUID>. ---> System.Net.WebException: The remote server returned an error: (404) Not Found.
at Microsoft.Workflow.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.Workflow.Client.HttpGetResponseAsyncResult`1.End(IAsyncResult result)
at Microsoft.Workflow.Client.ClientHelpers.SendRequest[T](HttpWebRequest request, T content) -
-- End of inner exception stack trace ---
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Solução:

Execute os dois comandos abaixo para desabilitar e habilitar o feature oculto "WorkflowServiceStore" para forçar a cria do escopo, em seguida publique os fluxos de trabalhos.
1. Disable-SPFeature WorkflowServiceStore -Url <endereço do subsite>
2. Enable-SPFeature WorkflowServiceStore -Url <endereço do subsite>

segunda-feira, 28 de dezembro de 2015

Let's Encrypt - certificados SSL grátis para todos!



"Let's Encrypt" iniciou a fase beta pública no dia 3 de dezembro, e está emitindo certificados SSL gratuitos - classificados pelos navegadores como confiáveis.

Atrás da autoridade de certificação "Let's Encrypt" estão organizações famosas, como Mozilla, Akamai, Cisco e a Electronic Frontier Foundation. Elas fundaram o Grupo Internet Security Research Group (ISRG). O objetivo do projeto é nada menos do que estabelecer conexões criptografadas HTTPS como o padrão da internet e, assim, garantir mais privacidade e segurança. 


Patrocinadores do projeto
O Grupo Internet Security Research Group quer alcançar isso com certificados gratuitos, os quais são classificados pelos principais navegadores como confiáveis. Além disso, o ISRG desenvolveu um novo protocolo chamado ACME, o que torna a emissão de certificados mais fácil e automatizada.


Relacionamento dos certificados do Let's Encrypt

A instalação e configuração é simples (consulte o artigo Instalador letsencrypt-win-simple), os certificados são validos por 90 dias e renovados automaticamente.

Observação: a configuração adicionará arquivos à página no IIS e será necessário validar o funcionamento após a aplicação das atualizações do SharePoint.

Fontes:

Passos para usar Let's Encrypt no IIS
Instalador letsencrypt-win-simple
Arquitetura

quarta-feira, 23 de dezembro de 2015

Office Web Apps 2013: Impossível abrir arquivos com a extensão XLS



Eu trabelhei esses dias na análise de um caso interessante: o OWA (Office Web Apps 2013) não abriu arquivos com a extensão XLS. O problema estava limitada a extensão XLS e não ocorreu com a versão mais recente (XLSX).

A resolução final foi habilitar o serviço do Firewall do Windows (MpsSvc), pois alguns produtos como por exemplo o Excel utilizam o serviço.

“If you tried to install Windows Essentials, but received error code 0x800706d9 or 0x80070643, you may need to turn on Windows Firewall. Windows Firewall is a program included with Windows XP, Windows Vista, and Windows 7 that monitors all of the data coming into and going out of your computer. Some programs included in Windows Essentials can only be installed if Windows Firewall is turned on.” 


Evento na interface:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
“Não sabemos o que aconteceu, mas houve algum erro. Você poderia tentar novamente?”
("We don't know what happened, but something went wrong. Could you please try that again?")
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Os eventos encontrados no log do OWA:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1.
Failed to create AppContainer profile: 0x800706d9

2.
ExcelService.PostProcessRequest: Excel Server Exception: System.InvalidOperationException: Failed to create XLS converter process, Hr=-2147467259
at Microsoft.Office.Excel.Server.CalculationServer.BaseWorkbook.<LoadWorkbookJobAsync>d__18.MoveNext()
at Microsoft.Office.Excel.Server.AsyncManager.Continue(Object ar) System.InvalidOperationException: Failed to create XLS converter process, Hr=-2147467259
at Microsoft.Office.Excel.Server.CalculationServer.BaseWorkbook.<LoadWorkbookJobAsync>d__18.MoveNext()
at Microsoft.Office.Excel.Server.AsyncManager.Continue(Object ar) StackTrace:
at uls.native.dll: (sig=53fdbc46-a3b4-42e3-b44b-f74a4e17fa48|2|uls.native.pdb, offset=26EA2)
at uls.native.dll: (offset=1F865)

3.
Watson bucket parameters: Uninitialized ULS, ULSException14, 86423e32 "excel web app", 0f0011a5 "15.0.4517.0", e6cb4d65 "microsoft.office.excel.server.calculationserver", 0f0011a5 "15.0.4517.0", 51a73998 "thu may 30 04:35:52 2013", 0000121a "0000121a", 00000252 "00000252", 54e7243f "invalidoperationexception", 65636931 "eci1"
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

quinta-feira, 22 de outubro de 2015

SharePoint: "Sorry, something went wrong" ao adicionar usuários no grupo Farm Administrators

O evento "Sorry, something went wrong" (Desculpe, algo deu errado) na interface, ocorre se o administrador do SharePoint que executa a operação não é administrador local no(s) servidor(es) do SharePoint OU se o navegador utilizado para acessar a página da administração central não foi aberto como administrador.

Em ambos os casos temos o seguinte evento no log do SharePoint:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1.
Application error when access /_layouts/15/aclinv.aspx, Error=Local administrator privilege is required to update the Farm Administrators' group.
 at Microsoft.SharePoint.SPUserCollection.AddCollection(SPUserInfo[] addUsersInfo, IEnumerable`1 addUsers)  
 at Microsoft.SharePoint.ApplicationPages.AclInv.<>c__DisplayClass12.<PrepareStrategyForGroupSharing>b__11()  
 at Microsoft.SharePoint.ApplicationPages.SharingStrategy.Share()  
 [...]
2.
Local administrator privilege is required to update the Farm Administrators' group.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
O motivo do erro é simples: SharePoint adiciona o usuário no grupo local "WSS_Admin_WPG" para isso precisamos elevar as permissões.

[]

SharePoint 2013 - Workflow suspenso: HTTP 401 You do not have permission to perform this action or access this resource.


O fluxo de trabalho no SharePoint 2013 fica normalmente no estado suspenso com a mensagem de erro "
You do not have permission to perform this action or access this resource." se o fluxo está configurado para enviar e-mail(s) e para iniciar automaticamente.

Mensagem de erro no interface:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
RequestorId: <GUID>. Details: An unhandled exception occurred during the execution of the workflow instance. Exception details: System.ApplicationException: HTTP 401 {"error":{"code":"-2147024891, System.UnauthorizedAccessException","message":{"lang":"en-US","value":"Access denied. You do not have permission to perform this action or access this resource."}}} {"Transfer-Encoding":["chunked"],"X-SharePointHealthScore":["0"],"SPRequestGuid":["<GUID>"],"request-id":["<GUID>"],"X-FRAME-OPTIONS":["SAMEORIGIN"],"MicrosoftSharePointTeamServices":["15.0.0.4675"],"X-Content-Type-Options":["nosniff"],"X-MS-InvokeApp":["1; RequireReadOnly"],"Cache-Control":["max-age=0, private"],"Date":["<DATE>"],"Set-Cookie":["WSS_KeepSessionAuthenticated={<GUID>}; path=\/"],"Server":["Microsoft-IIS\/7.5"],"WWW-Authenticate":["NTLM"],"X-AspNet-Version":["4.0.30319"],"X-Powered-By":["ASP.NET"]} at Microsoft.Activities.Hosting.Runtime.Subroutine.SubroutineChild.Execute(CodeActivityContext context) at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Mensagem de error no log do SharePoint:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
It’s app only request, but the app <identity> is not allowed to use app only policy.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Solução: Ativar o feature “Workflows can use app permissions” na página OU desativar e ativar o feature novamente.

[]

quarta-feira, 9 de setembro de 2015

Boas praticas da configuração do cache de objetos do SharePoint


Os recursos Publicação (Publishing), Web Part de Consulta de Conteúdo (Content Query Web Part), navegação (Navigation), web parts da pesquisa e a navegação de metadados (metadata navigation) necessitam do cache de objetos para executar consultas e obter dados:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The default Portal Super Reader account is NT Authority\Local Service, which is not correctly resolved in a claims authentication application. As a result, if the Portal Super Reader account is not explicitly configured for a claims authentication application, browsing to site collections under this application will result in an “Access Denied” error, even for the site administrator. This error will occur on any site that uses any feature that explicitly uses the object cache, such as the SharePoint Server Publishing Infrastructure, metadata navigation, the Content Query Web Part, or navigation.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

O cache executa a consulta não como o usuário que efetuou a consulta, em vez disso, ele a executa duas vezes: uma com a conta do "Super User" e a outra com a conta do "Super Reader". Os resultados dessas duas consultas são armazenados no cache de objetos. Por isso o cache precisa armazenar resultados para apenas dois usuários, isto diminui a quantidade de memória que é necessária para armazená-lo.

Os resultados para a conta do usuário "Super User" incluem itens de rascunho e os resultados para a conta do "Super Reader" incluem somente itens publicados. O cache de objetos, em seguida, verifica as listas de controle de acesso (ACLs) para o usuário que iniciou o pedido e retorna os resultados apropriados para o usuário. 

Os erros mencionados nesse post ocorrem se as contas do "Super Reader" e "Super User", utilizadas pelo cache de objetos, não foram configuradas ou configuradas incorretamente.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
1.SPRequest.GetAclForScope: UserPrincipalName=i:0).w|<PrimarySID>, AppPrincipalName= ,bstrWebUrl=http://<URL> ,guidScopeId=<GUID> ,fRequirePermissionCheck=True
2.System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)), StackTrace: at Microsoft.SharePoint.SPReusableAcl..ctor(SPRequest request, String webUrl, Guid scopeId, Boolean requirePermissionCheck)   at Microsoft.SharePoint.Publishing.AclCache.GetAclForScope(Guid scopeId, Boolean disposeOfSite)   at Microsoft.SharePoint.Publishing.AclCache.GetAclForScope(Guid scopeId)   at Microsoft.SharePoint.Publishing.CachedArea..ctor(PublishingWeb area, String id, String parentId, CachedUserResource title, String url, CachedUserResource description, CachedObjectFactory factory) [...] 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Script para configurar as contas no SharePoint 2010/2013/2016 (Autenticação Claims)
Obs.: As contas do "Super User" e "Super Reader" devem ser contas separadas e não devem ser usadas para fazer o logon no site.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
## Altere a conta mantendo o claim, exemplo: "i:0#.w|contoso\superuser"
$SU = "i:0#.w|sharepoint\sp_superuser"
## Altere a conta mantendo o claim, exemplo: "i:0#.w|contoso\superreader"
$SR = "i:0#.w|sharepoint\sp_superreader"

foreach ($WA in Get-SPWebApplication)
{
    if($WA.UseClaimsAuthentication)
    {
        $fullPolicy = $WA.Policies.Add($SU, $SU)
        $fullPolicy.PolicyRoleBindings.Add($wa.PolicyRoles.GetSpecialRole
([Microsoft.SharePoint.Administration.SPPolicyRoleType]::FullControl))
        $readPolicy = $wa.Policies.Add($SR, $SR)
        $readPolicy.PolicyRoleBindings.Add($wa.PolicyRoles.GetSpecialRole
([Microsoft.SharePoint.Administration.SPPolicyRoleType]::FullRead))
        $wa.Properties["portalsuperuseraccount"] = $SU;
        $wa.Properties["portalsuperreaderaccount"] = $SR;
        $wa.Update()
    }
}
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Script para configurar as contas no SharePoint 2010/2013 (Autenticação modo clássico)
Obs.: As contas do "Super User" e "Super Reader" devem ser contas separadas e não devem ser usadas para fazer o logon no site.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
## Altere a conta, exemplo: "contoso\superuser"
$SU = "sharepoint\sp_superuser"
## Altere a conta, exemplo: "contoso\superreader"
$SR = "sharepoint\sp_superreader"

foreach ($WA in Get-SPWebApplication)
{
    if($WA.UseClaimsAuthentication)
    {
        $fullPolicy = $WA.Policies.Add($SU, $SU)
        $fullPolicy.PolicyRoleBindings.Add($wa.PolicyRoles.GetSpecialRole
([Microsoft.SharePoint.Administration.SPPolicyRoleType]::FullControl))
        $readPolicy = $wa.Policies.Add($SR, $SR)
        $readPolicy.PolicyRoleBindings.Add($wa.PolicyRoles.GetSpecialRole
([Microsoft.SharePoint.Administration.SPPolicyRoleType]::FullRead))
        $wa.Properties["portalsuperuseraccount"] = $SU;
        $wa.Properties["portalsuperreaderaccount"] = $SR;
        $wa.Update()
    }
}
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Fontes:

SharePoint 2013: Claims Encoding
http://social.technet.microsoft.com/wiki/contents/articles/13921.sharepoint-2013-claims-encoding-also-valuable-for-sharepoint-2010.aspx

How Claims encoding works in SharePoint 2010
http://www.wictorwilen.se/Post/How-Claims-encoding-works-in-SharePoint-2010.aspx

Identity Claims Encoding for SharePoint
http://blogs.msdn.com/b/scicoria/archive/2011/06/30/identity-claims-encoding-for-sharepoint.aspx

Configure object cache user accounts in SharePoint Server 2013
https://technet.microsoft.com/en-us/library/ff758656.aspx

Caching in SharePoint
https://msdn.microsoft.com/en-us/library/ff647588.aspx

domingo, 28 de junho de 2015

SharePoint 2013: Visão geral das vantagens, configurações e da manutenção do RBS com Filestream.

Visão Geral

No SharePoint, um objeto binário grande (BLOB) é um arquivo, tal como um documento ou um arquivo de vídeo. Por padrão, esses BLOBs, também chamados de dados não estruturados, são embutidos no banco de dados de conteúdo do SharePoint com os metadados ou dados estruturados. O tamanho dos BLOBs pode ser enorme: 2gb no SharePoint 2013, e a remoção dos BLOBs do banco de dados do SQL pode ser útil para melhorar o desempenho do servidor SQL.

Para isto podemos utilizar o RBS com Filestream, que é um recurso do SQL Server (a partir da versão 2008) que permite que dados estruturados sejam armazenados no banco de dados e que os dados associados não estruturados sejam armazenados diretamente no sistema de arquivos NTFS e mantenham a consistência transacional entre os dados estruturados e não estruturados, permitindo até mesmo a recuperação pontual dos dados FILESTREAM usando backups de log.


Seguindo os testes da Microsoft teremos o melhor ganho de desempenho com BLOBs maiores do que 1mb: Filestream usa o cache do sistema NT para dados de arquivo cache, reduzindo o efeito dos BLOBs no database engine. O pool de buffer do SQL Server não é utilizado, portanto, temos mais memória disponível para o processamento de consultas.
Outros efeitos positivos: 


  • Redução do tamanho das bases em torno de 95%
  • Melhoramento no desempenho do upload de arquivos em torno de 30% Maiores detalhes: SQL Server RBS Performance with SharePoint Server 2010



  • Configuração

    Observações:

    • A conta do usuário utilizada executando as etapas da configuração das bases deve ser membro do db_owner em cada banco de dados que você está configurando para RBS.
    • A conta do usuário que instala a biblioteca do cliente RBS deve ser membro do grupo de Administradores em todos os computadores em quais você instala a biblioteca do cliente do RBS.
    • A conta do usuário que habilita RBS para cada banco de dados de conteúdo do SharePoint deve ser administrador da farm do SharePoint.
    • Todas as configurações mencionadas nesse artigo foram testado em uma farm "three-tier" do SharePoint 2013 SP1 e com servidor SQL 2012 SP2.
    • O RBS com Filestream não influencia nos tamanhos recomendados pela Microsoft de 200GB e/ou 4TB.

    Habilitar Filestream na instância do SQL do SharePoint
    a.) Abra o SQL Server Configuration Manager.
    b.) Entre nas propriedades da instância no serviço do SQL e escolha FILESTREAM.
    c.) Habilite filestream na instância do SQL conforme imagem abaixo:


     
    d.) Execute a seguinte consulta para finalizar essa configuração:
    EXEC sp_configure filestream_access_level, 2RECONFIGURE


    e.) Reinicie a instância do SQL.
    Obs.: Essa configuração precisa ser feita uma única vez na instância do SQL em qual você utilizará RBS com Filestream.




    Provisionar o repositório BLOB para cada base de dados de conteúdo.


    Configurar o repositório da base

    Altere o nome da base e execute as consultas abaixo para cada base de dados de conteúdo.
    Obs.: Utilize uma chave de encriptação diferente (create master key encryption by password = N'Admin Key Password !2#4')!


    use [WSS_Content]if not exists(select * from sys.symmetric_keyswhere name = N'##MS_DatabaseMasterKey##')create master key encryption by password = N'Admin Key Password !2#4'
    use [WSS_Content]if not exists(select groupname from sysfilegroupswhere groupname=N'RBSFilestreamProvider')alter database [WSS_Content]add filegroup RBSFilestreamProvider contains filestream
    Obs.: Altere o lugar do repositório, conforme desejado.
    use [WSS_Content]alter database [WSS_Content]add file (name = RBSFilestreamFile, filename = 'c:\Blobstore')to filegroup RBSFilestreamProvider




    Instalar o cliente RBS em todos os servidores Web do SharePoint (em todos com o serviço "Microsoft SharePoint Foundation Web Application" habilitado).

    1. Baixe o cliente RBS (x64 RBS.msi) do Microsoft® SQL Server® 2012 SP2 Feature Pack.

    2. Execute no primeiro servidor do SharePoint o seguinte comando em um prompt administrativo:

    msiexec /qn /lvx* rbs_install_log.txt /i RBS.msi TRUSTSERVERCERTIFICATE=true FILEGROUP=PRIMARY DBNAME="WSS_Content" DBINSTANCE="DBInstanceName" FILESTREAMFILEGROUP=RBSFilestreamProvider FILESTREAMSTORENAME=FilestreamProvider_1


    Verifique em seguida o sucesso da instalação no log gerado (rbs_install_log.txt), você deve encontrar no final do log a mensagem do sucesso: "Product: Microsoft SQL Server 2012 Remote BLOB Store  -- Installation completed successfully."

    3. Execute o comando abaixo nos demais servidores web do SharePoint:
    msiexec /qn /lvx* rbs_install_log.txt /i RBS.msi DBNAME="WSS_Content_Intranet" DBINSTANCE="mvplabsql" ADDLOCAL=Client,Docs,Maintainer,ServerScript,FilestreamClient,FilestreamServer


    Verifique em seguida o sucesso da instalação no log gerado (rbs_install_log.txt), você deve encontrar no final do log a mensagem do sucesso: "Product: Microsoft SQL Server 2012 Remote BLOB Store  -- Installation completed successfully."

    4. Ative RBS nas bases de conteúdo do SharePoint.

    Execute o script abaixo no Powershell do SharePoint:
    $cdb = Get-SPContentDatabase <ContentDatabaseName>
    $rbss = $cdb.RemoteBlobStorageSettings
    $rbss.Installed()
    $rbss.Enable()
    $rbss.SetActiveProviderName($rbss.GetProviderNames()[0])
    $rbss


    O conteúdo existente pode ser migrado acrescendo a linha $rbs.Migrate().

    A configuração está funcional a partir desse momento - você pode salvar arquivos dentro do SharePoint e monitorar o crescimento imediato do tamanho da pasta configurada: No caso da minha configuração c:\Blobstore.







    Manutenção do RBS com Filestream


    Uma parte ainda não está funcional: Os BLOBs não são excluídos automaticamente do repositório do RBS quando o conteúdo correspondente é excluído do SharePoint. Um ciclo de coleta de lixo usando o Maintainer do RBS é necessário para limpar os BLOBs órfãos.
    Observação: O Maintainer não precisa ser executado no servidor SQL e pode ser executado a partir do qualquer servidor do SharePoint com o client instalado (Seção "Instalar o cliente RBS em todos os servidores Web do SharePoint" desse artigo).


    Configurar o Maintainer do RBS




    1. Verifique a configuração em vigor no arquivo da configuração da conexão com os seguintes comandos:
    cd C:\Program Files\Microsoft SQL Remote Blob Storage 11.0\Maintainer
    rename Microsoft.Data.SqlRemoteBlobs.Maintainer.exe.config web.config
    c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pdf connectionStrings .
    Você deve encontrar as mesmas configurações feitas na instalação do cliente:
    <connectionStrings>
    <add name="RBSMaintainerConnection" connectionString="Data Source=SQLSERVER;Initial Catalog=CONTENTDATABASE;Integrated Security=True;Application Name=&quot;Remote Blob Storage Maintainer&quot;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    2. Em seguida encripte a configuração da conexão novamente:
    c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pef connectionStrings . -prov DataProtectionConfigurationProvider
    rename web.config Microsoft.Data.SqlRemoteBlobs.Maintainer.exe.config
    3. Configure uma tarefa agendada para ser executada, por exemplo mensalmente, no servidor responsável pela manutenção do RBS com Filestream.
    Nas configurações da tarefa, na caixa Programa/script, navegue para o arquivo binário do Maintainer >C:\Program Files\Microsoft SQL Remote Blob Storage 11.0\Maintainer\Microsoft.Data.SqlRemoteBlobs.Maintainer.exe e insira na caixa de texto os seguintes parâmetros:
    <-ConnectionStringName RBSMaintainerConnection> <-Operation GarbageCollection ConsistencyCheck ConsistencyCheckForStores>
    <-GarbageCollectionPhases rdo>
    <-ConsistencyCheckMode r>
    <-TimeLimit 120>

    Verificação da limpeza dos órfãos
    A limpeza dos órfãos deve estar ativa após a configuração anterior e pode ser testada. Para isto precisamos estar ciente do ciclo de vida dos BLOBs, que é diferente dependendo do modo da recuperação da base de dados do conteúdo do SharePoint:
    No modo simples: Após a execução do Maintainer e um backup completo.
    No modo full: Após a execução do Maintainer e de dois backups dos logs e dois checkpoints manuais (backup, checkpoint, backup, checkpoint)

    Você poderá testar a limpeza apagando arquivos (inclusive do segundo estágio) com os seguintes passos:

    1. Altere o período da limpeza para 0 com a seguinte consulta:
    exec mssqlrbs.rbs_sp_set_config_value 'garbage_collection_time_window', 'time 00:00:00';
    exec mssqlrbs.rbs_sp_set_config_value 'delete_scan_period', 'time 00:00:00';
    exec mssqlrbs.rbs_sp_set_config_value 'orphan_scan_period', 'time 00:00:00';
    Observação: Execute a consulta abaixo para reverter essa configuração após os testes.
    exec mssqlrbs.rbs_sp_set_config_value 'garbage_collection_time_window', 'days 30';
    exec mssqlrbs.rbs_sp_set_config_value 'delete_scan_period', 'days 30';
    exec mssqlrbs.rbs_sp_set_config_value 'orphan_scan_period', 'days 30';
    2. Execute em seguida o seguinte comando no servidor responsável pela manutenção.
    "C:\Program Files\Microsoft SQL Remote Blob Storage 11.0\Maintainer\Microsoft.Data.SqlRemoteBlobs.Maintainer.exe" -ConnectionStringName RBSMaintainerConnection -Operation GarbageCollection ConsistencyCheck -GarbageCollectionPhases rdo -ConsistencyCheckMode r 
    O resultado deve ter essa aparência, importante nesse caso é a linha “Scanned 98 blobs. Deleted 98 blobs in the range of […]”
    Starting Maintainer tasks.
        Starting Garbage Collection.
            Starting Reference Scan.
                Reference Scan is complete for this database.
                Scanned 98 blobs. Deleted 98 blobs in the range of 0x000000000000000
    000000000(exclusive) to 0x000000000000006200000001(inclusive).
            This task has ended. Processed 1 work units total. 0 Work units were incomplete.
            Starting Delete Propagation.
                Starting Delete Propagation for pool <PoolId 1, BlobStoreId 1, Store PoolId 0x01000000>.
                    ..
                    This pool does not have to be deleted. Reason: PoolCanStoreNewBlobs.
                Delete Propagation complete for pool <PoolId 1, BlobStoreId 1, Store
    PoolId 0x01000000>.
                98 Delete for 98 blobs attempted, 98 blobs were deleted. 0 blobs were not found in the blob store. For more information, see the RBS Maintainer log.
                Delete Propagation is complete for this database.
            This task has ended. Processed 1 work units total. 0 Work units were incomplete. Needed to delete 98 blobs. Succeeded in deleting 98 blobs, 0 blobs were not found in the blob store.
            Starting Orphan Cleanup.
                Starting Orphan Cleanup for pool <PoolId 1, BlobStoreId 1, StorePool Id 0x01000000>.
                    .
                Enumerated 0 blobs, 0 blobs are being considered for orphan cleanup.
                    .
                Orphan Cleanup complete for pool <PoolId 1, BlobStoreId 1, StorePool Id 0x01000000>.
                0 Delete for 0 blobs attempted, 0 blobs were deleted. 0 blobs were not found in the blob store. For more information, see the RBS Maintainer log.
                Orphan Cleanup is complete for this database.
            This task has ended. Processed 1 work units total. 0 Work units were incomplete. Needed to delete 0 blobs. Succeeded in deleting 0 blobs, 0 blobs were not found in the blob store. Enumerated 0 blobs, 0 blobs are being considered for orphan cleanup.
        This task has ended.
        Starting RBS consistency check with attempt to repair.
            No RBS consistency issues found.
        Consistency check completed.
    This task has ended.
    3. Execute o(s) backup(s) necessários, conforme mencionado anteriormente.
     


    Backup e restaurar dados

    O backup e restaurar dados, tanto no servidor SQL como no SharePoint, continua a funcionar da mesma forma com algumas pequenas alterações:

    • SQL Filestream não suporta Snapshots, portanto não podemos utilizar o parâmetro -UseSqlSnapshot na execução do backup pelo comando Backup-SPSite.
    • É recomendável a utilização do comando Backup-SPSite e Restore-SPSite para trazer um site collection em um web application com Filestream habilitado para um outro web application ou uma outra farm, sem Filestream para evitar problemas.
    • No backup dos web applications vai ocorrer o seguinte evento no log: "Warning: [WSS_Content] A Remote Blob Storage provider is configured for this content database. To successfully recover your data on database restore, you may need to follow additional steps as indicated by your Remote Blob Storage provider." que pode ser desconsiderado nessa configuração.


    Fontes:

    Overview of RBS in SharePoint 2013
    https://technet.microsoft.com/en-us/library/ee748649.aspx

    Deciding to use RBS in SharePoint 2013
    https://technet.microsoft.com/en-us/library/ff628583.aspx

    Install and configure RBS with FILESTREAM in a SharePoint 2013 farm 
    https://technet.microsoft.com/en-us/library/ee748631.aspx

    Habilitar e configurar FILESTREAM
    https://msdn.microsoft.com/library/cc645923.aspx

    View, restore, or delete items in the Recycle Bin of a SharePoint site
    https://support.office.com/en-sg/article/View-restore-or-delete-items-in-the-Recycle-Bin-of-a-SharePoint-site-6df466b6-55f2-4898-8d6e-c0dff851a0be

    Maintaining Remote BLOB Store
    https://technet.microsoft.com/en-us/library/gg316773(v=sql.105).aspx

    ASP.NET IIS Registration Tool (Aspnet_regiis.exe)
    https://msdn.microsoft.com/en-us/library/k6h9cz8h(v=vs.140).aspx

    Whitepaper Armazenamento de Filestream
    http://download.microsoft.com/download/6/1/D/61D13F7E-76D9-4D0F-A1B9-39B66F47DDEB/FILESTREAMStorage.docx

    Database Checkpoints (SQL Server)
    https://msdn.microsoft.com/en-us/library/ms189573.aspx

    Software boundaries and limits for SharePoint 2013
    https://technet.microsoft.com/en-us/library/cc262787.aspx

    Restore content databases in SharePoint 2013
    https://technet.microsoft.com/en-us/library/ee748604.aspx

    Migrar conteúdo para e do RBS no SharePoint 2013

    https://technet.microsoft.com/pt-br/library/ff628254.aspx

    terça-feira, 2 de junho de 2015

    SharePoint: Boas práticas na implementação do protocolo HTTPS


    O planejamento de suporte de navegadores é importante na implementação do SharePoint, principalmente para páginas públicas. Uma parte importantíssima dessa implementação é a encriptação por meio de certificados digitais para garantir aos visitantes, usuários e clientes uma troca segura de informações, sem riscos dos dados trafegados serem interceptados ou alterados por terceiros.



    O SharePoint suporta atualmente, com algumas pequenas limitações, todos os navegadores principais como Chrome, Internet Explorer, Firefox, Safari e dispositivos móveis. Aparentemente todos os navegadores suportam a utilização do protocolo de comunicação HTTPS, porém existem particularidades no uso dos protocolos de encriptação. 




    O Firefox, por exemplo, suporta, mas não aceita por padrão os protocolos de encriptação SSL (1.0, 2.0 e 3.0) e TLS (1.0 e 1.1). O único protocolo de fato aceito pelo navegador é o TLS 1.2, conforme a seguinte imagem (Firefox na versão 38):



    Firefox: About:Config - TLS Fallback desabilitado


    O conhecimento desse detalhe é importante porque o TLS na versão 1.2 não é habilitado por padrão em todas as versões do servidor Windows e também existem proxies reversos que não suportam o TLS 1.2.




    A abertura das páginas com TLS 1.2 não habilitado ou não suportado na infraestrutura pelo Firefox gera a mensagem "Secure Connection Failed: The Connection to the server was reset while the page was loading". 



    "Secure Connection Failed: The Connection to the server was reset while the page was loading"



    Isto é uma situação complicada para uma página web, já que o Firefox é um dos navegadores mais populares:

    Fonte Wikipedia: Fatia de uso de navigadores.


    Veremos agora em detalhe o que acontece na negociação do protocolo de encriptação entre cliente e servidor.



    1.   O cliente encaminha um "CLIENT HELLO" para o servidor no IP e a porta obtidos durante o handshake:

    struct {
              ProtocolVersion client_version;
              Random random;
              SessionID session_id;
              CipherSuite cipher_suites<2..2^16-1>;
              CompressionMethod compression_methods<1..2^8-1>;
              Extension client_hello_extension_list<0..2^16-1>;
          } ClientHello;


    Um exemplo do "Client Hello", requisitando o 
    protocolo TLS 1.2, capturado pela ferramenta Fiddler:

    CONNECT URL:443 HTTP/1.1
    User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0
    Proxy-Connection: keep-alive
    Connection: keep-alive
    Host: URL:443

    A SSLv3-compatible ClientHello handshake was found. Fiddler extracted the parameters below.

    Version: 3.3 (TLS/1.2)
    Random: E8 DA B9 55 D0 3E 7D 3E 48 86 89 EA CF 59 3E AB 60 D3 B0 F4 E1 37 C4 50 D5 E7 69 56 7B 89 B4 CA
    "Time": 30/07/2015 05:06:00
    SessionID: empty
    Extensions:
                server_name            NAME
                renegotiation_info  00
                elliptic_curves          secp256r1 [0x17], secp384r1 [0x18], secp521r1 [0x19]
                ec_point_formats    uncompressed [0x0]
                SessionTicket          empty
                NextProtocolNego   empty
                ALPN             h2-16, h2-15, h2-14, h2, spdy/3.1, http/1.1
                status_request         OCSP - Implicit Responder
                signature_algs         sha256_rsa, sha384_rsa, sha1_rsa, sha256_ecdsa, sha384_ecdsa, sha1_ecdsa, sha256_dsa, sha1_dsa
    Ciphers:
                [C02B]           TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
                [C02F]            TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
                [C00A]           TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
                [C009]            TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
                [C013]            TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
                [C014]            TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
                [0033] TLS_DHE_RSA_WITH_AES_128_SHA
                [0039] TLS_DHE_RSA_WITH_AES_256_SHA
                [002F] TLS_RSA_AES_128_SHA
                [0035] TLS_RSA_AES_256_SHA
                [000A]            SSL_RSA_WITH_3DES_EDE_SHA

    2.   Vou considerar o IIS com a entidade SERVER para este cenário. Ao receber o "CLIENT HELLO", o servidor tem acesso às seguintes informações: 
    ·           Endereço IP
    ·           Número da porta (443)
    ·           A versão do protocolo solicitado, por exemplo TLS 1.2
    ·           A lista dos "Cipher Suites"
    ·           O ID da sessão etc.

    O servidor irá agora tentar determinar se há um ponto de extremidade (end point) com o IP e a porta. No caso do IIS o driver TCPIP.SYS move o pacote para a camada HTTP.SYS se a página solicitada existe.

    3.   O servidor responderá ao cliente com “SERVER HELLO” definido no protocolo mencionado no passo anterior (RFC 3546), se as informações recebidas forem corretas.

    struct {
              ProtocolVersion server_version;
              Random random;
              SessionID session_id;
              CipherSuite cipher_suite;
              CompressionMethod compression_method;
              Extension server_hello_extension_list<0..2^16-1>;

          } ServerHello;



    Os antecessores do TLS, SSL, não garantem mais a segurança prometida: A Google descobriu na última versão 3.0 do SSL a vulnerabilidade "Poodle" e partir desses fatos podemos derivar a boa prática de desabilitar todos os protocolos do SSL e a utilização do TLS como obrigação.

    Segue um script de exemplo para habilitar TLS 1.2 no servidor Windows na versão 2008 R2:

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2"
    md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server"
    md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client"
    new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "Enabled" -value 1 -PropertyType "DWord"
    new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "DisabledByDefault" -value 0 -PropertyType "DWord"
    new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "Enabled" -value 1 -PropertyType "DWord"
    new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "DisabledByDefault" -value 0 -PropertyType "DWord"

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    A empresa Qualys oferece um serviço online gratuito para avaliar a página:


    Fontes:

    Transport Layer Security

    Support for SSL/TLS protocols on Windows

    Cipher Suites in Schannel

    Cipher suite

    Como restringir o uso de determinados algoritmos criptográficos e protocolos no Schannel.dll

    TLS/SSL support history of web browsers

    Web Browser