1371 lines
51 KiB
PowerShell
1371 lines
51 KiB
PowerShell
<#
|
|
.NOTES
|
|
===========================================================================
|
|
Version: 1.0.5
|
|
Updated on: 8/14/2018
|
|
Created by: /u/TheLazyAdministrator
|
|
Contributors: /u/ascIVV, /u/jmn_lab, /u/nothingpersonalbro
|
|
===========================================================================
|
|
|
|
AzureAD Module is required
|
|
Install-Module -Name AzureAD
|
|
https://www.powershellgallery.com/packages/azuread/
|
|
ReportHTML Moduile is required
|
|
Install-Module -Name ReportHTML
|
|
https://www.powershellgallery.com/packages/ReportHTML/
|
|
|
|
UPDATES
|
|
1.0.5
|
|
/u/ascIVV: Added the following:
|
|
- Admin Tab
|
|
- Privileged Role Administrators
|
|
- Exchange Administrators
|
|
- User Account Administrators
|
|
- Tech Account Restricted Exchange Admin Role
|
|
- SharePoint Administrators
|
|
- Skype Administrators
|
|
- CRM Service Administrators
|
|
- Power BI Administrators
|
|
- Service Support Administrators
|
|
- Billing Administrators
|
|
/u/TheLazyAdministrator
|
|
- Cleaned up formatting
|
|
- Error Handling for $Null obj
|
|
- Console status
|
|
- Windows Defender ATP SKU
|
|
|
|
|
|
.DESCRIPTION
|
|
Generate an interactive HTML report on your Office 365 tenant. Report on Users, Tenant information, Groups, Policies, Contacts, Mail Users, Licenses and more!
|
|
|
|
.Link
|
|
Original: http://thelazyadministrator.com/2018/06/22/create-an-interactive-html-report-for-office-365-with-powershell/
|
|
#>
|
|
#########################################
|
|
# #
|
|
# VARIABLES #
|
|
# #
|
|
#########################################
|
|
|
|
#Company logo that will be displayed on the left, can be URL or UNC
|
|
$CompanyLogo = "http://thelazyadministrator.com/wp-content/uploads/2018/06/logo-2-e1529684959389.png"
|
|
|
|
#Logo that will be on the right side, UNC or URL
|
|
$RightLogo = "http://thelazyadministrator.com/wp-content/uploads/2018/06/amd.png"
|
|
|
|
#Location the report will be saved to
|
|
$ReportSavePath = "C:\Lab\"
|
|
|
|
#Variable to filter licenses out, in current state will only get licenses with a count less than 9,000 this will help filter free/trial licenses
|
|
$LicenseFilter = "9000"
|
|
|
|
########################################
|
|
|
|
$creduser = Read-Host "Admin email"
|
|
$credpassword = Read-Host "Admin Password"
|
|
|
|
[securestring]$secStringPassword = ConvertTo-SecureString $credpassword -AsPlainText -Force
|
|
[pscredential]$credObject = New-Object System.Management.Automation.PSCredential ($creduser, $secStringPassword)
|
|
|
|
Connect-ExchangeOnline -Credential $credObject
|
|
Connect-AzureAD -Credential $credObject
|
|
Connect-MsolService -Credential $credObject
|
|
|
|
|
|
$Table = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$LicenseTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$UserTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$SharedMailboxTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$GroupTypetable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$IsLicensedUsersTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$ContactTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$MailUser = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$ContactMailUserTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$RoomTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$EquipTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$GlobalAdminTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$ExchangeAdminTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$PrivAdminTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$UserAdminTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$TechExchAdminTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$SharePointAdminTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$SkypeAdminTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$CRMAdminTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$PowerBIAdminTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$ServiceAdminTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$BillingAdminTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$StrongPasswordTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$CompanyInfoTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$DomainTable = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
|
|
$Sku = @{
|
|
"O365_BUSINESS_ESSENTIALS" = "Office 365 Business Essentials"
|
|
"O365_BUSINESS_PREMIUM" = "Office 365 Business Premium"
|
|
"DESKLESSPACK" = "Office 365 (Plan K1)"
|
|
"DESKLESSWOFFPACK" = "Office 365 (Plan K2)"
|
|
"LITEPACK" = "Office 365 (Plan P1)"
|
|
"EXCHANGESTANDARD" = "Office 365 Exchange Online Only"
|
|
"STANDARDPACK" = "Enterprise Plan E1"
|
|
"STANDARDWOFFPACK" = "Office 365 (Plan E2)"
|
|
"ENTERPRISEPACK" = "Enterprise Plan E3"
|
|
"ENTERPRISEPACKLRG" = "Enterprise Plan E3"
|
|
"ENTERPRISEWITHSCAL" = "Enterprise Plan E4"
|
|
"STANDARDPACK_STUDENT" = "Office 365 (Plan A1) for Students"
|
|
"STANDARDWOFFPACKPACK_STUDENT" = "Office 365 (Plan A2) for Students"
|
|
"ENTERPRISEPACK_STUDENT" = "Office 365 (Plan A3) for Students"
|
|
"ENTERPRISEWITHSCAL_STUDENT" = "Office 365 (Plan A4) for Students"
|
|
"STANDARDPACK_FACULTY" = "Office 365 (Plan A1) for Faculty"
|
|
"STANDARDWOFFPACKPACK_FACULTY" = "Office 365 (Plan A2) for Faculty"
|
|
"ENTERPRISEPACK_FACULTY" = "Office 365 (Plan A3) for Faculty"
|
|
"ENTERPRISEWITHSCAL_FACULTY" = "Office 365 (Plan A4) for Faculty"
|
|
"ENTERPRISEPACK_B_PILOT" = "Office 365 (Enterprise Preview)"
|
|
"STANDARD_B_PILOT" = "Office 365 (Small Business Preview)"
|
|
"VISIOCLIENT" = "Visio Pro Online"
|
|
"POWER_BI_ADDON" = "Office 365 Power BI Addon"
|
|
"POWER_BI_INDIVIDUAL_USE" = "Power BI Individual User"
|
|
"POWER_BI_STANDALONE" = "Power BI Stand Alone"
|
|
"POWER_BI_STANDARD" = "Power-BI Standard"
|
|
"PROJECTESSENTIALS" = "Project Lite"
|
|
"PROJECTCLIENT" = "Project Professional"
|
|
"PROJECTONLINE_PLAN_1" = "Project Online"
|
|
"PROJECTONLINE_PLAN_2" = "Project Online and PRO"
|
|
"ProjectPremium" = "Project Online Premium"
|
|
"ECAL_SERVICES" = "ECAL"
|
|
"EMS" = "Enterprise Mobility Suite"
|
|
"RIGHTSMANAGEMENT_ADHOC" = "Windows Azure Rights Management"
|
|
"MCOMEETADV" = "PSTN conferencing"
|
|
"SHAREPOINTSTORAGE" = "SharePoint storage"
|
|
"PLANNERSTANDALONE" = "Planner Standalone"
|
|
"CRMIUR" = "CMRIUR"
|
|
"BI_AZURE_P1" = "Power BI Reporting and Analytics"
|
|
"INTUNE_A" = "Windows Intune Plan A"
|
|
"PROJECTWORKMANAGEMENT" = "Office 365 Planner Preview"
|
|
"ATP_ENTERPRISE" = "Exchange Online Advanced Threat Protection"
|
|
"EQUIVIO_ANALYTICS" = "Office 365 Advanced eDiscovery"
|
|
"AAD_BASIC" = "Azure Active Directory Basic"
|
|
"RMS_S_ENTERPRISE" = "Azure Active Directory Rights Management"
|
|
"AAD_PREMIUM" = "Azure Active Directory Premium"
|
|
"MFA_PREMIUM" = "Azure Multi-Factor Authentication"
|
|
"STANDARDPACK_GOV" = "Microsoft Office 365 (Plan G1) for Government"
|
|
"STANDARDWOFFPACK_GOV" = "Microsoft Office 365 (Plan G2) for Government"
|
|
"ENTERPRISEPACK_GOV" = "Microsoft Office 365 (Plan G3) for Government"
|
|
"ENTERPRISEWITHSCAL_GOV" = "Microsoft Office 365 (Plan G4) for Government"
|
|
"DESKLESSPACK_GOV" = "Microsoft Office 365 (Plan K1) for Government"
|
|
"ESKLESSWOFFPACK_GOV" = "Microsoft Office 365 (Plan K2) for Government"
|
|
"EXCHANGESTANDARD_GOV" = "Microsoft Office 365 Exchange Online (Plan 1) only for Government"
|
|
"EXCHANGEENTERPRISE_GOV" = "Microsoft Office 365 Exchange Online (Plan 2) only for Government"
|
|
"SHAREPOINTDESKLESS_GOV" = "SharePoint Online Kiosk"
|
|
"EXCHANGE_S_DESKLESS_GOV" = "Exchange Kiosk"
|
|
"RMS_S_ENTERPRISE_GOV" = "Windows Azure Active Directory Rights Management"
|
|
"OFFICESUBSCRIPTION_GOV" = "Office ProPlus"
|
|
"MCOSTANDARD_GOV" = "Lync Plan 2G"
|
|
"SHAREPOINTWAC_GOV" = "Office Online for Government"
|
|
"SHAREPOINTENTERPRISE_GOV" = "SharePoint Plan 2G"
|
|
"EXCHANGE_S_ENTERPRISE_GOV" = "Exchange Plan 2G"
|
|
"EXCHANGE_S_ARCHIVE_ADDON_GOV" = "Exchange Online Archiving"
|
|
"EXCHANGE_S_DESKLESS" = "Exchange Online Kiosk"
|
|
"SHAREPOINTDESKLESS" = "SharePoint Online Kiosk"
|
|
"SHAREPOINTWAC" = "Office Online"
|
|
"YAMMER_ENTERPRISE" = "Yammer for the Starship Enterprise"
|
|
"EXCHANGE_L_STANDARD" = "Exchange Online (Plan 1)"
|
|
"MCOLITE" = "Lync Online (Plan 1)"
|
|
"SHAREPOINTLITE" = "SharePoint Online (Plan 1)"
|
|
"OFFICE_PRO_PLUS_SUBSCRIPTION_SMBIZ" = "Office ProPlus"
|
|
"EXCHANGE_S_STANDARD_MIDMARKET" = "Exchange Online (Plan 1)"
|
|
"MCOSTANDARD_MIDMARKET" = "Lync Online (Plan 1)"
|
|
"SHAREPOINTENTERPRISE_MIDMARKET" = "SharePoint Online (Plan 1)"
|
|
"OFFICESUBSCRIPTION" = "Office ProPlus"
|
|
"YAMMER_MIDSIZE" = "Yammer"
|
|
"DYN365_ENTERPRISE_PLAN1" = "Dynamics 365 Customer Engagement Plan Enterprise Edition"
|
|
"ENTERPRISEPREMIUM_NOPSTNCONF" = "Enterprise E5 (without Audio Conferencing)"
|
|
"ENTERPRISEPREMIUM" = "Enterprise E5 (with Audio Conferencing)"
|
|
"MCOSTANDARD" = "Skype for Business Online Standalone Plan 2"
|
|
"PROJECT_MADEIRA_PREVIEW_IW_SKU" = "Dynamics 365 for Financials for IWs"
|
|
"STANDARDWOFFPACK_IW_STUDENT" = "Office 365 Education for Students"
|
|
"STANDARDWOFFPACK_IW_FACULTY" = "Office 365 Education for Faculty"
|
|
"EOP_ENTERPRISE_FACULTY" = "Exchange Online Protection for Faculty"
|
|
"EXCHANGESTANDARD_STUDENT" = "Exchange Online (Plan 1) for Students"
|
|
"OFFICESUBSCRIPTION_STUDENT" = "Office ProPlus Student Benefit"
|
|
"STANDARDWOFFPACK_FACULTY" = "Office 365 Education E1 for Faculty"
|
|
"STANDARDWOFFPACK_STUDENT" = "Microsoft Office 365 (Plan A2) for Students"
|
|
"DYN365_FINANCIALS_BUSINESS_SKU" = "Dynamics 365 for Financials Business Edition"
|
|
"DYN365_FINANCIALS_TEAM_MEMBERS_SKU" = "Dynamics 365 for Team Members Business Edition"
|
|
"FLOW_FREE" = "Microsoft Flow Free"
|
|
"POWER_BI_PRO" = "Power BI Pro"
|
|
"O365_BUSINESS" = "Office 365 Business"
|
|
"DYN365_ENTERPRISE_SALES" = "Dynamics Office 365 Enterprise Sales"
|
|
"RIGHTSMANAGEMENT" = "Rights Management"
|
|
"PROJECTPROFESSIONAL" = "Project Professional"
|
|
"VISIOONLINE_PLAN1" = "Visio Online Plan 1"
|
|
"EXCHANGEENTERPRISE" = "Exchange Online Plan 2"
|
|
"DYN365_ENTERPRISE_P1_IW" = "Dynamics 365 P1 Trial for Information Workers"
|
|
"DYN365_ENTERPRISE_TEAM_MEMBERS" = "Dynamics 365 For Team Members Enterprise Edition"
|
|
"CRMSTANDARD" = "Microsoft Dynamics CRM Online Professional"
|
|
"EXCHANGEARCHIVE_ADDON" = "Exchange Online Archiving For Exchange Online"
|
|
"EXCHANGEDESKLESS" = "Exchange Online Kiosk"
|
|
"SPZA_IW" = "App Connect"
|
|
"WINDOWS_STORE" = "Windows Store for Business"
|
|
"MCOEV" = "Microsoft Phone System"
|
|
"VIDEO_INTEROP" = "Polycom Skype Meeting Video Interop for Skype for Business"
|
|
"SPE_E5" = "Microsoft 365 E5"
|
|
"SPE_E3" = "Microsoft 365 E3"
|
|
"ATA" = "Advanced Threat Analytics"
|
|
"MCOPSTN2" = "Domestic and International Calling Plan"
|
|
"FLOW_P1" = "Microsoft Flow Plan 1"
|
|
"FLOW_P2" = "Microsoft Flow Plan 2"
|
|
"WIN_DEF_ATP" = "Windows Defender ATP"
|
|
}
|
|
# Get all users right away. Instead of doing several lookups, we will use this object to look up all the information needed.
|
|
$AllUsers = get-azureaduser -All:$true -ErrorAction SilentlyContinue
|
|
|
|
Write-Host "Gathering Company Information..." -ForegroundColor Yellow
|
|
#Company Information
|
|
$CompanyInfo = Get-AzureADTenantDetail -ErrorAction SilentlyContinue
|
|
|
|
$CompanyName = $CompanyInfo.DisplayName
|
|
$TechEmail = $CompanyInfo.TechnicalNotificationMails | Out-String
|
|
$DirSync = $CompanyInfo.DirSyncEnabled
|
|
$LastDirSync = $CompanyInfo.CompanyLastDirSyncTime
|
|
|
|
|
|
If ($DirSync -eq $Null) {
|
|
$LastDirSync = "Not Available"
|
|
$DirSync = "Disabled"
|
|
}
|
|
If ($PasswordSync -eq $Null) {
|
|
$LastPasswordSync = "Not Available"
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $CompanyName
|
|
'Technical E-mail' = $TechEmail
|
|
'Directory Sync' = $DirSync
|
|
'Last Directory Sync' = $LastDirSync
|
|
}
|
|
|
|
$CompanyInfoTable.add($obj)
|
|
|
|
Write-Host "Gathering Admin Roles and Members..." -ForegroundColor Yellow
|
|
|
|
Write-Host "Getting Tenant Global Admins" -ForegroundColor white
|
|
#Get Tenant Global Admins
|
|
$role = Get-AzureADDirectoryRole | Where-Object { $_.DisplayName -match "Global Administrator" } -ErrorAction SilentlyContinue
|
|
If ($null -ne $role) {
|
|
$Admins = Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -ne "CloudConsoleGrapApi" }
|
|
Foreach ($Admin in $Admins) {
|
|
|
|
$MFAS = ((Get-MsolUser -objectid $Admin.ObjectID -ErrorAction SilentlyContinue).StrongAuthenticationRequirements).State
|
|
|
|
if ($Null -ne $MFAS) {
|
|
$MFASTATUS = "Enabled"
|
|
}
|
|
else {
|
|
$MFASTATUS = "Disabled"
|
|
}
|
|
|
|
$Name = $Admin.DisplayName
|
|
$EmailAddress = $Admin.Mail
|
|
if (($admin.assignedlicenses.SkuID) -ne $Null) {
|
|
$Licensed = $True
|
|
}
|
|
else {
|
|
$Licensed = $False
|
|
}
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'MFA Status' = $MFAStatus
|
|
'Is Licensed' = $Licensed
|
|
'E-Mail Address' = $EmailAddress
|
|
}
|
|
|
|
$GlobalAdminTable.add($obj)
|
|
}
|
|
}
|
|
If (($GlobalAdminTable).count -eq 0) {
|
|
$GlobalAdminTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users were found with Global Administrator found'
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Write-Host "Getting Tenant Exchange Admins" -ForegroundColor white
|
|
#Get Tenant Exchange Admins
|
|
$exchrole = Get-AzureADDirectoryRole | Where-Object { $_.DisplayName -match "Exchange Service Administrator" } -ErrorAction SilentlyContinue
|
|
If ($Null -ne $exchrole) {
|
|
$ExchAdmins = Get-AzureADDirectoryRoleMember -ObjectId $exchrole.ObjectId -ErrorAction SilentlyContinue
|
|
Foreach ($ExchAdmin in $ExchAdmins) {
|
|
$MFAS = ((Get-MsolUser -objectid $ExchAdmin.ObjectID -ErrorAction SilentlyContinue).StrongAuthenticationRequirements).State
|
|
|
|
if ($Null -ne $MFAS) {
|
|
$MFASTATUS = "Enabled"
|
|
}
|
|
else {
|
|
$MFASTATUS = "Disabled"
|
|
}
|
|
$Name = $ExchAdmin.DisplayName
|
|
$EmailAddress = $ExchAdmin.Mail
|
|
if (($Exchadmin.assignedlicenses.SkuID) -ne $Null) {
|
|
$Licensed = $True
|
|
}
|
|
else {
|
|
$Licensed = $False
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'MFA Status' = $MFAStatus
|
|
'Is Licensed' = $Licensed
|
|
'E-Mail Address' = $EmailAddress
|
|
}
|
|
|
|
$ExchangeAdminTable.add($obj)
|
|
|
|
}
|
|
}
|
|
If (($ExchangeAdminTable).count -eq 0) {
|
|
$ExchangeAdminTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users with the Exchange Administrator role were found, refer to the Global Administrators list.'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Tenant Privileged Admins" -ForegroundColor white
|
|
#Get Tenant Privileged Admins
|
|
$privadminrole = Get-AzureADDirectoryRole | Where-Object { $_.DisplayName -match "Privileged Role Administrator" } -ErrorAction SilentlyContinue
|
|
If ($Null -ne $privadminrole) {
|
|
$PrivAdmins = Get-AzureADDirectoryRoleMember -ObjectId $privadminrole.ObjectId -ErrorAction SilentlyContinue -ErrorVariable SilentlyContinue
|
|
Foreach ($PrivAdmin in $PrivAdmins) {
|
|
$MFAS = ((Get-MsolUser -objectid $PrivAdmin.ObjectID -ErrorAction SilentlyContinue).StrongAuthenticationRequirements).State
|
|
|
|
if ($Null -ne $MFAS) {
|
|
$MFASTATUS = "Enabled"
|
|
}
|
|
else {
|
|
$MFASTATUS = "Disabled"
|
|
}
|
|
|
|
$Name = $PrivAdmin.DisplayName
|
|
$EmailAddress = $PrivAdmin.Mail
|
|
if (($admin.assignedlicenses.SkuID) -ne $Null) {
|
|
$Licensed = $True
|
|
}
|
|
else {
|
|
$Licensed = $False
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'MFA Status' = $MFAStatus
|
|
'Is Licensed' = $Licensed
|
|
'E-Mail Address' = $EmailAddress
|
|
}
|
|
|
|
$PrivAdminTable.add($obj)
|
|
|
|
}
|
|
}
|
|
If (($PrivAdminTable).count -eq 0) {
|
|
$PrivAdminTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users with the Privileged Administrator role were found, refer to the Global Administrators list.'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Tenant User Account Admins" -ForegroundColor white
|
|
#Get Tenant User Account Admins
|
|
$userrole = Get-AzureADDirectoryRole | Where-Object { $_.DisplayName -match "User Account Administrator" } -ErrorAction SilentlyContinue
|
|
If ($Null -ne $userrole) {
|
|
$userAdmins = Get-AzureADDirectoryRoleMember -ObjectId $userrole.ObjectId -ErrorAction SilentlyContinue
|
|
Foreach ($userAdmin in $userAdmins) {
|
|
$MFAS = ((Get-MsolUser -objectid $userAdmin.ObjectID -ErrorAction SilentlyContinue).StrongAuthenticationRequirements).State
|
|
|
|
if ($Null -ne $MFAS) {
|
|
$MFASTATUS = "Enabled"
|
|
}
|
|
else {
|
|
$MFASTATUS = "Disabled"
|
|
}
|
|
$Name = $userAdmin.DisplayName
|
|
$EmailAddress = $userAdmin.Mail
|
|
if (($useradmin.assignedlicenses.SkuID) -ne $Null) {
|
|
$Licensed = $True
|
|
}
|
|
else {
|
|
$Licensed = $False
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'MFA Status' = $MFAStatus
|
|
'Is Licensed' = $Licensed
|
|
'E-Mail Address' = $EmailAddress
|
|
}
|
|
|
|
$UserAdminTable.add($obj)
|
|
|
|
}
|
|
}
|
|
If (($UserAdminTable).count -eq 0) {
|
|
$UserAdminTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users with the User Account Administrator role were found, refer to the Global Administrators list.'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Helpdesk Admins" -ForegroundColor white
|
|
#Get Tenant Tech Account Exchange Admins
|
|
$helprole = Get-AzureADDirectoryRole | Where-Object { $_.DisplayName -match "Helpdesk Administrator" } -ErrorAction SilentlyContinue
|
|
If ($Null -ne $helprole) {
|
|
$HelpAdmins = Get-AzureADDirectoryRoleMember -ObjectId $helprole.ObjectId -ErrorAction SilentlyContinue
|
|
Foreach ($helpAdmin in $HelpAdmins) {
|
|
$MFAS = ((Get-MsolUser -objectid $helpAdmin.ObjectID -ErrorAction SilentlyContinue).StrongAuthenticationRequirements).State
|
|
|
|
if ($Null -ne $MFAS) {
|
|
$MFASTATUS = "Enabled"
|
|
}
|
|
else {
|
|
$MFASTATUS = "Disabled"
|
|
}
|
|
$Name = $helpAdmin.DisplayName
|
|
$EmailAddress = $helpAdmin.Mail
|
|
if (($helpAdmin.assignedlicenses.SkuID) -ne $Null) {
|
|
$Licensed = $True
|
|
}
|
|
else {
|
|
$Licensed = $False
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'MFA Status' = $MFAStatus
|
|
'Is Licensed' = $Licensed
|
|
'E-Mail Address' = $EmailAddress
|
|
}
|
|
|
|
$TechExchAdminTable.add($obj)
|
|
|
|
}
|
|
}
|
|
If (($TechExchAdminTable).count -eq 0) {
|
|
$TechExchAdminTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users with the Helpdesk Administrator role were found, refer to the Global Administrators list.'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Tenant SharePoint Admins" -ForegroundColor white
|
|
#Get Tenant SharePoint Admins
|
|
$sprole = Get-AzureADDirectoryRole | Where-Object { $_.DisplayName -match "SharePoint Service Administrator" } -ErrorAction SilentlyContinue
|
|
If ($Null -ne $sprole) {
|
|
$SPAdmins = Get-AzureADDirectoryRoleMember -ObjectId $sprole.ObjectId -ErrorAction SilentlyContinue
|
|
Foreach ($SPAdmin in $SPAdmins) {
|
|
$MFAS = ((Get-MsolUser -objectid $SPAdmin.ObjectID -ErrorAction SilentlyContinue).StrongAuthenticationRequirements).State
|
|
|
|
if ($Null -ne $MFAS) {
|
|
$MFASTATUS = "Enabled"
|
|
}
|
|
else {
|
|
$MFASTATUS = "Disabled"
|
|
}
|
|
$Name = $SPAdmin.DisplayName
|
|
$EmailAddress = $SPAdmin.Mail
|
|
if (($SPadmin.assignedlicenses.SkuID) -ne $Null) {
|
|
$Licensed = $True
|
|
}
|
|
else {
|
|
$Licensed = $False
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'MFA Status' = $MFAStatus
|
|
'Is Licensed' = $Licensed
|
|
'E-Mail Address' = $EmailAddress
|
|
}
|
|
|
|
$SharePointAdminTable.add($obj)
|
|
|
|
}
|
|
}
|
|
If (($SharePointAdminTable).count -eq 0) {
|
|
$SharePointAdminTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users with the SharePoint Service Administrator role were found, refer to the Global Administrators list.'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Tenant Skype Admins" -ForegroundColor white
|
|
#Get Tenant Skype Admins
|
|
$skyperole = Get-AzureADDirectoryRole | Where-Object { $_.DisplayName -match "Lync Service Administrator" } -ErrorAction SilentlyContinue
|
|
If ($Null -ne $skyperole) {
|
|
$skypeAdmins = Get-AzureADDirectoryRoleMember -ObjectId $skyperole.ObjectId -ErrorAction SilentlyContinue
|
|
Foreach ($skypeAdmin in $skypeAdmins) {
|
|
$MFAS = ((Get-MsolUser -objectid $skypeAdmin.ObjectID -ErrorAction SilentlyContinue).StrongAuthenticationRequirements).State
|
|
|
|
if ($Null -ne $MFAS) {
|
|
$MFASTATUS = "Enabled"
|
|
}
|
|
else {
|
|
$MFASTATUS = "Disabled"
|
|
}
|
|
$Name = $skypeAdmin.DisplayName
|
|
$EmailAddress = $skypeAdmin.Mail
|
|
if (($skypeadmin.assignedlicenses.SkuID) -ne $Null) {
|
|
$Licensed = $True
|
|
}
|
|
else {
|
|
$Licensed = $False
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'MFA Status' = $MFAStatus
|
|
'Is Licensed' = $Licensed
|
|
'E-Mail Address' = $EmailAddress
|
|
}
|
|
|
|
$SkypeAdminTable.add($obj)
|
|
|
|
}
|
|
}
|
|
If (($skypeAdminTable).count -eq 0) {
|
|
$skypeAdminTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users with the Lync Service Administrator role were found, refer to the Global Administrators list.'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Tenant CRM Admins" -ForegroundColor white
|
|
#Get Tenant CRM Admins
|
|
$crmrole = Get-AzureADDirectoryRole | Where-Object { $_.DisplayName -match "CRM Service Administrator" } -ErrorAction SilentlyContinue
|
|
If ($Null -ne $crmrole) {
|
|
$crmAdmins = Get-AzureADDirectoryRoleMember -ObjectId $crmrole.ObjectId -ErrorAction SilentlyContinue
|
|
Foreach ($crmAdmin in $crmAdmins) {
|
|
$MFAS = ((Get-MsolUser -objectid $crmAdmin.ObjectID -ErrorAction SilentlyContinue).StrongAuthenticationRequirements).State
|
|
|
|
if ($Null -ne $MFAS) {
|
|
$MFASTATUS = "Enabled"
|
|
}
|
|
else {
|
|
$MFASTATUS = "Disabled"
|
|
}
|
|
$Name = $crmAdmin.DisplayName
|
|
$EmailAddress = $crmAdmin.Mail
|
|
if (($crmadmin.assignedlicenses.SkuID) -ne $Null) {
|
|
$Licensed = $True
|
|
}
|
|
else {
|
|
$Licensed = $False
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'MFA Status' = $MFAStatus
|
|
'Is Licensed' = $Licensed
|
|
'E-Mail Address' = $EmailAddress
|
|
}
|
|
|
|
$CRMAdminTable.add($obj)
|
|
|
|
}
|
|
}
|
|
If (($CRMAdminTable).count -eq 0) {
|
|
$CRMAdminTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users with the CRM Service Administrator role were found, refer to the Global Administrators list.'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Tenant Power BI Admins" -ForegroundColor white
|
|
#Get Tenant Power BI Admins
|
|
$birole = Get-AzureADDirectoryRole | Where-Object { $_.DisplayName -match "Power BI Service Administrator" } -ErrorAction SilentlyContinue
|
|
If ($null -ne $birole) {
|
|
$biAdmins = Get-AzureADDirectoryRoleMember -ObjectId $birole.ObjectId -ErrorAction SilentlyContinue
|
|
|
|
Foreach ($biAdmin in $biAdmins) {
|
|
$MFAS = ((Get-MsolUser -objectid $biAdmin.ObjectID -ErrorAction SilentlyContinue).StrongAuthenticationRequirements).State
|
|
|
|
if ($Null -ne $MFAS) {
|
|
$MFASTATUS = "Enabled"
|
|
}
|
|
else {
|
|
$MFASTATUS = "Disabled"
|
|
}
|
|
$Name = $biAdmin.DisplayName
|
|
$EmailAddress = $biAdmin.Mail
|
|
if (($biadmin.assignedlicenses.SkuID) -ne $Null) {
|
|
$Licensed = $True
|
|
}
|
|
else {
|
|
$Licensed = $False
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'MFA Status' = $MFAStatus
|
|
'Is Licensed' = $Licensed
|
|
'E-Mail Address' = $EmailAddress
|
|
}
|
|
|
|
$PowerBIAdminTable.add($obj)
|
|
|
|
}
|
|
}
|
|
If (($PowerBIAdminTable).count -eq 0) {
|
|
$PowerBIAdminTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users with the Power BI Administrator role were found, refer to the Global Administrators list.'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Tenant Service Support Admins" -ForegroundColor white
|
|
#Get Tenant Service Support Admins
|
|
$servicerole = Get-AzureADDirectoryRole | Where-Object { $_.DisplayName -match "Service Support Administrator" } -ErrorAction SilentlyContinue
|
|
If ($Null -ne $servicerole) {
|
|
$serviceAdmins = Get-AzureADDirectoryRoleMember -ObjectId $servicerole.ObjectId -ErrorAction SilentlyContinue
|
|
Foreach ($serviceAdmin in $serviceAdmins) {
|
|
$MFAS = ((Get-MsolUser -objectid $serviceAdmin.ObjectID -ErrorAction SilentlyContinue).StrongAuthenticationRequirements).State
|
|
|
|
if ($Null -ne $MFAS) {
|
|
$MFASTATUS = "Enabled"
|
|
}
|
|
else {
|
|
$MFASTATUS = "Disabled"
|
|
}
|
|
$Name = $serviceAdmin.DisplayName
|
|
$EmailAddress = $serviceAdmin.Mail
|
|
if (($serviceadmin.assignedlicenses.SkuID) -ne $Null) {
|
|
$Licensed = $True
|
|
}
|
|
else {
|
|
$Licensed = $False
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'MFA Status' = $MFAStatus
|
|
'Is Licensed' = $Licensed
|
|
'E-Mail Address' = $EmailAddress
|
|
}
|
|
|
|
$ServiceAdminTable.add($obj)
|
|
|
|
}
|
|
}
|
|
If (($serviceAdminTable).count -eq 0) {
|
|
$serviceAdminTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users with the Service Support Administrator role were found, refer to the Global Administrators list.'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Tenant Billing Admins" -ForegroundColor white
|
|
#Get Tenant Billing Admins
|
|
$billingrole = Get-AzureADDirectoryRole | Where-Object { $_.DisplayName -match "Billing Administrator" } -ErrorAction SilentlyContinue
|
|
If ($Null -ne $billingrole) {
|
|
$billingAdmins = Get-AzureADDirectoryRoleMember -ObjectId $billingrole.ObjectId -ErrorAction SilentlyContinue
|
|
Foreach ($billingAdmin in $billingAdmins) {
|
|
$MFAS = ((Get-MsolUser -objectid $billingAdmin.ObjectID -ErrorAction SilentlyContinue).StrongAuthenticationRequirements).State
|
|
|
|
if ($Null -ne $MFAS) {
|
|
$MFASTATUS = "Enabled"
|
|
}
|
|
else {
|
|
$MFASTATUS = "Disabled"
|
|
}
|
|
$Name = $billingAdmin.DisplayName
|
|
$EmailAddress = $billingAdmin.Mail
|
|
if (($billingadmin.assignedlicenses.SkuID) -ne $Null) {
|
|
$Licensed = $True
|
|
}
|
|
else {
|
|
$Licensed = $False
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'MFA Status' = $MFAStatus
|
|
'Is Licensed' = $Licensed
|
|
'E-Mail Address' = $EmailAddress
|
|
}
|
|
|
|
$BillingAdminTable.add($obj)
|
|
|
|
}
|
|
}
|
|
If (($billingAdminTable).count -eq 0) {
|
|
$billingAdminTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users with the Billing Administrator role were found, refer to the Global Administrators list.'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Users with Strong Password Disabled..." -ForegroundColor Yellow
|
|
#Users with Strong Password Disabled
|
|
$LooseUsers = $AllUsers | Where-Object { $_.PasswordPolicies -eq "DisableStrongPassword" }
|
|
Foreach ($LooseUser in $LooseUsers) {
|
|
$NameLoose = $LooseUser.DisplayName
|
|
$UPNLoose = $LooseUser.UserPrincipalName
|
|
$StrongPasswordLoose = "False"
|
|
if (($LooseUser.assignedlicenses.SkuID) -ne $Null) {
|
|
$LicensedLoose = $true
|
|
}
|
|
else {
|
|
$LicensedLoose = $false
|
|
}
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $NameLoose
|
|
'UserPrincipalName' = $UPNLoose
|
|
'Is Licensed' = $LicensedLoose
|
|
'Strong Password Required' = $StrongPasswordLoose
|
|
}
|
|
|
|
|
|
$StrongPasswordTable.add($obj)
|
|
}
|
|
If (($StrongPasswordTable).count -eq 0) {
|
|
$StrongPasswordTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users were found with Strong Password Enforcement disabled'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Tenant Domains..." -ForegroundColor Yellow
|
|
#Tenant Domain
|
|
$Domains = Get-AzureAdDomain
|
|
foreach ($Domain in $Domains) {
|
|
$DomainName = $Domain.Name
|
|
$Verified = $Domain.IsVerified
|
|
$DefaultStatus = $Domain.IsDefault
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Domain Name' = $DomainName
|
|
'Verification Status' = $Verified
|
|
'Default' = $DefaultStatus
|
|
}
|
|
|
|
$DomainTable.add($obj)
|
|
}
|
|
|
|
Write-Host "Getting Groups..." -ForegroundColor Yellow
|
|
#Get groups and sort in alphabetical order
|
|
$Groups = Get-AzureAdGroup -All $True | Sort-Object DisplayName
|
|
$365GroupCount = ($Groups | Where-Object { $_.MailEnabled -eq $true -and $_.DirSyncEnabled -eq $null -and $_.SecurityEnabled -eq $false }).Count
|
|
$obj1 = [PSCustomObject]@{
|
|
'Name' = 'Office 365 Group'
|
|
'Count' = $365GroupCount
|
|
}
|
|
|
|
$GroupTypetable.add($obj1)
|
|
|
|
Write-Host "Getting Distribution Groups..." -ForegroundColor White
|
|
$DistroCount = ($Groups | Where-Object { $_.MailEnabled -eq $true -and $_.SecurityEnabled -eq $false }).Count
|
|
$obj1 = [PSCustomObject]@{
|
|
'Name' = 'Distribution List'
|
|
'Count' = $DistroCount
|
|
}
|
|
|
|
$GroupTypetable.add($obj1)
|
|
|
|
Write-Host "Getting Security Groups..." -ForegroundColor White
|
|
$SecurityCount = ($Groups | Where-Object { $_.MailEnabled -eq $false -and $_.SecurityEnabled -eq $true }).Count
|
|
$obj1 = [PSCustomObject]@{
|
|
'Name' = 'Security Group'
|
|
'Count' = $SecurityCount
|
|
}
|
|
|
|
$GroupTypetable.add($obj1)
|
|
|
|
Write-Host "Getting Mail-Enabled Security Groups..." -ForegroundColor White
|
|
$SecurityMailEnabledCount = ($Groups | Where-Object { $_.MailEnabled -eq $true -and $_.SecurityEnabled -eq $true }).Count
|
|
$obj1 = [PSCustomObject]@{
|
|
'Name' = 'Mail Enabled Security Group'
|
|
'Count' = $SecurityMailEnabledCount
|
|
}
|
|
|
|
$GroupTypetable.add($obj1)
|
|
|
|
Foreach ($Group in $Groups) {
|
|
$Type = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
|
|
if ($group.MailEnabled -eq $True -and $group.DirSyncEnabled -eq $null -and $group.SecurityEnabled -eq $False) {
|
|
$Type = "Office 365 Group"
|
|
}
|
|
if ($group.MailEnabled -eq $True -and $group.SecurityEnabled -eq $False) {
|
|
$Type = "Distribution List"
|
|
}
|
|
if ($group.MailEnabled -eq $False -and $group.SecurityEnabled -eq $True) {
|
|
$Type = "Security Group"
|
|
}
|
|
if ($group.MailEnabled -eq $True -and $group.SecurityEnabled -eq $True) {
|
|
$Type = "Mail Enabled Security Group"
|
|
}
|
|
|
|
$Users = (Get-AzureADGroupMember -ObjectId $Group.ObjectID | Sort-Object DisplayName | Select-Object -ExpandProperty DisplayName) -join ", "
|
|
$GName = $Group.DisplayName
|
|
|
|
$hash = New-Object PSObject -property @{ Name = "$GName"; Type = "$Type"; Members = "$Users" }
|
|
$GEmail = $Group.Mail
|
|
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $GName
|
|
'Type' = $Type
|
|
'Members' = $users
|
|
'E-mail Address' = $GEmail
|
|
}
|
|
|
|
$table.add($obj)
|
|
}
|
|
If (($table).count -eq 0) {
|
|
$table = [PSCustomObject]@{
|
|
'Information' = 'Information: No Groups were found in the tenant'
|
|
}
|
|
}
|
|
|
|
|
|
Write-Host "Getting Licenses..." -ForegroundColor Yellow
|
|
#Get all licenses
|
|
$Licenses = Get-AzureADSubscribedSku
|
|
#Split licenses at colon
|
|
Foreach ($License in $Licenses) {
|
|
$TextLic = $null
|
|
|
|
$ASku = ($License).SkuPartNumber
|
|
$TextLic = $Sku.Item("$ASku")
|
|
If (!($TextLic)) {
|
|
$OLicense = $License.SkuPartNumber
|
|
}
|
|
Else {
|
|
$OLicense = $TextLic
|
|
}
|
|
|
|
$TotalAmount = $License.PrepaidUnits.enabled
|
|
$Assigned = $License.ConsumedUnits
|
|
$Unassigned = ($TotalAmount - $Assigned)
|
|
|
|
If ($TotalAmount -lt $LicenseFilter) {
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Olicense
|
|
'Total Amount' = $TotalAmount
|
|
'Assigned Licenses' = $Assigned
|
|
'Unassigned Licenses' = $Unassigned
|
|
}
|
|
|
|
$licensetable.add($obj)
|
|
}
|
|
}
|
|
If (($licensetable).count -eq 0) {
|
|
$licensetable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Licenses were found in the tenant'
|
|
}
|
|
}
|
|
|
|
|
|
$IsLicensed = ($AllUsers | Where-Object { $_.assignedlicenses.count -gt 0 }).Count
|
|
$objULic = [PSCustomObject]@{
|
|
'Name' = 'Users Licensed'
|
|
'Count' = $IsLicensed
|
|
}
|
|
|
|
$IsLicensedUsersTable.add($objULic)
|
|
|
|
$ISNotLicensed = ($AllUsers | Where-Object { $_.assignedlicenses.count -eq 0 }).Count
|
|
$objULic = [PSCustomObject]@{
|
|
'Name' = 'Users Not Licensed'
|
|
'Count' = $IsNotLicensed
|
|
}
|
|
|
|
$IsLicensedUsersTable.add($objULic)
|
|
If (($IsLicensedUsersTable).count -eq 0) {
|
|
$IsLicensedUsersTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Licenses were found in the tenant'
|
|
}
|
|
}
|
|
|
|
#get Users
|
|
Write-Host "Getting Users..." -ForegroundColor Yellow
|
|
Foreach ($User in $AllUsers) {
|
|
$ProxyA = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$NewObject02 = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$NewObject01 = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$UserLicenses = ($user | Select -ExpandProperty AssignedLicenses).SkuID
|
|
If (($UserLicenses).count -gt 1) {
|
|
$LastLogon = Get-MailboxStatistics $User.DisplayName -ErrorAction SilentlyContinue | Select-Object -ExpandProperty LastLogonTime
|
|
Foreach ($UserLicense in $UserLicenses) {
|
|
$UserLicense = ($licenses | Where-Object { $_.skuid -match $UserLicense }).SkuPartNumber
|
|
$TextLic = $Sku.Item("$UserLicense")
|
|
If (!($TextLic)) {
|
|
$NewObject01 = [PSCustomObject]@{
|
|
'Licenses' = $UserLicense
|
|
}
|
|
$NewObject02.add($NewObject01)
|
|
}
|
|
Else {
|
|
$NewObject01 = [PSCustomObject]@{
|
|
'Licenses' = $textlic
|
|
}
|
|
|
|
$NewObject02.add($NewObject01)
|
|
}
|
|
}
|
|
}
|
|
Elseif (($UserLicenses).count -eq 1) {
|
|
$LastLogon = Get-MailboxStatistics $User.DisplayName -ErrorAction SilentlyContinue | Select-Object -ExpandProperty LastLogonTime
|
|
$lic = ($licenses | Where-Object { $_.skuid -match $UserLicenses }).SkuPartNumber
|
|
$TextLic = $Sku.Item("$lic")
|
|
If (!($TextLic)) {
|
|
$NewObject01 = [PSCustomObject]@{
|
|
'Licenses' = $lic
|
|
}
|
|
$NewObject02.add($NewObject01)
|
|
}
|
|
Else {
|
|
$NewObject01 = [PSCustomObject]@{
|
|
'Licenses' = $textlic
|
|
}
|
|
$NewObject02.add($NewObject01)
|
|
}
|
|
}
|
|
Else {
|
|
$LastLogon = $Null
|
|
$NewObject01 = [PSCustomObject]@{
|
|
'Licenses' = $Null
|
|
}
|
|
$NewObject02.add($NewObject01)
|
|
}
|
|
|
|
$ProxyAddresses = ($User | Select-Object -ExpandProperty ProxyAddresses)
|
|
If ($ProxyAddresses -ne $Null) {
|
|
Foreach ($Proxy in $ProxyAddresses) {
|
|
$ProxyB = $Proxy -split ":" | Select-Object -Last 1
|
|
$ProxyA.add($ProxyB)
|
|
|
|
}
|
|
$ProxyC = $ProxyA -join ", "
|
|
}
|
|
Else {
|
|
$ProxyC = $Null
|
|
}
|
|
|
|
$Name = $User.DisplayName
|
|
$UPN = $User.UserPrincipalName
|
|
$UserLicenses = ($NewObject02 | Select-Object -ExpandProperty Licenses) -join ", "
|
|
$Enabled = $User.AccountEnabled
|
|
$ResetPW = Get-User $User.DisplayName | Select-Object -ExpandProperty ResetPasswordOnNextLogon
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'UserPrincipalName' = $UPN
|
|
'Licenses' = $UserLicenses
|
|
'Last Mailbox Logon' = $LastLogon
|
|
'Reset Password at Next Logon' = $ResetPW
|
|
'Enabled' = $Enabled
|
|
'E-mail Addresses' = $ProxyC
|
|
}
|
|
|
|
$usertable.add($obj)
|
|
}
|
|
If (($usertable).count -eq 0) {
|
|
$usertable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Users were found in the tenant'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Shared Mailboxes..." -ForegroundColor Yellow
|
|
#Get all Shared Mailboxes
|
|
$SharedMailboxes = Get-Recipient -Resultsize unlimited | Where-Object { $_.RecipientTypeDetails -eq "SharedMailbox" }
|
|
Foreach ($SharedMailbox in $SharedMailboxes) {
|
|
$ProxyA = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$Name = $SharedMailbox.Name
|
|
$PrimEmail = $SharedMailbox.PrimarySmtpAddress
|
|
$ProxyAddresses = ($SharedMailbox | Where-Object { $_.EmailAddresses -notlike "*$PrimEmail*" } | Select-Object -ExpandProperty EmailAddresses)
|
|
If ($ProxyAddresses -ne $Null) {
|
|
Foreach ($ProxyAddress in $ProxyAddresses) {
|
|
$ProxyB = $ProxyAddress -split ":" | Select-Object -Last 1
|
|
If ($ProxyB -eq $PrimEmail) {
|
|
$ProxyB = $Null
|
|
}
|
|
$ProxyA.add($ProxyB)
|
|
$ProxyC = $ProxyA
|
|
}
|
|
}
|
|
Else {
|
|
$ProxyC = $Null
|
|
}
|
|
|
|
$ProxyF = ($ProxyC -join ", ").TrimEnd(", ")
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $Name
|
|
'Primary E-Mail' = $PrimEmail
|
|
'E-mail Addresses' = $ProxyF
|
|
}
|
|
|
|
|
|
|
|
$SharedMailboxTable.add($obj)
|
|
|
|
}
|
|
If (($SharedMailboxTable).count -eq 0) {
|
|
$SharedMailboxTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Shared Mailboxes were found in the tenant'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Contacts..." -ForegroundColor Yellow
|
|
#Get all Contacts
|
|
$Contacts = Get-MailContact
|
|
#Split licenses at colon
|
|
Foreach ($Contact in $Contacts) {
|
|
|
|
$ContactName = $Contact.DisplayName
|
|
$ContactPrimEmail = $Contact.PrimarySmtpAddress
|
|
|
|
$objContact = [PSCustomObject]@{
|
|
'Name' = $ContactName
|
|
'E-mail Address' = $ContactPrimEmail
|
|
}
|
|
|
|
$ContactTable.add($objContact)
|
|
|
|
}
|
|
If (($ContactTable).count -eq 0) {
|
|
$ContactTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Contacts were found in the tenant'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Mail Users..." -ForegroundColor Yellow
|
|
#Get all Mail Users
|
|
$MailUsers = Get-MailUser
|
|
foreach ($MailUser in $mailUsers) {
|
|
$MailArray = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$MailPrimEmail = $MailUser.PrimarySmtpAddress
|
|
$MailName = $MailUser.DisplayName
|
|
$MailEmailAddresses = ($MailUser.EmailAddresses | Where-Object { $_ -cnotmatch '^SMTP' })
|
|
foreach ($MailEmailAddress in $MailEmailAddresses) {
|
|
$MailEmailAddressSplit = $MailEmailAddress -split ":" | Select-Object -Last 1
|
|
$MailArray.add($MailEmailAddressSplit)
|
|
|
|
|
|
}
|
|
|
|
$UserEmails = $MailArray -join ", "
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $MailName
|
|
'Primary E-Mail' = $MailPrimEmail
|
|
'E-mail Addresses' = $UserEmails
|
|
}
|
|
|
|
$ContactMailUserTable.add($obj)
|
|
}
|
|
If (($ContactMailUserTable).count -eq 0) {
|
|
$ContactMailUserTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Mail Users were found in the tenant'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Room Mailboxes..." -ForegroundColor Yellow
|
|
$Rooms = Get-Mailbox -ResultSize Unlimited -Filter '(RecipientTypeDetails -eq "RoomMailBox")'
|
|
Foreach ($Room in $Rooms) {
|
|
$RoomArray = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
|
|
$RoomName = $Room.DisplayName
|
|
$RoomPrimEmail = $Room.PrimarySmtpAddress
|
|
$RoomEmails = ($Room.EmailAddresses | Where-Object { $_ -cnotmatch '^SMTP' })
|
|
foreach ($RoomEmail in $RoomEmails) {
|
|
$RoomEmailSplit = $RoomEmail -split ":" | Select-Object -Last 1
|
|
$RoomArray.add($RoomEmailSplit)
|
|
}
|
|
$RoomEMailsF = $RoomArray -join ", "
|
|
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $RoomName
|
|
'Primary E-Mail' = $RoomPrimEmail
|
|
'E-mail Addresses' = $RoomEmailsF
|
|
}
|
|
|
|
$RoomTable.add($obj)
|
|
}
|
|
If (($RoomTable).count -eq 0) {
|
|
$RoomTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Room Mailboxes were found in the tenant'
|
|
}
|
|
}
|
|
|
|
Write-Host "Getting Equipment Mailboxes..." -ForegroundColor Yellow
|
|
$EquipMailboxes = Get-Mailbox -ResultSize Unlimited -Filter '(RecipientTypeDetails -eq "EquipmentMailBox")'
|
|
Foreach ($EquipMailbox in $EquipMailboxes) {
|
|
$EquipArray = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
|
|
$EquipName = $EquipMailbox.DisplayName
|
|
$EquipPrimEmail = $EquipMailbox.PrimarySmtpAddress
|
|
$EquipEmails = ($EquipMailbox.EmailAddresses | Where-Object { $_ -cnotmatch '^SMTP' })
|
|
foreach ($EquipEmail in $EquipEmails) {
|
|
$EquipEmailSplit = $EquipEmail -split ":" | Select-Object -Last 1
|
|
$EquipArray.add($EquipEmailSplit)
|
|
}
|
|
$EquipEMailsF = $EquipArray -join ", "
|
|
|
|
$obj = [PSCustomObject]@{
|
|
'Name' = $EquipName
|
|
'Primary E-Mail' = $EquipPrimEmail
|
|
'E-mail Addresses' = $EquipEmailsF
|
|
}
|
|
|
|
|
|
$EquipTable.add($obj)
|
|
}
|
|
If (($EquipTable).count -eq 0) {
|
|
$EquipTable = [PSCustomObject]@{
|
|
'Information' = 'Information: No Equipment Mailboxes were found in the tenant'
|
|
}
|
|
}
|
|
|
|
Write-Host "Generating HTML Report..." -ForegroundColor Yellow
|
|
|
|
$tabarray = @('Dashboard', 'Admins', 'Users', 'Groups', 'Licenses', 'Shared Mailboxes', 'Contacts', 'Resources')
|
|
|
|
#basic Properties
|
|
$PieObject2 = Get-HTMLPieChartObject
|
|
$PieObject2.Title = "Office 365 Total Licenses"
|
|
$PieObject2.Size.Height = 500
|
|
$PieObject2.Size.width = 500
|
|
$PieObject2.ChartStyle.ChartType = 'doughnut'
|
|
|
|
#These file exist in the module directoy, There are 4 schemes by default
|
|
$PieObject2.ChartStyle.ColorSchemeName = "ColorScheme4"
|
|
#There are 8 generated schemes, randomly generated at runtime
|
|
$PieObject2.ChartStyle.ColorSchemeName = "Generated7"
|
|
#you can also ask for a random scheme. Which also happens if you have too many records for the scheme
|
|
$PieObject2.ChartStyle.ColorSchemeName = 'Random'
|
|
|
|
#Data defintion you can reference any column from name and value from the dataset.
|
|
#Name and Count are the default to work with the Group function.
|
|
$PieObject2.DataDefinition.DataNameColumnName = 'Name'
|
|
$PieObject2.DataDefinition.DataValueColumnName = 'Total Amount'
|
|
|
|
#basic Properties
|
|
$PieObject3 = Get-HTMLPieChartObject
|
|
$PieObject3.Title = "Office 365 Assigned Licenses"
|
|
$PieObject3.Size.Height = 500
|
|
$PieObject3.Size.width = 500
|
|
$PieObject3.ChartStyle.ChartType = 'doughnut'
|
|
|
|
#These file exist in the module directoy, There are 4 schemes by default
|
|
$PieObject3.ChartStyle.ColorSchemeName = "ColorScheme4"
|
|
#There are 8 generated schemes, randomly generated at runtime
|
|
$PieObject3.ChartStyle.ColorSchemeName = "Generated5"
|
|
#you can also ask for a random scheme. Which also happens if you have too many records for the scheme
|
|
$PieObject3.ChartStyle.ColorSchemeName = 'Random'
|
|
|
|
#Data defintion you can reference any column from name and value from the dataset.
|
|
#Name and Count are the default to work with the Group function.
|
|
$PieObject3.DataDefinition.DataNameColumnName = 'Name'
|
|
$PieObject3.DataDefinition.DataValueColumnName = 'Assigned Licenses'
|
|
|
|
#basic Properties
|
|
$PieObject4 = Get-HTMLPieChartObject
|
|
$PieObject4.Title = "Office 365 Unassigned Licenses"
|
|
$PieObject4.Size.Height = 250
|
|
$PieObject4.Size.width = 250
|
|
$PieObject4.ChartStyle.ChartType = 'doughnut'
|
|
|
|
#These file exist in the module directoy, There are 4 schemes by default
|
|
$PieObject4.ChartStyle.ColorSchemeName = "ColorScheme4"
|
|
#There are 8 generated schemes, randomly generated at runtime
|
|
$PieObject4.ChartStyle.ColorSchemeName = "Generated4"
|
|
#you can also ask for a random scheme. Which also happens if you have too many records for the scheme
|
|
$PieObject4.ChartStyle.ColorSchemeName = 'Random'
|
|
|
|
#Data defintion you can reference any column from name and value from the dataset.
|
|
#Name and Count are the default to work with the Group function.
|
|
$PieObject4.DataDefinition.DataNameColumnName = 'Name'
|
|
$PieObject4.DataDefinition.DataValueColumnName = 'Unassigned Licenses'
|
|
|
|
#basic Properties
|
|
$PieObjectGroupType = Get-HTMLPieChartObject
|
|
$PieObjectGroupType.Title = "Office 365 Groups"
|
|
$PieObjectGroupType.Size.Height = 250
|
|
$PieObjectGroupType.Size.width = 250
|
|
$PieObjectGroupType.ChartStyle.ChartType = 'doughnut'
|
|
|
|
#These file exist in the module directoy, There are 4 schemes by default
|
|
$PieObjectGroupType.ChartStyle.ColorSchemeName = "ColorScheme4"
|
|
#There are 8 generated schemes, randomly generated at runtime
|
|
$PieObjectGroupType.ChartStyle.ColorSchemeName = "Generated8"
|
|
#you can also ask for a random scheme. Which also happens if you have too many records for the scheme
|
|
$PieObjectGroupType.ChartStyle.ColorSchemeName = 'Random'
|
|
|
|
#Data defintion you can reference any column from name and value from the dataset.
|
|
#Name and Count are the default to work with the Group function.
|
|
$PieObjectGroupType.DataDefinition.DataNameColumnName = 'Name'
|
|
$PieObjectGroupType.DataDefinition.DataValueColumnName = 'Count'
|
|
|
|
##--LICENSED AND UNLICENSED USERS PIE CHART--##
|
|
#basic Properties
|
|
$PieObjectULicense = Get-HTMLPieChartObject
|
|
$PieObjectULicense.Title = "License Status"
|
|
$PieObjectULicense.Size.Height = 250
|
|
$PieObjectULicense.Size.width = 250
|
|
$PieObjectULicense.ChartStyle.ChartType = 'doughnut'
|
|
|
|
#These file exist in the module directoy, There are 4 schemes by default
|
|
$PieObjectULicense.ChartStyle.ColorSchemeName = "ColorScheme3"
|
|
#There are 8 generated schemes, randomly generated at runtime
|
|
$PieObjectULicense.ChartStyle.ColorSchemeName = "Generated3"
|
|
#you can also ask for a random scheme. Which also happens if you have too many records for the scheme
|
|
$PieObjectULicense.ChartStyle.ColorSchemeName = 'Random'
|
|
|
|
#Data defintion you can reference any column from name and value from the dataset.
|
|
#Name and Count are the default to work with the Group function.
|
|
$PieObjectULicense.DataDefinition.DataNameColumnName = 'Name'
|
|
$PieObjectULicense.DataDefinition.DataValueColumnName = 'Count'
|
|
|
|
$rpt = New-Object 'System.Collections.Generic.List[System.Object]'
|
|
$rpt += get-htmlopenpage -TitleText 'Office 365 Tenant Report' -LeftLogoString $CompanyLogo -RightLogoString $RightLogo
|
|
|
|
$rpt += Get-HTMLTabHeader -TabNames $tabarray
|
|
$rpt += get-htmltabcontentopen -TabName $tabarray[0] -TabHeading ("Report: " + (Get-Date -Format MM-dd-yyyy))
|
|
$rpt += Get-HtmlContentOpen -HeaderText "Office 365 Dashboard"
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Company Information"
|
|
$rpt += Get-HtmlContentTable $CompanyInfoTable
|
|
$rpt += Get-HTMLContentClose
|
|
|
|
$rpt += get-HtmlColumn1of2
|
|
$rpt += Get-HtmlContentOpen -BackgroundShade 1 -HeaderText 'Global Administrators'
|
|
$rpt += get-htmlcontentdatatable $GlobalAdminTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
$rpt += get-htmlColumn2of2
|
|
$rpt += Get-HtmlContentOpen -HeaderText 'Users With Strong Password Enforcement Disabled'
|
|
$rpt += get-htmlcontentdatatable $StrongPasswordTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Domains"
|
|
$rpt += Get-HtmlContentTable $DomainTable
|
|
$rpt += Get-HTMLContentClose
|
|
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmltabcontentclose
|
|
|
|
$rpt += get-htmltabcontentopen -TabName $tabarray[1] -TabHeading ("Report: " + (Get-Date -Format MM-dd-yyyy))
|
|
$rpt += Get-HtmlContentOpen -HeaderText "Role Assignments"
|
|
|
|
$rpt += get-HtmlColumn1of2
|
|
$rpt += Get-HtmlContentOpen -BackgroundShade 1 -HeaderText 'Privileged Role Administrators'
|
|
$rpt += get-htmlcontentdatatable $PrivAdminTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
$rpt += get-htmlColumn2of2
|
|
$rpt += Get-HtmlContentOpen -HeaderText 'Exchange Administrators'
|
|
$rpt += get-htmlcontentdatatable $ExchangeAdminTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
|
|
$rpt += get-HtmlColumn1of2
|
|
$rpt += Get-HtmlContentOpen -BackgroundShade 1 -HeaderText 'User Account Administrators'
|
|
$rpt += get-htmlcontentdatatable $UserAdminTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
$rpt += get-htmlColumn2of2
|
|
$rpt += Get-HtmlContentOpen -HeaderText 'Helpdesk Administrators'
|
|
$rpt += get-htmlcontentdatatable $TechExchAdminTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
|
|
$rpt += get-HtmlColumn1of2
|
|
$rpt += Get-HtmlContentOpen -BackgroundShade 1 -HeaderText 'SharePoint Administrators'
|
|
$rpt += get-htmlcontentdatatable $SharePointAdminTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
$rpt += get-htmlColumn2of2
|
|
$rpt += Get-HtmlContentOpen -HeaderText 'Skype Administrators'
|
|
$rpt += get-htmlcontentdatatable $SkypeAdminTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
|
|
$rpt += get-HtmlColumn1of2
|
|
$rpt += Get-HtmlContentOpen -BackgroundShade 1 -HeaderText 'CRM Service Administrators'
|
|
$rpt += get-htmlcontentdatatable $CRMAdminTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
$rpt += get-htmlColumn2of2
|
|
$rpt += Get-HtmlContentOpen -HeaderText 'Power BI Administrators'
|
|
$rpt += get-htmlcontentdatatable $PowerBIAdminTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
|
|
$rpt += get-HtmlColumn1of2
|
|
$rpt += Get-HtmlContentOpen -BackgroundShade 1 -HeaderText 'Service Support Administrators'
|
|
$rpt += get-htmlcontentdatatable $ServiceAdminTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
$rpt += get-htmlColumn2of2
|
|
$rpt += Get-HtmlContentOpen -HeaderText 'Billing Administrators'
|
|
$rpt += get-htmlcontentdatatable $BillingAdminTable -HideFooter
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmlColumnClose
|
|
$rpt += Get-HtmlContentClose
|
|
$rpt += get-htmltabcontentclose
|
|
|
|
$rpt += get-htmltabcontentopen -TabName $tabarray[2] -TabHeading ("Report: " + (Get-Date -Format MM-dd-yyyy))
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Office 365 Users"
|
|
$rpt += get-htmlcontentdatatable $UserTable -HideFooter
|
|
$rpt += Get-HTMLContentClose
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Licensed & Unlicensed Users Chart"
|
|
$rpt += Get-HTMLPieChart -ChartObject $PieObjectULicense -DataSet $IsLicensedUsersTable
|
|
$rpt += Get-HTMLContentClose
|
|
$rpt += get-htmltabcontentclose
|
|
|
|
$rpt += get-htmltabcontentopen -TabName $tabarray[3] -TabHeading ("Report: " + (Get-Date -Format MM-dd-yyyy))
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Office 365 Groups"
|
|
$rpt += get-htmlcontentdatatable $Table -HideFooter
|
|
$rpt += Get-HTMLContentClose
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Office 365 Groups Chart"
|
|
$rpt += Get-HTMLPieChart -ChartObject $PieObjectGroupType -DataSet $GroupTypetable
|
|
$rpt += Get-HTMLContentClose
|
|
$rpt += get-htmltabcontentclose
|
|
|
|
$rpt += get-htmltabcontentopen -TabName $tabarray[4] -TabHeading ("Report: " + (Get-Date -Format MM-dd-yyyy))
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Office 365 Licenses"
|
|
$rpt += get-htmlcontentdatatable $LicenseTable -HideFooter
|
|
$rpt += Get-HTMLContentClose
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Office 365 Licensing Charts"
|
|
$rpt += Get-HTMLColumnOpen -ColumnNumber 1 -ColumnCount 2
|
|
$rpt += Get-HTMLPieChart -ChartObject $PieObject2 -DataSet $licensetable
|
|
$rpt += Get-HTMLColumnClose
|
|
$rpt += Get-HTMLColumnOpen -ColumnNumber 2 -ColumnCount 2
|
|
$rpt += Get-HTMLPieChart -ChartObject $PieObject3 -DataSet $licensetable
|
|
$rpt += Get-HTMLColumnClose
|
|
$rpt += Get-HTMLContentclose
|
|
$rpt += get-htmltabcontentclose
|
|
|
|
$rpt += get-htmltabcontentopen -TabName $tabarray[5] -TabHeading ("Report: " + (Get-Date -Format MM-dd-yyyy))
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Office 365 Shared Mailboxes"
|
|
$rpt += get-htmlcontentdatatable $SharedMailboxTable -HideFooter
|
|
$rpt += Get-HTMLContentClose
|
|
$rpt += get-htmltabcontentclose
|
|
|
|
$rpt += get-htmltabcontentopen -TabName $tabarray[6] -TabHeading ("Report: " + (Get-Date -Format MM-dd-yyyy))
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Office 365 Contacts"
|
|
$rpt += get-htmlcontentdatatable $ContactTable -HideFooter
|
|
$rpt += Get-HTMLContentClose
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Office 365 Mail Users"
|
|
$rpt += get-htmlcontentdatatable $ContactMailUserTable -HideFooter
|
|
$rpt += Get-HTMLContentClose
|
|
$rpt += get-htmltabcontentclose
|
|
|
|
$rpt += get-htmltabcontentopen -TabName $tabarray[7] -TabHeading ("Report: " + (Get-Date -Format MM-dd-yyyy))
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Office 365 Room Mailboxes"
|
|
$rpt += get-htmlcontentdatatable $RoomTable -HideFooter
|
|
$rpt += Get-HTMLContentClose
|
|
$rpt += Get-HTMLContentOpen -HeaderText "Office 365 Equipment Mailboxes"
|
|
$rpt += get-htmlcontentdatatable $EquipTable -HideFooter
|
|
$rpt += Get-HTMLContentClose
|
|
$rpt += get-htmltabcontentclose
|
|
|
|
|
|
$rpt += Get-HTMLClosePage
|
|
|
|
$Day = (Get-Date).Day
|
|
$Month = (Get-Date).Month
|
|
$Year = (Get-Date).Year
|
|
$ReportName = ( "$Month" + "-" + "$Day" + "-" + "$Year" + "-" + "O365 Tenant Report")
|
|
Save-HTMLReport -ReportContent $rpt -ShowReport -ReportName $ReportName -ReportPath $ReportSavePath
|