Powershell Outlook Signature Local AD

powershell
<#
.SYNOPSIS
    Generate Outlook Signature with data from Local AD
.DESCRIPTION
    This script generates Outlook signatures automatically using Active Directory data.
    It should be run as a logon script. For testing purposes, you can run it with initials.
.NOTES
    Author: Kasper Lundgaard Christensen - TODO-IT
    Date: 01-04-2024
    Version: 1.0
#>

# Parameters
param(
    [string]$UserOverwrite
)

# Getting Active Directory information for current user
$user = (([adsisearcher]"(&(objectCategory=User)(samaccountname=$env:username))").FindOne().Properties)

# Overwrite user for testing purposes
if ($UserOverwrite) {
    $user = (([adsisearcher]"(&(objectCategory=User)(samaccountname=$UserOverwrite))").FindOne().Properties)
    Write-Host "Testing with user: $UserOverwrite"
}

# If the user is not found in Active Directory exit the script
if (!$user) {
    Write-Error "User not found in Active Directory"
    exit 1
}

# Signature configuration
$folderLocation = $Env:APPDATA + '\Microsoft\Signatures'
$filename = "AD Signature"
$file = "$folderLocation\$filename"

# Company information
$companyName = "Company Name"
$logo = "Logo link"
$logoURL = "Logo URL"
$companyPhone = "Phone Number"
$slogan_1 = "Slogan"
$considerPrint = "Please consider the environment before printing this email"

# Create signatures folder if it doesn't exist
if (!(Test-Path -Path $folderLocation)) {
    New-Item -ItemType Directory -Path $folderLocation -Force
}

# Get user properties from Active Directory
$userProperties = @{
    DisplayName  = if ($user.name.Count -gt 0) { $user.name[0] } else { $null }
    JobTitle     = if ($user.title.Count -gt 0) { $user.title[0] } else { $null }
    Email        = if ($user.mail.Count -gt 0) { $user.mail[0] } else { $null }
    Company      = if ($user.company.Count -gt 0) { $user.company[0] } else { $null }
    Mobile       = if ($user.mobile.Count -gt 0) { $user.mobile[0] } else { $null }
    DirectDial   = if ($user.homephone.Count -gt 0) { $user.homephone[0] } else { $null }
    Telephone    = if ($user.telephonenumber.Count -gt 0) { $user.telephonenumber[0] } else { $null }
    Website      = if ($user.wwwhomepage.Count -gt 0) { $user.wwwhomepage[0] } else { $null }
    PoBox        = if ($user.postofficebox.Count -gt 0) { $user.postofficebox[0] } else { $null }
    Office       = if ($user.physicaldeliveryofficename.Count -gt 0) { $user.physicaldeliveryofficename[0] } else { $null }
    Street       = if ($user.streetaddress.Count -gt 0) { $user.streetaddress[0] } else { $null }
    City         = if ($user.l.Count -gt 0) { $user.l[0] } else { $null }
    State        = if ($user.st.Count -gt 0) { $user.st[0] } else { $null }
    ZipCode      = if ($user.postalcode.Count -gt 0) { $user.postalcode[0] } else { $null }
}

# Group Check for custom logo
$Group = [ADSI]"LDAP://CN=Signature_CompanyLogo,OU=Signature,OU=Security Groups,OU=Users,DC=contoso,DC=dk"
$Group.Member | ForEach-Object {
    if ($user.distinguishedname -match $_) {
        $logo = "Alternative Logo Link"
    }
}

# CSS Styles
$style = @"
<style>
    p, table, td, tr, a, span {
        font-family: Calibri, Helvetica, sans-serif;
        font-size: 11pt;
        color: #000000;
    }

    span.blue {
        color: #000000;
    }

    table {
        margin: 0;
        padding: 0;
    }

    a {
        text-decoration: none;
    }

    hr {
        border: none;
        height: 1px;
        background-color: #000000;
        color: #000000;
        width: 700px;
    }

    .Contact {
        width: 150px;
    }

    table.main {
        /* Main table styles */
    }
</style>
"@

# HTML Signature
$htmlSignature = @"
<span>Med venlig hilsen/Kind regards/Mit freundlichen Grüssen</span><br />
$(if ($userProperties.DisplayName) { "<span><b>$($userProperties.DisplayName)</b></span><br />" })
$(if ($userProperties.JobTitle) { "<span>$($userProperties.JobTitle)</span><br /><br />" })

<p>
<table class='main'>
    <tr>
        <td colspan='2' style='padding-right: 75px;'>
            $(if ($logo) { "<a href='$logoURL'><img src='$logo' /></a>" })
        </td>
    </tr>
    <tr>
        <table>
            $(if ($userProperties.Telephone) { "<tr><td class='Contact'>Hovednummer: </td><td><a href='tel:$companyPhone'>$companyPhone</a></td></tr>" })
            $(if ($userProperties.Mobile) { "<tr><td class='Contact'>Mobil: </td><td><a href='tel:+45 $($userProperties.Mobile)'>+45 $($userProperties.Mobile)</a></td></tr>" })
            $(if ($userProperties.Email) { "<tr><td class='Contact'>Email: </td><td><a href='mailto:$($userProperties.Email)'>$($userProperties.Email)</a></td></tr>" })
            $(if ($userProperties.Website) { "<tr><td class='Contact'>Website: </td><td><a href='https://$($userProperties.Website)'>$($userProperties.Website)</a></td></tr>" })
        </table>
        <table>
            <tr>
                <br/>
                <br/>
                <br/>
            </tr>
            <tr>
                <td colspan='2' style='padding-bottom: 10px;'>
                    $(if ($companyName) { "<b>$companyName</b><br/>" })
                    $(if ($userProperties.Street) { "$($userProperties.Street)<br/>" })
                    $(if ($userProperties.ZipCode) { "$($userProperties.ZipCode) " })
                    $(if ($userProperties.City) { $userProperties.City })
                </td>
            </tr>
            <tr>
                <td colspan='2'>
                    <p>$slogan_1</p>
                </td>
            </tr>
        </table>
    </tr>
</table>
</p>
<br />
"@

# Save HTML signature
$style + $htmlSignature | Out-File "$file.htm" -Encoding UTF8

# Text signature for plain text emails
$textSignature = @"
Med venlig hilsen/Kind regards/Mit freundlichen Grüssen
$(if ($userProperties.DisplayName) { $userProperties.DisplayName })
$(if ($userProperties.JobTitle) { $userProperties.JobTitle })

$(if ($userProperties.Telephone) { "Hovednummer: $companyPhone" })
$(if ($userProperties.Mobile) { "Mobil: +45 $($userProperties.Mobile)" })
$(if ($userProperties.Email) { "Email: $($userProperties.Email)" })

$(if ($companyName) { $companyName })
$(if ($userProperties.Street) { $userProperties.Street })
$(if ($userProperties.ZipCode) { $userProperties.ZipCode }) $(if ($userProperties.City) { $userProperties.City })
"@

# Save text signature
$textSignature | Out-File "$file.txt" -Encoding Default

# Configure Outlook signatures in registry
$outlookVersions = @(
    @{ Version = "16.0"; Path = "HKCU:\Software\Microsoft\Office\16.0" },
    @{ Version = "14.0"; Path = "HKCU:\Software\Microsoft\Office\14.0" }
)

foreach ($outlook in $outlookVersions) {
    $commonPath = $outlook.Path + "\Common"
    
    if (Test-Path $commonPath) {
        # Set signature path
        if (Test-Path "$commonPath\General") {
            Set-ItemProperty -Path "$commonPath\General" -Name "Signatures" -Value "Signatures" -Force
        }
        
        # Set default signatures
        if (Test-Path "$commonPath\MailSettings") {
            Set-ItemProperty -Path "$commonPath\MailSettings" -Name "NewSignature" -Value $filename -Force
            Set-ItemProperty -Path "$commonPath\MailSettings" -Name "ReplySignature" -Value $filename -Force
        }
        
        # Remove First-Run flag
        $setupPath = $outlook.Path + "\Outlook\Setup"
        if (Test-Path $setupPath) {
            Remove-ItemProperty -Path $setupPath -Name "First-Run" -ErrorAction SilentlyContinue
        }
    }
}

Write-Host "Signature generated successfully for $($userProperties.DisplayName)"

Brugsanvisning:

Normal brug (som logonscript):

  • Deploy scriptet som logonscript via Group Policy

Test kørsel:

powershell
.\Script.ps1 -UserOverwrite "Initialer"

Funktioner:

  • Henter brugerinformation automatisk fra Active Directory

  • Genererer både HTML og tekst-version af signaturen

  • Understøtter flere Outlook-versioner (2010, 2016, Office365)

  • Mulighed for at teste med specifikke brugere

  • Dynamisk logo baseret på AD-gruppemedlemskab

  • Automatisk opsætning af Outlook-signatur

Bemærk: Husk at tilpasse AD-stier, company information og logo-stier til din organisation før brug.

Sådan forbinder du sikkert til Exchange Online PowerShell

Sådan forbinder du til Exchange Online PowerShell - Den komplette guide

Er du træt af at rode med Exchange Online PowerShell-forbindelser? Skal du sikre dig, at dine scripts er opdaterede og sikre? Så er du kommet til det rette sted!

🚀 Kom i gang på få minutter

Forbindelse til Exchange Online er blevet nemmere og mere sikker end nogensinde før. Her er hvordan du kommer i gang:

Installation af modulet

powershell
# Installer modulet (kun første gang)
Install-Module -Name ExchangeOnlineManagement

# Opdater til nyeste version (anbefales)
Update-Module -Name ExchangeOnlineManagement

Grundlæggende forbindelse

powershell
# Simpel forbindelse - åbner login-vindue
Connect-ExchangeOnline

# Med specifik bruger
Connect-ExchangeOnline -UserPrincipalName "din.email@firma.dk"

💡 Eksempler fra den virkelige verden

Her er hvordan du bruger forbindelsen i praksis:

powershell
# Tjek mailboks-størrelse
Get-MailboxStatistics -Identity "bruger@firma.dk" | 
Select-Object DisplayName, TotalItemSize

# Se brugeres mailbokse
Get-Mailbox -ResultSize Unlimited | 
Where-Object {$_.UserPrincipalName -like "*@firma.dk"}

🔒 Sikkerhedsbestemmelser du skal kende

powershell
# Vigtigt: Altid log ud efter brug!
Disconnect-ExchangeOnline -Confirm:$false

# Til automatisering - brug certificat-baseret auth
Connect-ExchangeOnline -CertificateThumbprint "XYZ123" -AppId "GUID" -Organization "contoso.onmicrosoft.com"

🛠️ Troubleshooting tips

Fejler forbindelsen? Prøv disse løsninger:

  • Kør Import-Module ExchangeOnlineManagement

  • Tjek at du har nyeste PowerShell-version

  • Prøv at køre som administrator

  • Sikr internetforbindelse til Office 365 endpoints

Husk at tjekke din session:

powershell
# Bekræft at du er forbundet
Get-ConnectionInformation

# Se tilgængelige kommandoer
Get-Command -Module ExchangeOnlineManagement

📈 Pro-tips til avanceret brug

  • Brug -ShowProgress $true ved store datasæt

  • -Verbose giver detaljeret output til fejlfinding

  • Gem dine scripts i VS Code med syntax highlighting

  • Brug variabler til gentagne elementer

🎯 Opsummering

Exchange Online PowerShell er et kraftfuldt værktøj, og med de rigtige forbindelsesmetoder får du:

  • Hurtigere arbejdsgang - automatisér gentagne opgaver

  • Bedre oversight - få fuld kontrol over din Exchange-miljø

  • Øget sikkerhed - moderne authentication som standard

Klar til at automatisere dine Exchange-opgaver? Hvad vil du gerne optimere i din hverdag? Del dine spørgsmål og erfaringer nedenfor! 👇

Har du brug for hjælp til specifikke scenarier? Spørg away - vi hjælper gerne!

Velkommen til vores IT-blog: Tips, tricks og løsninger til dine IT-udfordringer

Hej alle sammen!

Det er med stor glæde, at jeg byder jer velkommen til vores nye IT-blog. Her vil vi dele værdifulde tips, tricks og løsninger til alle dine IT-udfordringer. Uanset om du er en erfaren IT-professionel eller en nybegynder, håber vi at kunne tilbyde indsigtsfuldt indhold, der vil hjælpe dig med at navigere i den komplekse verden af teknologi.

Hvad kan du forvente?

På vores blog vil vi dække en bred vifte af emner relateret til IT-verdenen. Her er nogle af de emner, du kan se frem til:

  1. Tips og tricks: Vi vil dele smarte tricks og genveje, der kan spare dig tid og frustration i din daglige IT-brug. Uanset om det handler om at øge din produktivitet, organisere dine filer eller sikre dine enheder, vil vores tips hjælpe dig med at få mest muligt ud af din teknologi.

  2. Konkrete løsninger: Står du over for specifikke IT-udfordringer? Vores blog vil tilbyde konkrete løsninger på almindelige problemer, lige fra softwarefejl til netværksproblemer. Vi vil guide dig gennem trin-for-trin-processer, der hjælper dig med at løse dine problemer effektivt.

  3. Opdateringer og trends: IT-verdenen udvikler sig konstant, og det kan være svært at følge med i de seneste trends og opdateringer. Vi holder dig opdateret med relevant information om nye teknologier, sikkerhedsopdateringer og andre vigtige udviklinger, så du altid er på forkant med udviklingen.

Din deltagelse er vigtig!

Vi ønsker, at vores blog skal være en interaktiv platform, hvor vi kan dele viden og erfaringer med hinanden. Derfor opfordrer vi dig til at deltage aktivt ved at kommentere, stille spørgsmål og dele dine egne tips og erfaringer. Sammen kan vi skabe et dynamisk fællesskab, der hjælper hinanden med at løse IT-udfordringer.

Bliv opdateret:

For at sikre, at du ikke går glip af vores seneste indlæg og opdateringer, kan du tilmelde dig vores nyhedsbrev eller følge os på sociale medier. På den måde kan du altid være den første til at få adgang til vores friske indhold.

Tak fordi du læser med, og vi glæder os til at dele vores viden og erfaringer med dig! Lad os sammen navigere gennem IT-landskabet og finde løsninger på dine udfordringer.

Har du et specifikt emne, du gerne vil have dækket? Eller har du spørgsmål eller kommentarer til vores blog? Tøv ikke med at kontakte os - vi er her for at hjælpe!

Venlig hilsen,

Todo-It