giovedì 12 aprile 2018

Creare un elenco telefonico Sharepoint (lista) con l'elenco degli utenti attivi in Active Directory ed Aggiornarlo automaticamente

Buongiorno a tutti,
 scrivo qui un nuovo script che mi ha tenuto avvinto un po'...

Il requisito è:
  1. Creare una lista (elenco) in Sharepoint che possa essere usata come rubrica dai dipendenti, nella quale inserire il numero di telefono e determinate altre proprietà dell'utente AD.
  2. Quando un nuovo utente viene creato, nell'arco di 24 ore l'elenco si aggiorna.
  3. Quando un utente viene eliminato o spostato in un'altra OU (fuori da quelle in cui intendiamo cercare) in Active Directory, deve essere altresì rimosso dalla lista.

Dati sulle versioni da me utilizzate:

  • Sharepoint 2010
  • Windows server 2008 R2
  • Active Directory Functional level: 2008 R2


Ecco lo script completo in un'unica soluzione, poi lo commentiamo:

##########################################################

#Add SharePoint
Add-PSSnapin Microsoft.SharePoint.PowerShell -EA SilentlyContinue
import-module activedirectory

#Variabili di Dove andare.
$webURL = "http:////"
$listName = "RubricaInterna"

#web = oggetto SP
$web = Get-SPWeb $webURL

#list = la lista.
$list = $web.Lists[$listName]


function UpdateUsersList{
param(
[parameter(Mandatory=$true)]
[System.Collections.ArrayList]$SearchBaseOUs
)
# ottengo tutti i personaggi.
$foundO=New-Object System.Collections.ArrayList
#itero su tutte le OU scelte...
foreach($SearchBaseOU in $SearchBaseOUs){
    $coll += get-aduser -Filter * -SearchBase $SearchBaseOU -Properties Department,EmailAddress,MobilePhone,telephoneNumber,sn,GivenName,SamAccountName,Description,physicalDeliveryOfficeName,Fax,info
}# chiudo la foreach delle baseOU

# ottengo tutti gli items in una lista
$items = $list.items
#itero su tutti gli utenti, se esiste l'utente allora faccio l'UPDATE, altrimenti faccio l'insert.
foreach($usr in $coll)
{

#itero su tutti gli elementi
$Titolo=$usr.SamAccountName.ToString()

# conversione delle proprietà

if ($usr.GivenName -ne $null) { $Nome=$usr.GivenName.ToString() } else {
     $Nome="" }
if ($usr.sn -ne $null) { $Cognome=$usr.sn.ToString() } else {
     $Cognome="" }
if ($usr.telephoneNumber -ne $null) { $Telefono=$usr.telephoneNumber.ToString() } else {
     $Telefono="" }
if ($usr.MobilePhone -ne $null) { $Cellulare=$usr.MobilePhone.ToString() } else {
     $Cellulare="" }
if ($usr.EmailAddress -ne $null) { $Email=$usr.EmailAddress.ToString() } else {
     $Email="" }
if ($usr.Description -ne $null) { $Descrizione=$usr.Description.ToString() } else {
     $Descrizione="" }
if ($usr.physicalDeliveryOfficeName -ne $null) { $Divisione=$usr.physicalDeliveryOfficeName.ToString() } else {
     $Divisione="" }
if ($usr.Fax -ne $null) { $Fax=$usr.Fax.ToString() } else {
     $Fax="" }
if ($usr.info -ne $null) { $MailUfficio=$usr.info.ToString() } else {
     $MailUfficio="" }
write-host "lavorando "$Cognome
foreach($item in $items)
{
#if ($item["Title"] -ne $null) { $ogg=$item["Title"].ToString() } else { $ogg="" }
# if ($item["Nome"] -ne $null) { $nomeO=$item["Nome"].ToString() } else { $nomeO="" }
# if ($item["Cognome"] -ne $null) { $cognomeO=$item["Cognome"].ToString() } else { $cognomeO="" }
if ($item["Email"] -ne $null) { $EmailO=$item["Email"].ToString() } else { $EmailO="" }

#se il title è uguale al SamAccountName dell'utente, allora update e segnatelo nella array degli oggetti trovati ed aggiornati..
# if($ogg -eq $uname)
# if(($nomeO -eq $Nome) -and ($cognomeO -eq $Cognome))
if($EmailO -eq $Email)
{
$foundO.Add($Email)
<# #>
$item["Title"]=$Titolo
$item["Nome"]=$Nome
$item["Cognome"]=$Cognome
$item["Telefono"]=$Telefono
$item["Cellulare"]=$Cellulare
$item["Email"]=$email
$item["Descrizione"]=$Descrizione
$item["Divisione"]=$Divisione
$item["Fax"]=$Fax
$item["Email Ufficio"]=$MailUfficio
$item.Update()
#>
write-host $Nome" "$Cognome" Aggiornato"
}


}# chiudo la foreach degli elementi


# elimino le variabili dell'oggetto AD, preparandomi per il prossimo ciclo.
# remove-variable -Name Titolo
remove-variable -Name Nome
remove-variable -Name Cognome
remove-variable -Name Telefono
remove-variable -Name Cellulare
remove-variable -Name email
remove-variable -Name Descrizione
remove-variable -Name Divisione
remove-variable -Name Fax
remove-variable -Name MailUfficio
}# chiudo la foreach degli utenti

# $foundO | sort-object

# SEcondo loop su $coll, per aggiungere i non trovati
$nontrovati = $coll | where { ($foundO -notcontains $_.EmailAddress) -and ($_.SamAccountName -ne $null) }
if($nontrovati -ne $null){

foreach($usr in $nontrovati)
{

# proprietà
$Titolo=$usr.SamAccountName.ToString()
if($usr.SamAccountName -ne $null){

if ($usr.GivenName -ne $null) { $Nome=$usr.GivenName.ToString() } else {
     $Nome="" }
if ($usr.sn -ne $null) { $Cognome=$usr.sn.ToString() } else {
     $Cognome="" }
if ($usr.telephoneNumber -ne $null) { $Telefono=$usr.telephoneNumber.ToString() } else {
     $Telefono="" }
if ($usr.MobilePhone -ne $null) { $Cellulare=$usr.MobilePhone.ToString() } else {
     $Cellulare="" }
if ($usr.EmailAddress -ne $null) { $Email=$usr.EmailAddress.ToString() } else {
     $Email="" }
if ($usr.Description -ne $null) { $Descrizione=$usr.Description.ToString() } else {
     $Descrizione="" }
if ($usr.physicalDeliveryOfficeName -ne $null) { $Divisione=$usr.physicalDeliveryOfficeName.ToString() } else {
     $Divisione="" }
if ($usr.Fax -ne $null) { $Fax=$usr.Fax.ToString() } else {
     $Fax="" }
if ($usr.info -ne $null) { $MailUfficio=$usr.info.ToString() } else {
     $MailUfficio="" }
<# #>
$newItem = $list.Items.Add()
$newItem["Title"]=$Titolo
$newItem["Nome"]=$Nome
$newItem["Cognome"]=$Cognome
$newItem["Telefono"]=$Telefono
$newItem["Cellulare"]=$Cellulare
$newItem["Email"]=$email
$newItem["Descrizione"]=$Descrizione
$newItem["Divisione"]=$Divisione
$newItem["Fax"]=$Fax
$newItem["Email Ufficio"]=$MailUfficio
$newItem.Update()
#>
    write-host $Nome" "$Cognome" Creato"
# remove-variable -Name Titolo
remove-variable -Name Nome
remove-variable -Name Cognome
remove-variable -Name Telefono
remove-variable -Name Cellulare
remove-variable -Name email
remove-variable -Name Descrizione
remove-variable -Name Divisione
remove-variable -Name Fax
remove-variable -Name MailUfficio

} #fine if samAccount not null
} # Fine foreach Usr

} # fine if non trovati non null

#TERZO loop, per rimuovere Quelli presenti nella lista ma non più presenti in AD.
$coll3 =New-Object System.Collections.ArrayList
foreach ($a in $coll) {
    $coll3.Add($a.SamAccountName.ToString())
}
#Qui purtroppo non funziona bene perchè mi da un errore : An error occurred while enumerating through a collection: Collection was modified; enumeration operation may not execute
# Allora faccio loop su una nuova lista “coll4” e seleziono un elemento per volta, mettendo anche un delay.
$coll4 = New-Object System.Collections.ArrayList

$web.Lists["RubricaInterna"].items | Where {$coll3 -notcontains $_.Title} | foreach {
$coll4.Add($_.Title)
}
foreach($colItem in $coll4){
# IN QUESTO MODO seleziona sempre una entry per volta e poi fa l'UPDATE.
$web.Lists["RubricaInterna"].items | Where {$_.Title -eq $colItem} | Foreach { $_.Delete()}
$web.Lists["RubricaInterna"].Update()
start-sleep 3000
}

}# fine function

$OUs=New-Object System.Collections.ArrayList
$OUs.Add("OU=Personale,OU=Utenti,OU=VERONA,DC=,DC=local")
$OUs.Add("OU=Personale,OU=Utenti,OU=BOLZANO,DC=,DC=local")
$OUs.Add("OU=Personale,OU=Utenti,OU=AGENTI,DC=,DC=local")


UpdateUsersList($OUs)

##########################################################