quinta-feira, 10 de abril de 2008

Sharepoint User Profile

Quando vamos criar um projeto com autenticação forms no MOSS sempre nos vem a pergunta, Onde vamos guardar as informações dos usuários? Em lista, em Banco, no próprio membership onde?
A resposta para essa pergunta é n.d.a =]
O jeito correto de guardar usuários é o User Profile, com ele é possível administrar usuários em um lugar único, ou seja, várias web app podem compartilhar os mesmos usuários.
O User Profile já vem com diversos campos por default e também possibilita a criação de novos campos tanto via interface, quanto via Object Model. O namespace responsável por manipular o User Profile é Microsoft.Office.Server.UserProfiles.

Criando usuários:
try{
using (SPSite spSite = new SPSite(@"http://localhost")){
ServerContext siteContext = ServerContext.GetContext(spSite);
UserProfileManager pmManager = new UserProfileManager(siteContext);
Console.WriteLine("Number of users: " + pmManager.Count);
string strUserName = "macanudocorporation\\admin";
UserProfile newUser = null;
if (!pmManager.UserExists(strUserName))
{
newUser = pmManager.CreateUserProfile(strUserName);
}
}
}catch (Exception exp){
Console.WriteLine(exp.Message);
}

Editando Usuários

try{
using (SPSite spSite = new SPSite(@"http://localhost")){
ServerContext siteContext = ServerContext.GetContext(spSite);
UserProfileManager pmManager = new UserProfileManager(siteContext);
Console.WriteLine("Number of users: " + pmManager.Count);
string strUserName = "macanudocorporation\\admin";
UserProfile newUser = null;
if (!pmManager.UserExists(strUserName))
{
user = pmManager.GetUserProfile(strUserName);
}
}
}catch (Exception exp){
Console.WriteLine(exp.Message);
}


Deletando usuários

try{
using (SPSite spSite = new SPSite(@"http://localhost"))
{
ServerContext siteContext = ServerContext.GetContext(spSite);
UserProfileManager pmManager = new UserProfileManager(siteContext);
Console.WriteLine("Number of users: " + pmManager.Count);
string strUserName = "macanudocorporation\\admin";
if (pmManager.UserExists(strUserName))
{
pmManager.RemoveUserProfile(strUserName);
}
}
}catch (Exception exp){
Console.WriteLine(exp.Message);
}

Por hora é isso!


Abraços,
Maca

quinta-feira, 13 de março de 2008

CALLSTACK, CUSTOMERRORS & DEBUG MODE

Olá Amigos,

Hoje vou postar uma importante dica =]
Encontrei essa pérola no blog[1] do Hélio Sá Moreira.

As vezes (rs) obtemos mensagens de erro nada informativas ou claras durante a utilização (ou tentativa de utilização) de alguns recursos do Sharepoint. Um caso clássico, que obtive em um ambiente que trabalhei esta semana, foi: Unknown Error Occurred OU An unspecified error has occured.

Para desativa-las temos que executar o seguinte procedimento =]

São basicamente 3 itens de configuração - que podem ser utilizados em conjunto ou separadamente para um processo de troubleshoot detalhado.

01 - CUSTOMERRORS

Essa configuração - que por padrão apresenta o valor "ON" - redireciona o tratamento de erros para um módulo de tratamento de erros do Sharepoint. Este módulo é muito importante, mas quando o mesmo não consegue classificar o erro as mensagens 'genéricas' são apresentadas.

Para desabilitar este redirecionamento - retornando ao modelo padrão do ASP.Net 2.0 - podemos mudar o valor desta configuração para "OFF".

No Web.Config, essa configuração pode ser encontrada no seguinte path: Configuration \ System.web \ CustomErrors.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
...
<system.web>
...
<customerrors mode="On">
...

Com isso, voltamos as telas de erro do ASP.Net! Vale lembrar que esta configuração deve ser realizada somente no processo de verificação de um erro - e o seu valor padrão deve ser re-configurado para que mensagens informativas aos usuários possam ser apresentadas de uma forma gerenciável e "não-agressiva"!

Esta mudança já deve ajudar bastante na identificação das possíveis razões do problema ....


02 - CALLSTACK

Esta configuração é relacionada ao nível de informações e detalhes apresentados sob o erro quando o mesmo ocorre. Voltando ao cenário de troubleshoot, quando mais informações relacionadas ao problema melhor - incluindo inclusive todos os métodos envolvidos e a hierarquia de execução! ;-)

Por padrão esta configuração possui o valor "FALSE" - e pode ser encontrada na seguinte estrutura: Configuration \ SharePoint \ SafeMode. Para habilitar este modo, devemos configurar o CallStack com o valor "TRUE".


<configuration>
...
<sharepoint>
<safemode callstack="false">
...

Esta configuração é relacionada ao nível de informações e detalhes apresentados sob o erro quando o mesmo ocorre. Voltando ao cenário.


02 - DEBUG MODE

Este item esta relacionado ao modelo de compilação utilizado pelo .Net Framework 2.0 (JIT - Just-in-time compilation). O valor padrão para o DEBUG é false. Mas, em um cenário de Troubleshoot o DEBUG="TRUE" aumenta o nível de detalhamento das informações repassadas ao Stack Trace e consequentemente aumenta as informações repassadas às nossas telas de erro!

Este item pode ser encontrado na seguinte estrutura: Configuration \ System.Web \ Compilation.



<configuration>
...
<system.web>
...
<compilation debug="false" batch="false">
...

Abraços,
Maca

blog
[1] http://www.sharepointbrasil.net/default.aspx

sexta-feira, 22 de fevereiro de 2008

Listar Arquivos da Lixeira (AdminRecycleBin e RecycleBin)

Olá Amigos,

Nos últimos dias me reparei com o seguinte problema, como fazer um relatório de páginas excluída de uma biblioteca de páginas Wiki.
Após refletir um pouco sobre o assunto, me veio o estalo, Ler da Lixeira do site.

Como fazer isso?

Dentro do SPSite e SPWeb existe uma propriedade RecycleBin, esta propriedade retorna uma collection (SPRecycleBinItemCollection) com os itens (SPRecycleBinItem) da lixeira os itens.
Após saber disso, acabaram-se as dificuldades. Só precisei fazer um foreach e verificar a propriedade ” DirName” está prorpriedade do SPRecycleBinItem contém o nome do local original do arquivo excluído.

Importante:

O SPSite.RecycleBin guarda a lixeira do site collection, está lixeira tem todos os arquivos excluídos no site collection independente do usuário.

O SPWeb.RecycleBin guarda a lixeira do site atual e lista apenas os arquivos excluídos pelo usuário do contexto.

Code:

SPSite site = SPContext.Current.Site;
foreach (SPRecycleBinItem itemGarbage in site.RecycleBin)
{
if (itemGarbage.DirName == "Paginas Wiki")
{
Response.Write(itemGarbage.Title);
Response.Write(itemGarbage.DeletedDate.ToString("dd/MM/yyyy"));
Response.Write(itemGarbage.DeletedBy);
}
}

Abraços,
Maca

quinta-feira, 6 de dezembro de 2007

Filtrar dados de uma lista através de CAML

Olá Amigos,

Ando meio sem tempo para postar, hoje vou fazer um breve post sobre como filtrar dados de uma lista.

Como diria Mauro Sant'Anna "Nem tudo que pode ser inventado deve ser inventado. Um grande exemplo é o CAML" :)

Ao invés de utilizarmos consultas SQL para filtrarmos listas, a Microsoft criou uma linguagem chamada CAML. O CAML é um xml para expressar queries de bancos de dados.

Se você quiser aprender mais sobre CAML, verifique o link abaixo. Ele fornece uma introdução sobre o assunto.

http://msdn2.microsoft.com/en-us/library/ms948028.aspx

Bem, chega de conversa =] Vamos a um pequeno exemplo :)

Problema:
Criar uma webPart, que lê um parametro passado pela QueryString e filtra a lista por este parametro.

//Abrindo a web
SPWeb web = SPContext.Current.Web;

//Criado o CAML
//Note que ele faz uma comparação entre o ID passado pela queryString e a coluna ID da lista
SPQuery q = new SPQuery();
q.Query = "" + Convert.ToString("0" + Page.Request.QueryString["ID"]) + "";

//Carrega em itens uma colletion com os itens (tuplas) da lista task.
SPListItemCollection itens = web.Lists["Tasks"].GetItems(q);

Era isso =]

Abraços,
Leonardo

quarta-feira, 7 de novembro de 2007

Configurar email no Sharepoint

Olá Amigos,

Hoje vou dar uma de administrador e mostrar como configurar email no sharepoint =]

É uma operação bastante simples, não requer prática nem habilidade.

Basta executar uma linha de comando.

stsadm.exe -o email -outsmtpserver -fromaddress -replytoaddress -codepage [-url ]

Por exemplo, vamos utilizar o servidor de smtp "SMTPServer", e vamos utilizar a conta de email someone@example.com como from e a mesma conta como reply-to.
O código fica como no exemplo abaixo:

stsadm.exe -o email -outsmtpserver SMTPServer -fromaddress someone@example.com -replytoaddress someone@example.com -codepage 65001 -url http://server_name

Note que no último parametro configurei a url que vai utilizar esta confiuração de envio de email =]

Como os amigos podem ver é bem mumuzinho =]

Abraços,
Leonardo

quarta-feira, 10 de outubro de 2007

Passeio pelo Object Modelo Sharepoint - Part II

Olá Amigos,

Hoje vou dar continuidade aos posts sobre o Object Model do Sharepoint.

Hoje vou falar sobre uma classe estremamente útil e importante no desenvolvimento sharepoint (SPSite).

SPSite

Através desse classe podemos acessar o nível de Site Colletion.
Uma Site Colletion é uma coleção de sites (SPWeb)
Cada objeto SPSite possui várias propriedades da coleção, tais como o responsável, conteúdo corrente do BD, a url do web site.

SPSite mySiteColl = new SPSite("site_collection_URL");
String siteCollOwner = mySiteColl.Owner.Name;
String contentDB = mySiteColl.ContentDatabase.Name;
String topLevelSite = mySiteCollection.RootWeb.Title;

Importante: Existem várias maneiras de acessar uma site collection, a maneira citada acima deve ser utilizada quando estamos em uma aplicação fora do contexto do sharepoint. Se tivermos em uma webPart dentro do contexto do Sharepoint o código acima deveria ficar assim:

SPSite mySiteColl = SPContext.Current.Site;
String siteCollOwner = mySiteColl.Owner.Name;
String contentDB = mySiteColl.ContentDatabase.Name;
String topLevelSite = mySiteCollection.RootWeb.Title;

segunda-feira, 8 de outubro de 2007

Passeio pelo Object Modelo Sharepoint - Part I

Olá Amigos,

Apartir de hoje escreverei uma serie de posts sobre o Object Model do sharepoint.
Mas afinal, oque é object model?
É a Arquitetura de programação do WSS, através dele conseguimos programaticamente manipular totalmente a estrutura do sharepoint.

SPFarm

Está no topo da hierarquia do object model.
Cada objeto SPFarm tem uma coleção de servidores associados a ele representados pelo objeto SPServerCollection object.
Você pode usar uma estrutura de repetição para iterar em cada servidor através do objeto SPServerCollection.

SPFarm myFarm = SPFarm.Local;
SPServerCollection myServerCollection = myFarm.Servers;
foreach (SPServer myServer in myServerCollection){
    //adiciona o código para executar a ação
}

SPWebApplication

Representa um IIS load-balanced Web application.
No WSS, aplicações web são representadas pela classe SPWebApplication.
Cada objeto SPWebApplication tem uma coleção de coleções de site associadas a ele e que são representados pelo objeto SPSiteCollection.
Você pode usar uma estrutura de repetição para interar com cada coleção de site no objeto SPSiteCollection.
Coleções de site individuais são representadas pelos objetos SPSite.

SPSite mySiteCollection =   new SPSite("site_collection_URL");
SPWebApplication myWebApp = mySiteCollection.WebApplication; SPSiteCollection mySiteCollections =  myWebApp.Sites;
foreach (SPSite siteCollection in mySiteCollections){
    //executa a ação na coleção de sites
}

Por hora é isso =]

Abraços,
Leonardo