<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Applied AI/ML Hub - Banner</title>
<style>
/* Safe, self-contained styles. Works inside Confluence HTML macro. */
.ai-banner-link{ text-decoration: none; display: block; width:100%; }
.ai-banner{
box-sizing: border-box;
width: 100%;
margin: 0;
padding: 18px 24px;
border-radius: 0;
background: linear-gradient(180deg,#012048 0%, #002d6a 100%);
color: #ffffff;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
box-shadow: 0 6px 18px rgba(0,0,0,0.18);
border-top: 1px solid rgba(255,255,255,0.04);
border-bottom: 1px solid rgba(255,255,255,0.04);
}
.ai-banner__left{
display:flex;
align-items: center;
gap: 16px;
}
.ai-banner__logo{
flex: 0 0 auto;
width: 56px;
height: 56px;
border-radius: 8px;
background: rgba(255,255,255,0.06);
display:flex;
align-items:center;
justify-content:center;
font-weight:700;
font-size:18px;
letter-spacing:0.6px;
}
.ai-banner__title{
font-size:20px;
line-height:1.05;
margin:0;
padding:0;
font-weight:700;
}
.ai-banner__subtitle{
margin:0;
font-size:12px;
opacity:0.9;
font-weight:500;
}
.ai-banner__cta{
flex:0 0 auto;
background: rgba(255,255,255,0.06);
padding:10px 16px;
border-radius:8px;
font-weight:600;
font-size:13px;
border: 1px solid rgba(255,255,255,0.06);
transition: transform 120ms ease, box-shadow 120ms ease;
}
.ai-banner__cta:active{ transform: translateY(1px); }
.ai-banner-link:focus .ai-banner, .ai-banner-link:hover .ai-banner{ box-shadow: 0 10px 28px rgba(0,0,0,0.25); transform: translateY(-2px); }
@media (max-width:720px){
.ai-banner{ flex-direction: column; align-items:flex-start; padding:14px; }
.ai-banner__left{ gap:12px; }
.ai-banner__title{ font-size:18px; }
.ai-banner__logo{ width:48px; height:48px; font-size:16px; }
.ai-banner__cta{ width:100%; text-align:center; }
}
</style>
</head>
<body>
<!-- Replace the href value with the URL you want the banner to open -->
<a class="ai-banner-link" href="YOUR_URL_HERE" target="_blank" rel="noopener noreferrer">
<div class="ai-banner" role="banner" aria-label="Applied AI/ML Hub - AI Sandbox">
<div class="ai-banner__left">
<div class="ai-banner__logo" aria-hidden="true">AI</div>
<div>
<h1 class="ai-banner__title">Applied AI/ML Hub</h1>
<p class="ai-banner__subtitle">AI Sandbox</p>
</div>
</div>
<div class="ai-banner__cta" role="button" aria-hidden="true">Open Sandbox</div>
</div>
</a>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Applied AI/ML Hub - Banner</title>
<style>
/* Safe, self-contained styles. Works inside Confluence HTML macro. */
.ai-banner-link{ text-decoration: none; display: block; width:100%; }
.ai-banner{
box-sizing: border-box;
width: 100%;
margin: 0;
padding: 18px 24px;
border-radius: 0;
background: linear-gradient(180deg,#012048 0%, #002d6a 100%);
color: #ffffff;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
box-shadow: 0 6px 18px rgba(0,0,0,0.18);
border-top: 1px solid rgba(255,255,255,0.04);
border-bottom: 1px solid rgba(255,255,255,0.04);
}
.ai-banner__left{
display:flex;
align-items: center;
gap: 16px;
}
.ai-banner__logo{
flex: 0 0 auto;
width: 56px;
height: 56px;
border-radius: 8px;
background: rgba(255,255,255,0.06);
display:flex;
align-items:center;
justify-content:center;
font-weight:700;
font-size:18px;
letter-spacing:0.6px;
}
.ai-banner__title{
font-size:20px;
line-height:1.05;
margin:0;
padding:0;
font-weight:700;
}
.ai-banner__subtitle{
margin:0;
font-size:12px;
opacity:0.9;
font-weight:500;
}
.ai-banner__cta{
flex:0 0 auto;
background: rgba(255,255,255,0.06);
padding:10px 16px;
border-radius:8px;
font-weight:600;
font-size:13px;
border: 1px solid rgba(255,255,255,0.06);
transition: transform 120ms ease, box-shadow 120ms ease;
}
.ai-banner__cta:active{ transform: translateY(1px); }
.ai-banner-link:focus .ai-banner, .ai-banner-link:hover .ai-banner{ box-shadow: 0 10px 28px rgba(0,0,0,0.25); transform: translateY(-2px); }
@media (max-width:720px){
.ai-banner{ flex-direction: column; align-items:flex-start; padding:14px; }
.ai-banner__left{ gap:12px; }
.ai-banner__title{ font-size:18px; }
.ai-banner__logo{ width:48px; height:48px; font-size:16px; }
.ai-banner__cta{ width:100%; text-align:center; }
}
</style>
</head>
<body>
<!-- Replace the href value with the URL you want the banner to open -->
<a class="ai-banner-link" href="YOUR_URL_HERE" target="_blank" rel="noopener noreferrer">
<div class="ai-banner" role="banner" aria-label="Applied AI/ML Hub - AI Sandbox">
<div class="ai-banner__left">
<div class="ai-banner__logo" aria-hidden="true">AI</div>
<div>
<h1 class="ai-banner__title">Applied AI/ML Hub</h1>
<p class="ai-banner__subtitle">AI Sandbox</p>
</div>
</div>
<div class="ai-banner__cta" role="button" aria-hidden="true">Open Sandbox</div>
</div>
</a>
</body>
</html>
# ============================================================
# Check-ADUserStatus.ps1
#
# Reads a CSV/Excel file with columns: ID, Email
# Queries Active Directory for each user's enabled/disabled status
# Outputs the same file with an added "Account Status" column
# ============================================================
param (
[Parameter(Mandatory = $true)]
[string]$InputFile,
[Parameter(Mandatory = $false)]
[string]$OutputFile
)
# --- Resolve output path ---
if (-not $OutputFile) {
$baseName = [System.IO.Path]::GetFileNameWithoutExtension($InputFile)
$extension = [System.IO.Path]::GetExtension($InputFile)
$directory = [System.IO.Path]::GetDirectoryName($InputFile)
$OutputFile = Join-Path $directory ($baseName + "_ADStatus" + $extension)
}
# --- Load input file (supports .csv, .xlsx via Export-Excel or plain CSV) ---
$extension = [System.IO.Path]::GetExtension($InputFile).ToLower()
if ($extension -eq ".csv") {
$users = Import-Csv -Path $InputFile
} elseif ($extension -in @(".xlsx", ".xls")) {
# Requires the ImportExcel module: Install-Module -Name ImportExcel
if (-not (Get-Module -ListAvailable -Name ImportExcel)) {
Write-Error "The 'ImportExcel' module is required for .xlsx files. Install it with: Install-Module -Name ImportExcel"
exit 1
}
Import-Module ImportExcel
$users = Import-Excel -Path $InputFile
} else {
Write-Error "Unsupported file type '$extension'. Please provide a .csv or .xlsx file."
exit 1
}
# --- Detect column names flexibly (case-insensitive) ---
$allColumns = $users[0].PSObject.Properties.Name
$idColumn = $allColumns | Where-Object { $_ -match '^id$|^user.?id$|^employee.?id$|^username$|^sam' } | Select-Object -First 1
$emailColumn = $allColumns | Where-Object { $_ -match '^email$|^mail$|^e.?mail' } | Select-Object -First 1
if (-not $idColumn) {
Write-Warning "Could not auto-detect the ID column. Falling back to first column: '$($allColumns[0])'"
$idColumn = $allColumns[0]
}
if (-not $emailColumn) {
Write-Warning "Could not auto-detect the Email column. Falling back to second column: '$($allColumns[1])'"
$emailColumn = $allColumns[1]
}
Write-Host "Using ID column : $idColumn"
Write-Host "Using Email column : $emailColumn"
Write-Host "Processing $($users.Count) users..."
Write-Host ""
# --- Process each user ---
$results = foreach ($user in $users) {
$userId = $user.$idColumn
$email = $user.$emailColumn
$status = "Unknown"
if ([string]::IsNullOrWhiteSpace($userId)) {
$status = "No ID Provided"
} else {
try {
# Same approach as your working command:
# Get-ADUser personID -Properties PrimaryGroup
$adUser = Get-ADUser $userId -Properties Enabled -ErrorAction Stop
if ($adUser.Enabled -eq $true) {
$status = "Active"
} else {
$status = "Disabled"
}
} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {
$status = "Not Found in AD"
} catch {
$status = "Error: $($_.Exception.Message)"
}
}
Write-Host " $userId | $email | $status"
# Build output row preserving all original columns
$row = [ordered]@{}
foreach ($col in $allColumns) {
$row[$col] = $user.$col
}
$row["Account Status"] = $status
[PSCustomObject]$row
}
Write-Host ""
Write-Host "Writing output to: $OutputFile"
# --- Export results ---
if ($extension -eq ".csv") {
$results | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
} else {
$results | Export-Excel -Path $OutputFile -AutoSize -AutoFilter -WorksheetName "AD Status" `
-TableName "UserStatus" -TableStyle Medium2 `
-ConditionalText $(
New-ConditionalText -Text "Active" -BackgroundColor "#C6EFCE" -ConditionalTextColor "#276221"
New-ConditionalText -Text "Disabled" -BackgroundColor "#FFCCCC" -ConditionalTextColor "#9C0006"
New-ConditionalText -Text "Not Found in AD" -BackgroundColor "#FFEB9C" -ConditionalTextColor "#9C5700"
)
}
Write-Host "Done."
# --- Summary ---
$summary = $results | Group-Object "Account Status" | Select-Object Name, Count
Write-Host ""
Write-Host "=== Summary ==="
$summary | Format-Table -AutoSize
# ============================================================
# Check-ADUserStatus.ps1
#
# Reads a CSV/Excel file with columns: ID, Email
# Queries Active Directory for each user's enabled/disabled status
# Outputs the same file with an added "Account Status" column
# ============================================================
param (
[Parameter(Mandatory = $true)]
[string]$InputFile,
[Parameter(Mandatory = $false)]
[string]$OutputFile
)
# --- Resolve output path ---
if (-not $OutputFile) {
$baseName = [System.IO.Path]::GetFileNameWithoutExtension($InputFile)
$extension = [System.IO.Path]::GetExtension($InputFile)
$directory = [System.IO.Path]::GetDirectoryName($InputFile)
$OutputFile = Join-Path $directory ($baseName + "_ADStatus" + $extension)
}
# --- Load input file (supports .csv, .xlsx via Export-Excel or plain CSV) ---
$extension = [System.IO.Path]::GetExtension($InputFile).ToLower()
if ($extension -eq ".csv") {
$users = Import-Csv -Path $InputFile
} elseif ($extension -in @(".xlsx", ".xls")) {
# Requires the ImportExcel module: Install-Module -Name ImportExcel
if (-not (Get-Module -ListAvailable -Name ImportExcel)) {
Write-Error "The 'ImportExcel' module is required for .xlsx files. Install it with: Install-Module -Name ImportExcel"
exit 1
}
Import-Module ImportExcel
$users = Import-Excel -Path $InputFile
} else {
Write-Error "Unsupported file type '$extension'. Please provide a .csv or .xlsx file."
exit 1
}
# --- Detect column names flexibly (case-insensitive) ---
$allColumns = $users[0].PSObject.Properties.Name
$idColumn = $allColumns | Where-Object { $_ -match '^id$|^user.?id$|^employee.?id$|^username$|^sam' } | Select-Object -First 1
$emailColumn = $allColumns | Where-Object { $_ -match '^email$|^mail$|^e.?mail' } | Select-Object -First 1
if (-not $idColumn) {
Write-Warning "Could not auto-detect the ID column. Falling back to first column: '$($allColumns[0])'"
$idColumn = $allColumns[0]
}
if (-not $emailColumn) {
Write-Warning "Could not auto-detect the Email column. Falling back to second column: '$($allColumns[1])'"
$emailColumn = $allColumns[1]
}
Write-Host "Using ID column : $idColumn"
Write-Host "Using Email column : $emailColumn"
Write-Host "Processing $($users.Count) users..."
Write-Host ""
# --- Process each user ---
$results = foreach ($user in $users) {
$userId = $user.$idColumn
$email = $user.$emailColumn
$status = "Unknown"
if ([string]::IsNullOrWhiteSpace($userId)) {
$status = "No ID Provided"
} else {
try {
# Same approach as your working command:
# Get-ADUser personID -Properties PrimaryGroup
$adUser = Get-ADUser $userId -Properties Enabled -ErrorAction Stop
if ($adUser.Enabled -eq $true) {
$status = "Active"
} else {
$status = "Disabled"
}
} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {
$status = "Not Found in AD"
} catch {
$status = "Error: $($_.Exception.Message)"
}
}
Write-Host " $userId | $email | $status"
# Build output row preserving all original columns
$row = [ordered]@{}
foreach ($col in $allColumns) {
$row[$col] = $user.$col
}
$row["Account Status"] = $status
[PSCustomObject]$row
}
Write-Host ""
Write-Host "Writing output to: $OutputFile"
# --- Export results ---
if ($extension -eq ".csv") {
$results | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
} else {
$results | Export-Excel -Path $OutputFile -AutoSize -AutoFilter -WorksheetName "AD Status" `
-TableName "UserStatus" -TableStyle Medium2 `
-ConditionalText $(
New-ConditionalText -Text "Active" -BackgroundColor "#C6EFCE" -ConditionalTextColor "#276221"
New-ConditionalText -Text "Disabled" -BackgroundColor "#FFCCCC" -ConditionalTextColor "#9C0006"
New-ConditionalText -Text "Not Found in AD" -BackgroundColor "#FFEB9C" -ConditionalTextColor "#9C5700"
)
}
Write-Host "Done."
# --- Summary ---
$summary = $results | Group-Object "Account Status" | Select-Object Name, Count
Write-Host ""
Write-Host "=== Summary ==="
$summary | Format-Table -AutoSize
For a CSV input:
.\Check-ADUserStatus.ps1 -InputFile "C:\users\people.csv"
For an Excel input:
.\Check-ADUserStatus.ps1 -InputFile "C:\users\people.xlsx"
With a custom output path:
.\Check-ADUserStatus.ps1 -InputFile "people.csv" -OutputFile "C:\output\results.csv"
Get-ADUser personID -Properties Enabled | Select-Object SamAccountName, Enabled
<!DOCTYPE html>
<html>
<body style="margin:0; padding:0; background-color:#f4f5f7; font-family: Arial, sans-serif;">
<table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f4f5f7; padding: 40px 0;">
<tr>
<td align="center">
<!-- Email Card -->
<table width="600" cellpadding="0" cellspacing="0" style="background-color:#ffffff; border-radius:8px; overflow:hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<!-- Header Banner -->
<tr>
<td style="background-color:#0052CC; padding: 32px 40px; text-align:center;">
<h1 style="color:#ffffff; margin:0; font-size:22px; font-weight:700;">
🛠️ New Support Request
</h1>
<p style="color:#B3D4FF; margin:8px 0 0 0; font-size:14px;">
A new issue has been submitted and requires attention
</p>
</td>
</tr>
<!-- Submitted By Banner -->
<tr>
<td style="background-color:#DEEBFF; padding: 12px 40px;">
<p style="margin:0; font-size:13px; color:#0052CC;">
<strong>Submitted by:</strong> [entry._creator] |
<strong>Date:</strong> [entry._created]
</p>
</td>
</tr>
<!-- Body -->
<tr>
<td style="padding: 32px 40px;">
<!-- Issue Title -->
<table width="100%" cellpadding="0" cellspacing="0" style="margin-bottom:24px;">
<tr>
<td style="border-left: 4px solid #0052CC; padding-left:12px;">
<p style="margin:0 0 4px 0; font-size:11px; text-transform:uppercase; letter-spacing:1px; color:#6B778C;">Issue Title</p>
<p style="margin:0; font-size:18px; font-weight:700; color:#172B4D;">[entry.title]</p>
</td>
</tr>
</table>
<!-- Priority Badge -->
<table width="100%" cellpadding="0" cellspacing="0" style="margin-bottom:24px;">
<tr>
<td>
<p style="margin:0 0 8px 0; font-size:11px; text-transform:uppercase; letter-spacing:1px; color:#6B778C;">Priority</p>
<span style="display:inline-block; background-color:#FF5630; color:#ffffff; padding:4px 16px; border-radius:20px; font-size:13px; font-weight:700;">[entry.priority]</span>
</td>
</tr>
</table>
<!-- Divider -->
<hr style="border:none; border-top:1px solid #EBECF0; margin: 0 0 24px 0;" />
<!-- Description -->
<table width="100%" cellpadding="0" cellspacing="0" style="margin-bottom:24px;">
<tr>
<td style="background-color:#F4F5F7; border-radius:6px; padding:16px;">
<p style="margin:0 0 8px 0; font-size:11px; text-transform:uppercase; letter-spacing:1px; color:#6B778C;">Issue Description</p>
<p style="margin:0; font-size:14px; color:#172B4D; line-height:1.6;">[entry.message]</p>
</td>
</tr>
</table>
<!-- Department and any other fields -->
<table width="100%" cellpadding="0" cellspacing="0" style="margin-bottom:24px; border:1px solid #EBECF0; border-radius:6px; overflow:hidden;">
<tr style="background-color:#F4F5F7;">
<td width="40%" style="padding:10px 16px; font-size:12px; font-weight:700; color:#6B778C; text-transform:uppercase;">Field</td>
<td width="60%" style="padding:10px 16px; font-size:12px; font-weight:700; color:#6B778C; text-transform:uppercase;">Value</td>
</tr>
<tr style="border-top:1px solid #EBECF0;">
<td style="padding:12px 16px; font-size:13px; color:#6B778C;">Department</td>
<td style="padding:12px 16px; font-size:13px; color:#172B4D; font-weight:600;">[entry.department]</td>
</tr>
<tr style="border-top:1px solid #EBECF0; background-color:#FAFBFC;">
<td style="padding:12px 16px; font-size:13px; color:#6B778C;">Steps to Reproduce</td>
<td style="padding:12px 16px; font-size:13px; color:#172B4D;">[entry.steps]</td>
</tr>
<tr style="border-top:1px solid #EBECF0;">
<td style="padding:12px 16px; font-size:13px; color:#6B778C;">Expected Behaviour</td>
<td style="padding:12px 16px; font-size:13px; color:#172B4D;">[entry.expected]</td>
</tr>
<tr style="border-top:1px solid #EBECF0; background-color:#FAFBFC;">
<td style="padding:12px 16px; font-size:13px; color:#6B778C;">Actual Behaviour</td>
<td style="padding:12px 16px; font-size:13px; color:#172B4D;">[entry.actual]</td>
</tr>
</table>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="background-color:#F4F5F7; padding:20px 40px; text-align:center; border-top:1px solid #EBECF0;">
<p style="margin:0; font-size:12px; color:#6B778C;">
This is an automated notification from your IT Support Form.<br/>
Please do not reply to this email directly.
</p>
</td>
</tr>
</table>
<!-- End Email Card -->
</td>
</tr>
</table>
</body>
</html>