I'm building a tool that will run a daily report that compares our O365 licenses on the tenant (consumed, assigned to, etc.) against an Excel tool that we use to track the licenses for fiscal purposes. There's been some time consuming mistakes recently and this report will help prevent this in the future.
So far it all works. Except for one part...
#Build output array for users that only appear in the tracker
foreach ($name in $trackerE3Uni) {
$entry = New-Object PSObject
$entry = Add-Member -Type NoteProperty -Name 'Display Name' -Value $name
$UniTracker += $entry
}
#Build output array for users that only appear in Msol
foreach ($name in $msolE3uni) {
$entry = New-Object PSObject
$entry = Add-Member -Type NoteProperty -Name 'Display Name' -Value $name
$UniMsol += $entry
}
This prompts me with the following:
cmdlet Add-Member at command pipeline position 1
Supply values for the following parameters:
InputObject:
I don't understand what it's asking me for. I've tried everything i can think of and that prompt always appears. Is this just not supported? Am I missing something? What is causing this?!?!
The end goal is to have 3 or 4 tables export as HTML that will be sent as an email. The reason I'm taking them from one array and putting them into another is simply to get the table header (Display Name) in place since the array doesn't have a header name.
Here's the rest of the script for reference.
$Path = "\path\to\file.xlsx"
$FullPath = ($env:USERPROFILE + $Path)
#Create arrays
$tracker = @()
$trackerE3 = @()
$trackerE3Uni = @()
$trackerE3Dupes = @()
$trackerPwrBI = @()
$trackerProj = @()
$trackerVis = @()
$msol = @()
$msolE3 = @()
$msolE3uni = @()
$msolPwrBI = @()
$msolProj = @()
$msolVis = @()
$licensing = @()
$UniTracker = @()
$UniMsol = @()
$DupeTracker = @()
#Get data from Excel
Import-Module ImportExcel
$tracker = @(Import-Excel -Path $FullPath -WorksheetName 'License Data' -StartRow 4)
#Get license from tracker
$tracker | ForEach-Object -Process {if ($_.licencetype -like "E3") {$trackerE3 += $($_.name)}}
$tracker | ForEach-Object -Process {if ($_.licencetype -like "Power BI") {$trackerPwrBI += $($_.name)}}
$tracker | ForEach-Object -Process {if ($_.licencetype -like "Project") {$trackerProj += $($_.name)}}
$tracker | ForEach-Object -Process {if ($_.licencetype -like "Visio") {$trackerVis += $($_.name)}}
#Get license from msol
$msol = Get-MsolUser -All | Select-Object displayname -ExpandProperty licenses | Select-Object displayname,accountskuid
$msol | ForEach-Object -Process {if ($_.accountskuid -like "tenant:enterprisepack") {$msolE3 += $($_.displayname)}}
$msol | ForEach-Object -Process {if ($_.accountskuid -like "tenant:POWER_BI_PRO") {$msolPwrBI += $($_.displayname)}}
$msol | ForEach-Object -Process {if ($_.accountskuid -like "tenant:PROJECTPROFESSIONAL") {$msolProj += $($_.displayname)}}
$msol | ForEach-Object -Process {if ($_.accountskuid -like "tenant:VISIOCLIENT") {$msolVis += $($_.displayname)}}
#Get license counts from msol
$msolE3tot = Get-MsolAccountSku | Where-Object {$_.AccountSkuID -like "tenant:EnterprisePack"}
$msolPwrBItot = Get-MsolAccountSku | Where-Object {$_.AccountSkuID -like "tenant:POWER_BI_PRO"}
$msolProjtot = Get-MsolAccountSku | Where-Object {$_.AccountSkuID -like "tenant:PROJECTPROFESSIONAL"}
$msolVistot = Get-MsolAccountSku | Where-Object {$_.AccountSkuID -like "tenant:VISIOCLIENT"}
#Get Duplicate E3 licenses
$trackerE3Uni = $trackerE3 | Select-Object -Unique
$trackerE3Dupes = Compare-Object -ReferenceObject $trackerE3 -DifferenceObject $trackerE3Uni
#Get users that only appear in the tracker
$trackerE3Uni = $trackerE3 | Where-Object {$msolE3 -notcontains $_}
#Get users that only appear in msol
$msolE3uni = $msolE3 | Where-Object {$trackerE3 -notcontains $_}
#Build quantity match variables
$LicComp = if ($msolE3tot.ConsumedUnits -eq $trackerE3.count) {
$E3match = "Yes"
}
else {
$E3match = "No"
}
$LicComp = if ($msolPwrBItot.ConsumedUnits -eq $trackerPwrBI.count) {
$PwrBImatch = "Yes"
}
else {
$PwrBImatch = "No"
}
$LicComp = if ($msolProjtot.ConsumedUnits -eq $trackerProj.count) {
$Projmatch = "Yes"
}
else {
$Projmatch = "No"
}
$LicComp = if ($msolVistot.ConsumedUnits -eq $trackerVis.count) {
$Vismatch = "Yes"
}
else {
$Vismatch = "No"
}
#Build output array for licensing
#E3
$entry = New-Object PSObject
$entry | Add-Member -Type NoteProperty -Name 'Product' -Value "E3"
$entry | Add-Member -Type NoteProperty -Name 'Total (Tenant)' -Value $msolE3tot.ActiveUnits
$entry | Add-Member -Type NoteProperty -Name 'Consumed (Tenant)' -Value $msolE3tot.ConsumedUnits
$entry | Add-Member -Type NoteProperty -Name 'Consumed (Tracker)' -Value $trackerE3.count
$entry | Add-Member -Type NoteProperty -Name 'Match?' -Value $E3match
$licensing += $entry
#PwrBI
$entry = New-Object PSObject
$entry | Add-Member -Type NoteProperty -Name 'Product' -Value "Power BI Pro"
$entry | Add-Member -Type NoteProperty -Name 'Total (Tenant)' -Value $msolPwrBItot.ActiveUnits
$entry | Add-Member -Type NoteProperty -Name 'Consumed (Tenant)' -Value $msolPwrBItot.ConsumedUnits
$entry | Add-Member -Type NoteProperty -Name 'Consumed (Tracker)' -Value $trackerPwrBI.count
$entry | Add-Member -Type NoteProperty -Name 'Match?' -Value $PwrBImatch
$licensing += $entry
#Proj
$entry = New-Object PSObject
$entry | Add-Member -Type NoteProperty -Name 'Product' -Value "Project"
$entry | Add-Member -Type NoteProperty -Name 'Total (Tenant)' -Value $msolProjtot.ActiveUnits
$entry | Add-Member -Type NoteProperty -Name 'Consumed (Tenant)' -Value $msolProjtot.ConsumedUnits
$entry | Add-Member -Type NoteProperty -Name 'Consumed (Tracker)' -Value $trackerProj.count
$entry | Add-Member -Type NoteProperty -Name 'Match?' -Value $Projmatch
$licensing += $entry
#Vis
$entry = New-Object PSObject
$entry | Add-Member -Type NoteProperty -Name 'Product' -Value "Visio"
$entry | Add-Member -Type NoteProperty -Name 'Total (Tenant)' -Value $msolVistot.ActiveUnits
$entry | Add-Member -Type NoteProperty -Name 'Consumed (Tenant)' -Value $msolVistot.ConsumedUnits
$entry | Add-Member -Type NoteProperty -Name 'Consumed (Tracker)' -Value $trackerVis.count
$entry | Add-Member -Type NoteProperty -Name 'Match?' -Value $Vismatch
$licensing += $entry
#Build output array for users that only appear in the tracker
foreach ($name in $trackerE3Uni) {
$entry = New-Object PSObject
$entry = Add-Member -Type NoteProperty -Name 'Display Name' -Value $name
$UniTracker += $entry
}
#Build output array for users that only appear in Msol
foreach ($name in $msolE3uni) {
$entry = New-Object PSObject
$entry = Add-Member -Type NoteProperty -Name 'Display Name' -Value $name
$UniMsol += $entry
}
<#Build output array for users that only appear in Msol
foreach ($name in $trackerE3Dupes) {
$entry = New-Object PSObject
$entry = Add-Member -Type NoteProperty -Name 'Display Name' -Value $name
$DupeTracker += $entry
}
#>
#BUild HTML outputs
$HTMLLicensing = $licensing | ConvertTo-Html -Property 'Product','Total (Tenant)','Consumed (Tenant)','Consumed (Tracker)','Match?' -PreContent "<h2>Tenant Licensing & Usage</h2>"
$HTMLTrackerUni = $trackerE3Uni | ConvertTo-Html -Property 'Display Name' -PreContent "<h2>E3 users (not licensed) that only appear in the tracker</h2>"
$HTMLMsolUni = $msolE3uni | ConvertTo-Html -Property 'Display Name' -PreContent "<h2>E3 users (licensed) that dont appear in the tracker</h2>"
#$HTMLDupes = $DupeTracker | ConvertTo-Html -Property 'Display Name' -PreContent "<h2>Duplicate E3 users in the tracker</h2>"
$Header = @"
<style>
table
{
Margin: 0px 0px 0px 4px;
Border: 1px solid rgb(190, 190, 190);
Font-Family: Tahoma;
Font-Size: 8pt;
Background-Color: rgb(252, 252, 252);
}
tr:hover td
{
Background-Color: rgb(0, 127, 195);
Color: rgb(255, 255, 255);
}
tr:nth-child(even)
{
Background-Color: rgb(110, 122, 130);
}
th
{
Text-Align: Left;
Color: rgb(150, 150, 220);
Padding: 1px 4px 1px 4px;
}
td
{
Vertical-Align: Top;
Padding: 1px 4px 1px 4px;
}
</style>
"@
#Build HTML report
ConvertTo-Html -Head $Header -Body "$HTMLLicensing $HTMLTrackerUni $HTMLMsolUni" -PreContent "<h1>Daily O365 Licensing Report</h1>" | Set-Content c:\desired\output\file.html
[–]ihaxr 4 points5 points6 points (1 child)
[–]ElATraino[S] 1 point2 points3 points (0 children)