Office365: Listar licencias asignadas VS usuarios deshabilitados

Cada vez es mas común externalizar servicios como el correo o el lync a la nube (Office 365) y Microsoft ofrece un portal web https://login.microsoftonline.com/ para gestionar las licencias contratadas a tus usuarios.
Pero tambien ofrece la posibilidad de hacerlo por comandos con powershell:
import-module msonline
$LiveCred=get-credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $LiveCred -Authentication Basic -AllowRedirection
Import-PSSession $Session
connect-msolservice -credential $LiveCred
get-msoluser -all|?{$_.islicensed -eq $true}
Remove-PSSession $Session
Aqui se echa en falta mas información de la cuenta que tiene asignada la licencia, asi que porque no consultar para cada resultado los atributos que nos puedan interesar de nuestro directorio activo y asi tener un reporte mas completo? En mi caso tenemos un dominio con varios subdominios asi que consulto a un global catalog (GC://) en lugar del habitual LDAP://.
Function get-ADuser($UPN)
{
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = New-Object ADSI("GC://dc=dominio,dc=local")
$objSearcher.Filter = "(&(objectcategory=person)(objectClass=user)(userprincipalname=$UPN))"
$Result1=$objSearcher.findone()
 if ($Result1 -ne $NULL){$objuser=$Result1.GetDirectoryEntry()}
 else{$objuser=$null}
return $objuser
}
##main##
Try{import-module msonline -ErrorAction Stop} 
Catch{Write-Warning $_;Break}

#cargo las credenciales para conectar con Office365
$credfile=".\$($env:username).cred"
if (!(test-path -path $credfile)){$creds=get-credential
 $creds.GetNetworkCredential().username|out-file $credfile
 $creds.GetNetworkCredential().Password|ConvertTo-SecureString -AsPlainText -Force|convertfrom-securestring|out-file $credfile -append
 }
$storedcreds = get-content ($credfile)
$username=$storedcreds[0]
$password = ConvertTo-SecureString $storedcreds[1]
$LiveCred = New-Object System.Management.Automation.PSCredential ($username, $password)
#conecto con Office365
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $LiveCred -Authentication Basic -AllowRedirection
Import-PSSession $Session
connect-msolservice -credential $LiveCred
out-file ".\Office365Licenses.csv" -input "userprincipalname displayname usagelocation lync2 lync3 exch domain samaccountname company estado whenChanged"
get-msoluser -all|?{$_.islicensed -eq $true}|%{
$estado=$domain=$lync2=$lync3=$exch=$samaccountname=$company=$whenChanged=$dn=$domain=$null
 foreach ($license in $_.licenses.servicestatus.serviceplan.servicename)
 {
  switch ($license)
  {
  "MCOSTANDARD"{$lync2="SI";break}
  "MCOVOICECONF"{$lync3="SI";break}
  "EXCHANGE_S_STANDARD"{$exch="SI"}
  } 
 }
$objuser=get-ADuser $_.userprincipalname
 if ($objuser -ne $null)
 {
 $samaccountname=$objuser.samaccountname
 $company=$objuser.company
 $dn=[string]$objuser.distinguishedname
 $domain=$dn.substring($dn.indexof("DC=")) 
 $whenChanged=get-date($objuser.whenChanged.tostring()) -uformat "%d/%m/%Y"
 if ((2 -band [string]$objuser.userAccountControl) -ne "0"){$estado="DISABLED"}else{$estado="ENABLED"}
 }
write-host "." -nonewline
out-file ".\Office365Licenses.csv" -input "$($_.userprincipalname) $($_.displayname) $($_.usagelocation) $lync2 $lync3 $exch $domain $samaccountname $company $estado $whenChanged" -append
}#fin de listado msolusers
Remove-PSSession $Session

Comentarios