quarta-feira, 27 de junho de 2012

Exemplo de script Power Shell para o SharePoint 2010

Finalizei hoje um projeto muito interessante, para equipe de RH de uma empresa, este projeto é uma avaliação de desempenho 108 graus, ou seja um subordinado faz a sua auto avaliação e a avaliação de seu superior imediato, e o superior imediato avalia seus subordinados.
Este cliente já estava com o SharePoint implementado e integrado com a base de dados dos funcionário, isso fez possível a realização do projeto.

Para desenvolver a solução precisei procurar muito, e em diversos sites e blogs, por isso quero compartilhar o resultado deste projeto com a comunidades técnica.

Problema:
Precisava criar itens de lista para alguns usuários que já estavam no userproflies do SharePoint 2010, estes usuários já estavam agrupados em audiências. Além disso precisava criar itens com informações diferentes para os perfils de lideres e subordinados.

Solução:

Ao criar um item na "lista pai" que eu chamei de campanha, inicia a execução de um workflow e executa um script powershell via custom action. para tal instalei o IloveSharepoint do codeplex que possibilita a execução de linhas de código powershel como diversas outras ações muito úteis. Após a execução do código é criado itens na lista chamada Avaliação. Sendo que para cada usuário é criado um registro para auto avaliação, outro para avaliação do superior imediato, e caso este usuário tenha subordinados criasse também as avaliações dos subordinados, já liberando permissões no site para os usuários dependendo do perfil de cada usuário, criei dois grupos, colaboradores e líderes. Ou seja esse projeto se se tornou realidade pois a hierarquia da empresa estava bem definido e atualizado.

Utilizei outros workflows de apoio para controlar as permissões dos registros.

A action Execute PowerShell Script, disponibiliza a entrada de até 5 variáveis, que você pode utilizar dentro do script powershell. no meu caso parametrizei os endereços das listas nas quais estou criando os registros, os nomes das audiências que foram selecionadas na criação da Campanha.

O código abaixo que explicarei com mais detalhes, cria itens em uma lista, obtem usuários de uma audiência,  cadastra os usuários nos grupos do sharepoint.

As variáveis var1 e var2 armazenam o endereço completo das listas.
A variável site já é disponibilizada pelo action, ou seja não é necessário informar o endereço do site atual.
É muito importante entender como funciona o custom action da solução IloveSharePoint, lendo a documentação disponível no codeplex.


$spListAvaliacao = $web.GetList($var1)
$spListPDI = $web.GetList($var2)

try {
    $context = [Microsoft.SharePoint.SPServiceContext]::GetContext($site)
    $ProfileManager = new-object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
    $auManager= new-object Microsoft.Office.Server.Audience.AudienceManager($Context)
    $splitAudiencias = $var5.split("#;")

    for ($i=2; $i -le $splitAudiencias.Length -1; $i = $i+4) {
  $aud = $auManager.GetAudience($splitAudiencias[$i])
        if($aud){

   $Profiles = $aud.GetMembership()

   foreach($user in $Profiles){

    try{
     $profile = $ProfileManager.GetUserProfile($user.NTName)

     $Profiles2 = $ProfileManager.GetUserProfile($profile["AccountName"].Value).GetDirectReports()
     $EhGerente = "False"
     
     foreach ($profile2 in $Profiles2){
      if ($EhGerente -eq "False"){
       $EhGerente = "True"                  
       #Cadastra usuario no grupo do sharepoint
       $grupoLideres = $web.SiteGroups["Lideres"]
       if($profile["Manager"].Value){$grupoLideres.AddUser($profile["Manager"].Value,"","","") }

       #Cadastra a auto avaliação do líder
       $spListItemAvaliacao = $spListAvaliacao.AddItem()
       $tipoAvaliacao = "Auto avaliação lider"
       $RelatoriotipoAvaliacao = "Auto avaliação"
       $spListItemAvaliacao["Avaliado"] = $web.EnsureUser($profile["AccountName"].Value)
       $spListItemAvaliacao["NomeAvaliado"] = $profile["UserName"].Value
       $spListItemAvaliacao["Avaliador"] =$web.EnsureUser($profile["AccountName"].Value)
       $spListItemAvaliacao["StatusPadrao"] ="Não Iniciado"
       $spListItemAvaliacao["TipoAvaliacao"] = $tipoAvaliacao
       $spListItemAvaliacao["RelatorioTpAvaliacao"] = $RelatoriotipoAvaliacao
       $spListItemAvaliacao["Campanha"] = $var3
       $spListItemAvaliacao["Area"] = $profile["Department"].Value
       if ($profile["Manager"].Value){ $spListItemAvaliacao["SuperiorImediato"] = $web.EnsureUser($profile["Manager"].Value)      }
       $spListItemAvaliacao.Update()
  
       if ($profile["Manager"].Value){
        #cria avaliação para os subordiando - lideres
        $spListItemAvaliacao = $spListAvaliacao.AddItem()
        $tipoAvaliacao = "Avaliação do subordinado - líder"
        $RelatoriotipoAvaliacao = "Avaliação feita pelo superior"
        $spListItemAvaliacao = $spListAvaliacao.AddItem()                 
        $spListItemAvaliacao["Avaliado"] = $web.EnsureUser($profile["AccountName"].Value)
        $spListItemAvaliacao["Avaliador"] =$web.EnsureUser($profile["Manager"].Value)
        $spListItemAvaliacao["StatusPadrao"] ="Não Iniciado"
        $spListItemAvaliacao["NomeAvaliado"] = $profile["UserName"].Value
        $spListItemAvaliacao["TipoAvaliacao"] = $tipoAvaliacao
        $spListItemAvaliacao["RelatorioTpAvaliacao"] = $RelatoriotipoAvaliacao
        $spListItemAvaliacao["Campanha"] = $var3
        $spListItemAvaliacao["Area"] = $profile["Department"].Value
        $spListItemAvaliacao["SuperiorImediato"] = $web.EnsureUser($profile["Manager"].Value)
        $spListItemAvaliacao.Update()
   
        #Cria os itens do PDI dos subordinados
        $spListPDIItem = $spListPDI.AddItem()
        $spListPDIItem["Title"] = "PDI"
        $spListPDIItem["Colaborador"] = $web.EnsureUser($profile["AccountName"].Value)
        $spListPDIItem["Gestor"] = $web.EnsureUser($profile["Manager"].Value)
        $spListPDIItem["CampanhaAvaliacao"] = $var3
        $spListPDIItem["StatusPadrao"] = "Não Iniciado"
        $spListPDIItem["Area"] = $profile["Department"].Value
        $spListPDIItem["Cargo"] = $profile["Title"].Value
        $spListPDIItem.Update()  
       }
      }   
     }
      
     if ($EhGerente -eq "False") {
      #Cadastra usuario no grupo do sharepoint
      $grupoLideres = $web.SiteGroups["Colaboradores"]
      $grupoLideres.AddUser($profile["AccountName"].Value,"","","")
      if ($profile["Manager"].Value) {  $grupoLideres.AddUser($profile["Manager"].Value,"","","") }

      #Cadastra as auto avaliações
      $tipoAvaliacao = "Auto avaliação colaborador"
      $RelatoriotipoAvaliacao = "Auto avaliação"
      $spListItemAvaliacao = $spListAvaliacao.AddItem()
      $spListItemAvaliacao["Avaliado"] = $web.EnsureUser($profile["AccountName"].Value)
      $spListItemAvaliacao["Avaliador"] =$web.EnsureUser($profile["AccountName"].Value)
      $spListItemAvaliacao["NomeAvaliado"] = $profile["UserName"].Value
      $spListItemAvaliacao["StatusPadrao"] ="Não Iniciado"
      $spListItemAvaliacao["TipoAvaliacao"] =$tipoAvaliacao
      $spListItemAvaliacao["RelatorioTpAvaliacao"] = $RelatoriotipoAvaliacao
      $spListItemAvaliacao["Campanha"] = $var3
      $spListItemAvaliacao["Area"] = $profile["Department"].Value
      if ($profile["Manager"].Value) { $spListItemAvaliacao["SuperiorImediato"] = $web.EnsureUser($profile["Manager"].Value) }
      $spListItemAvaliacao.Update()

      #cria avaliação para os subordiando - colaboradores
      $spListItemAvaliacao = $spListAvaliacao.AddItem()
      $tipoAvaliacao = "Avaliação do subordinado - colaborador"
      $RelatoriotipoAvaliacao = "Avaliação feita pelo superior"
      $spListItemAvaliacao = $spListAvaliacao.AddItem()                 
      $spListItemAvaliacao["Avaliado"] = $web.EnsureUser($profile["AccountName"].Value)
      $spListItemAvaliacao["NomeAvaliado"] = $profile["UserName"].Value
      if ($profile["Manager"].Value) {$spListItemAvaliacao["Avaliador"] =$web.EnsureUser($profile["Manager"].Value)}
      $spListItemAvaliacao["StatusPadrao"] ="Não Iniciado"
      $spListItemAvaliacao["TipoAvaliacao"] = $tipoAvaliacao
      $spListItemAvaliacao["RelatorioTpAvaliacao"] = $RelatoriotipoAvaliacao
      $spListItemAvaliacao["Campanha"] = $var3
      $spListItemAvaliacao["Area"] = $profile["Department"].Value
      if ($profile["Manager"].Value) { $spListItemAvaliacao["SuperiorImediato"] = $web.EnsureUser($profile["Manager"].Value)      }

      $spListItemAvaliacao.Update()
      #Cria os itens do PDI dos subordinados
      $spListPDIItem = $spListPDI.AddItem()
      $spListPDIItem["Title"] = "PDI"
      $spListPDIItem["Colaborador"] = $web.EnsureUser($profile["AccountName"].Value)
      $spListPDIItem["Gestor"] = $web.EnsureUser($profile["Manager"].Value)
      $spListPDIItem["CampanhaAvaliacao"] = $var3
      $spListPDIItem["StatusPadrao"] = "Não Iniciado"
      $spListPDIItem["Area"] = $profile["Department"].Value
      $spListPDIItem["Cargo"] = $profile["Title"].Value
      $spListPDIItem.Update()  

     }
     if ($profile["Manager"].Value){

      #cria avaliação para os superior imediato
      $tipoAvaliacao = "Avaliação do superior imediato"
      $RelatoriotipoAvaliacao = "Avaliação feita pelo subordinado"
      $spListItemAvaliacao = $spListAvaliacao.AddItem()
      $spListItemAvaliacao["Avaliado"] = $web.EnsureUser($profile["Manager"].Value)
      $spListItemAvaliacao["NomeAvaliado"] = $profile["Manager"].Value
      $spListItemAvaliacao["Avaliador"] =$web.EnsureUser($profile["AccountName"].Value)
      $spListItemAvaliacao["StatusPadrao"] ="Não Iniciado"
      $spListItemAvaliacao["TipoAvaliacao"] = $tipoAvaliacao
      $spListItemAvaliacao["RelatorioTpAvaliacao"] = $RelatoriotipoAvaliacao
      $spListItemAvaliacao["Campanha"] = $var3
      $spListItemAvaliacao["Area"] = $profile["Department"].Value
      $spListItemAvaliacao["SuperiorImediato"] = $web.EnsureUser($profile["Manager"].Value)    
      $spListItemAvaliacao.Update()                 
     }
    }
    Catch
    {
    }
   }
  }
 }
 }
 finally
 {
     if ($site -ne $null)
     {
         $site.Dispose
     }
 }



Nenhum comentário:

Postar um comentário