diff --git a/flash/scripts/07-desktop-info.ps1 b/flash/scripts/07-desktop-info.ps1 index 7e836b8..4f27ebc 100644 --- a/flash/scripts/07-desktop-info.ps1 +++ b/flash/scripts/07-desktop-info.ps1 @@ -11,7 +11,7 @@ function Write-Log { Add-Content -Path $LogFile -Value $line -Encoding UTF8 } -$ScriptDir = "C:\Windows\Setup\Scripts" +$ScriptDir = "C:\Windows\Setup\Scripts" $RenderScript = "$ScriptDir\DesktopInfo-Render.ps1" $BmpPath = "$ScriptDir\desktopinfo.bmp" @@ -19,137 +19,133 @@ if (-not (Test-Path $ScriptDir)) { New-Item -ItemType Directory -Path $ScriptDir -Force | Out-Null } -# ----------------------------------------------------------------------- -# Read display settings from config -# ----------------------------------------------------------------------- -$fontSize = 13 -$fontColor = "#FFFFFF" -$position = "bottomRight" - -if ($Config -and $Config.desktopInfo) { - if ($Config.desktopInfo.fontSize) { $fontSize = [int]$Config.desktopInfo.fontSize } - if ($Config.desktopInfo.fontColor) { $fontColor = $Config.desktopInfo.fontColor } - if ($Config.desktopInfo.position) { $position = $Config.desktopInfo.position } -} - # ----------------------------------------------------------------------- # Write the rendering script (runs on every logon as the user) +# Layout: hostname (large bold, centered), then detail lines centered # ----------------------------------------------------------------------- Write-Log "Writing DesktopInfo render script to $RenderScript" -Level INFO -$renderContent = @" +$renderContent = @' # DesktopInfo-Render.ps1 -# Collects system info and renders it onto the desktop wallpaper. +# Collects system info and renders it centered on the desktop wallpaper. # Runs on every user logon via Scheduled Task. -`$ErrorActionPreference = "Continue" +$ErrorActionPreference = "Continue" Add-Type -AssemblyName System.Drawing -Add-Type -TypeDefinition @' +Add-Type -AssemblyName System.Windows.Forms +Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; public class WallpaperApi { [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); } -'@ -ErrorAction SilentlyContinue +"@ -ErrorAction SilentlyContinue # ----------------------------------------------------------------------- # Collect system info # ----------------------------------------------------------------------- -`$hostname = `$env:COMPUTERNAME -`$username = `$env:USERNAME -`$ipAddress = (Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue | - Where-Object { `$_.IPAddress -ne "127.0.0.1" -and `$_.PrefixOrigin -ne "WellKnown" } | - Select-Object -First 1).IPAddress -if (-not `$ipAddress) { `$ipAddress = "N/A" } +$hostname = $env:COMPUTERNAME +$userDomain = $env:USERDOMAIN +$userName = $env:USERNAME +$loggedUser = if ($userDomain -and $userDomain -ne $hostname) { "$userDomain\$userName" } else { "$hostname\$userName" } -`$osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction SilentlyContinue -`$osName = if (`$osInfo) { `$osInfo.Caption -replace "Microsoft ", "" } else { "Windows" } -`$osBuild = if (`$osInfo) { `$osInfo.BuildNumber } else { "" } +$osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction SilentlyContinue +$osName = if ($osInfo) { $osInfo.Caption -replace "^Microsoft\s*", "" } else { "Windows" } +$ramGB = if ($osInfo) { [math]::Round($osInfo.TotalVisibleMemorySize / 1024 / 1024, 1) } else { "?" } -# Deployment date = when script was first run, stored in registry -`$deployRegPath = "HKLM:\SOFTWARE\X9\Deployment" -`$deployDate = (Get-ItemProperty -Path `$deployRegPath -Name "DeployDate" -ErrorAction SilentlyContinue).DeployDate -if (-not `$deployDate) { `$deployDate = "N/A" } +$cpuInfo = Get-CimInstance Win32_Processor -ErrorAction SilentlyContinue | Select-Object -First 1 +$cpuCount = if ($cpuInfo) { $cpuInfo.NumberOfLogicalProcessors } else { "?" } +$cpuSpeed = if ($cpuInfo) { $cpuInfo.MaxClockSpeed } else { "?" } + +$ips = (Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue | + Where-Object { $_.IPAddress -ne "127.0.0.1" -and $_.PrefixOrigin -ne "WellKnown" } | + Select-Object -ExpandProperty IPAddress) -join ", " +if (-not $ips) { $ips = "N/A" } + +$csInfo = Get-CimInstance Win32_ComputerSystem -ErrorAction SilentlyContinue +$domain = if ($csInfo -and $csInfo.PartOfDomain) { $csInfo.Domain } ` + elseif ($csInfo -and $csInfo.Workgroup) { $csInfo.Workgroup.ToLower() } ` + else { "N/A" } # ----------------------------------------------------------------------- -# Build info lines +# Screen dimensions # ----------------------------------------------------------------------- -`$lines = @( - "Computer : `$hostname" - "User : `$username" - "IP : `$ipAddress" - "OS : `$osName (build `$osBuild)" - "Deployed : `$deployDate" +$screen = [System.Windows.Forms.Screen]::PrimaryScreen +$width = if ($screen) { $screen.Bounds.Width } else { 1920 } +$height = if ($screen) { $screen.Bounds.Height } else { 1080 } + +# ----------------------------------------------------------------------- +# Create bitmap and graphics context +# ----------------------------------------------------------------------- +$bmp = New-Object System.Drawing.Bitmap($width, $height) +$g = [System.Drawing.Graphics]::FromImage($bmp) +$g.TextRenderingHint = [System.Drawing.Text.TextRenderingHint]::AntiAlias +$g.Clear([System.Drawing.ColorTranslator]::FromHtml("#556364")) + +# ----------------------------------------------------------------------- +# Fonts and brushes +# ----------------------------------------------------------------------- +$fontName = "Segoe UI" +$fontTitle = New-Object System.Drawing.Font($fontName, 36, [System.Drawing.FontStyle]::Bold) +$fontBold = New-Object System.Drawing.Font($fontName, 14, [System.Drawing.FontStyle]::Bold) +$fontReg = New-Object System.Drawing.Font($fontName, 14, [System.Drawing.FontStyle]::Regular) +$brushWhite = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::White) +$brushGray = New-Object System.Drawing.SolidBrush([System.Drawing.ColorTranslator]::FromHtml("#C8D2D2")) + +# ----------------------------------------------------------------------- +# Lines: text, font, brush +# ----------------------------------------------------------------------- +$texts = @( + $hostname + "Logged on user: $loggedUser" + "OS: $osName" + "CPU: $cpuCount at $cpuSpeed MHz RAM: $($ramGB)GB" + "IPv4 address: $ips Machine domain: $domain" ) +$fonts = @( $fontTitle, $fontReg, $fontBold, $fontReg, $fontReg ) +$brushes = @( $brushWhite, $brushGray, $brushGray, $brushGray, $brushGray ) # ----------------------------------------------------------------------- -# Render bitmap +# Measure total block height, then center vertically # ----------------------------------------------------------------------- -Add-Type -AssemblyName System.Windows.Forms -ErrorAction SilentlyContinue - -`$screen = [System.Windows.Forms.Screen]::PrimaryScreen -`$width = if (`$screen) { `$screen.Bounds.Width } else { 1920 } -`$height = if (`$screen) { `$screen.Bounds.Height } else { 1080 } - -`$bmp = New-Object System.Drawing.Bitmap(`$width, `$height) -`$g = [System.Drawing.Graphics]::FromImage(`$bmp) - -# Background: solid accent color #223B47 -`$bgColor = [System.Drawing.ColorTranslator]::FromHtml("#223B47") -`$g.Clear(`$bgColor) - -# Font and colors -`$fontFamily = "Consolas" -`$fontSize = $fontSize -`$font = New-Object System.Drawing.Font(`$fontFamily, `$fontSize, [System.Drawing.FontStyle]::Regular) -`$brush = New-Object System.Drawing.SolidBrush([System.Drawing.ColorTranslator]::FromHtml("$fontColor")) -`$shadowBrush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::FromArgb(180, 0, 0, 0)) - -# Measure text block -`$lineHeight = `$font.GetHeight(`$g) + 4 -`$blockH = `$lines.Count * `$lineHeight -`$maxWidth = (`$lines | ForEach-Object { `$g.MeasureString(`$_, `$font).Width } | Measure-Object -Maximum).Maximum - -# Position -`$margin = 24 -`$pos = "$position" -`$x = switch -Wildcard (`$pos) { - "*Right" { `$width - `$maxWidth - `$margin } - "*Left" { `$margin } - default { `$margin } +$lineSpacing = 8 +$heights = @() +for ($i = 0; $i -lt $texts.Count; $i++) { + $heights += [int]($g.MeasureString($texts[$i], $fonts[$i]).Height) } -`$y = switch -Wildcard (`$pos) { - "bottom*" { `$height - `$blockH - `$margin } - "top*" { `$margin } - default { `$height - `$blockH - `$margin } +$totalH = ($heights | Measure-Object -Sum).Sum + $lineSpacing * ($texts.Count - 1) +$currentY = [int](($height - $totalH) / 2) + +# ----------------------------------------------------------------------- +# Draw each line centered horizontally +# ----------------------------------------------------------------------- +for ($i = 0; $i -lt $texts.Count; $i++) { + $sz = $g.MeasureString($texts[$i], $fonts[$i]) + $x = [int](($width - $sz.Width) / 2) + $g.DrawString($texts[$i], $fonts[$i], $brushes[$i], [float]$x, [float]$currentY) + $currentY += $heights[$i] + $lineSpacing } -# Draw shadow then text -foreach (`$line in `$lines) { - `$g.DrawString(`$line, `$font, `$shadowBrush, (`$x + 1), (`$y + 1)) - `$g.DrawString(`$line, `$font, `$brush, `$x, `$y) - `$y += `$lineHeight -} +$g.Dispose() -`$g.Dispose() +# ----------------------------------------------------------------------- +# Save and set as wallpaper +# ----------------------------------------------------------------------- +$bmpPath = "C:\Windows\Setup\Scripts\desktopinfo.bmp" +$bmp.Save($bmpPath, [System.Drawing.Imaging.ImageFormat]::Bmp) +$bmp.Dispose() -# Save BMP -`$bmpPath = "$BmpPath" -`$bmp.Save(`$bmpPath, [System.Drawing.Imaging.ImageFormat]::Bmp) -`$bmp.Dispose() - -# Set as wallpaper # SPI_SETDESKTOPWALLPAPER=20, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE=3 -[WallpaperApi]::SystemParametersInfo(20, 0, `$bmpPath, 3) | Out-Null -"@ +[WallpaperApi]::SystemParametersInfo(20, 0, $bmpPath, 3) | Out-Null +'@ $renderContent | Set-Content -Path $RenderScript -Encoding UTF8 -Force Write-Log "Render script written" -Level OK # ----------------------------------------------------------------------- -# Store deployment date in registry (used by render script) +# Store deployment date in registry (used for reference) # ----------------------------------------------------------------------- Write-Log "Storing deployment date in registry" -Level INFO try { diff --git a/scripts/07-desktop-info.ps1 b/scripts/07-desktop-info.ps1 index 7e836b8..4f27ebc 100644 --- a/scripts/07-desktop-info.ps1 +++ b/scripts/07-desktop-info.ps1 @@ -11,7 +11,7 @@ function Write-Log { Add-Content -Path $LogFile -Value $line -Encoding UTF8 } -$ScriptDir = "C:\Windows\Setup\Scripts" +$ScriptDir = "C:\Windows\Setup\Scripts" $RenderScript = "$ScriptDir\DesktopInfo-Render.ps1" $BmpPath = "$ScriptDir\desktopinfo.bmp" @@ -19,137 +19,133 @@ if (-not (Test-Path $ScriptDir)) { New-Item -ItemType Directory -Path $ScriptDir -Force | Out-Null } -# ----------------------------------------------------------------------- -# Read display settings from config -# ----------------------------------------------------------------------- -$fontSize = 13 -$fontColor = "#FFFFFF" -$position = "bottomRight" - -if ($Config -and $Config.desktopInfo) { - if ($Config.desktopInfo.fontSize) { $fontSize = [int]$Config.desktopInfo.fontSize } - if ($Config.desktopInfo.fontColor) { $fontColor = $Config.desktopInfo.fontColor } - if ($Config.desktopInfo.position) { $position = $Config.desktopInfo.position } -} - # ----------------------------------------------------------------------- # Write the rendering script (runs on every logon as the user) +# Layout: hostname (large bold, centered), then detail lines centered # ----------------------------------------------------------------------- Write-Log "Writing DesktopInfo render script to $RenderScript" -Level INFO -$renderContent = @" +$renderContent = @' # DesktopInfo-Render.ps1 -# Collects system info and renders it onto the desktop wallpaper. +# Collects system info and renders it centered on the desktop wallpaper. # Runs on every user logon via Scheduled Task. -`$ErrorActionPreference = "Continue" +$ErrorActionPreference = "Continue" Add-Type -AssemblyName System.Drawing -Add-Type -TypeDefinition @' +Add-Type -AssemblyName System.Windows.Forms +Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; public class WallpaperApi { [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); } -'@ -ErrorAction SilentlyContinue +"@ -ErrorAction SilentlyContinue # ----------------------------------------------------------------------- # Collect system info # ----------------------------------------------------------------------- -`$hostname = `$env:COMPUTERNAME -`$username = `$env:USERNAME -`$ipAddress = (Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue | - Where-Object { `$_.IPAddress -ne "127.0.0.1" -and `$_.PrefixOrigin -ne "WellKnown" } | - Select-Object -First 1).IPAddress -if (-not `$ipAddress) { `$ipAddress = "N/A" } +$hostname = $env:COMPUTERNAME +$userDomain = $env:USERDOMAIN +$userName = $env:USERNAME +$loggedUser = if ($userDomain -and $userDomain -ne $hostname) { "$userDomain\$userName" } else { "$hostname\$userName" } -`$osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction SilentlyContinue -`$osName = if (`$osInfo) { `$osInfo.Caption -replace "Microsoft ", "" } else { "Windows" } -`$osBuild = if (`$osInfo) { `$osInfo.BuildNumber } else { "" } +$osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction SilentlyContinue +$osName = if ($osInfo) { $osInfo.Caption -replace "^Microsoft\s*", "" } else { "Windows" } +$ramGB = if ($osInfo) { [math]::Round($osInfo.TotalVisibleMemorySize / 1024 / 1024, 1) } else { "?" } -# Deployment date = when script was first run, stored in registry -`$deployRegPath = "HKLM:\SOFTWARE\X9\Deployment" -`$deployDate = (Get-ItemProperty -Path `$deployRegPath -Name "DeployDate" -ErrorAction SilentlyContinue).DeployDate -if (-not `$deployDate) { `$deployDate = "N/A" } +$cpuInfo = Get-CimInstance Win32_Processor -ErrorAction SilentlyContinue | Select-Object -First 1 +$cpuCount = if ($cpuInfo) { $cpuInfo.NumberOfLogicalProcessors } else { "?" } +$cpuSpeed = if ($cpuInfo) { $cpuInfo.MaxClockSpeed } else { "?" } + +$ips = (Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue | + Where-Object { $_.IPAddress -ne "127.0.0.1" -and $_.PrefixOrigin -ne "WellKnown" } | + Select-Object -ExpandProperty IPAddress) -join ", " +if (-not $ips) { $ips = "N/A" } + +$csInfo = Get-CimInstance Win32_ComputerSystem -ErrorAction SilentlyContinue +$domain = if ($csInfo -and $csInfo.PartOfDomain) { $csInfo.Domain } ` + elseif ($csInfo -and $csInfo.Workgroup) { $csInfo.Workgroup.ToLower() } ` + else { "N/A" } # ----------------------------------------------------------------------- -# Build info lines +# Screen dimensions # ----------------------------------------------------------------------- -`$lines = @( - "Computer : `$hostname" - "User : `$username" - "IP : `$ipAddress" - "OS : `$osName (build `$osBuild)" - "Deployed : `$deployDate" +$screen = [System.Windows.Forms.Screen]::PrimaryScreen +$width = if ($screen) { $screen.Bounds.Width } else { 1920 } +$height = if ($screen) { $screen.Bounds.Height } else { 1080 } + +# ----------------------------------------------------------------------- +# Create bitmap and graphics context +# ----------------------------------------------------------------------- +$bmp = New-Object System.Drawing.Bitmap($width, $height) +$g = [System.Drawing.Graphics]::FromImage($bmp) +$g.TextRenderingHint = [System.Drawing.Text.TextRenderingHint]::AntiAlias +$g.Clear([System.Drawing.ColorTranslator]::FromHtml("#556364")) + +# ----------------------------------------------------------------------- +# Fonts and brushes +# ----------------------------------------------------------------------- +$fontName = "Segoe UI" +$fontTitle = New-Object System.Drawing.Font($fontName, 36, [System.Drawing.FontStyle]::Bold) +$fontBold = New-Object System.Drawing.Font($fontName, 14, [System.Drawing.FontStyle]::Bold) +$fontReg = New-Object System.Drawing.Font($fontName, 14, [System.Drawing.FontStyle]::Regular) +$brushWhite = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::White) +$brushGray = New-Object System.Drawing.SolidBrush([System.Drawing.ColorTranslator]::FromHtml("#C8D2D2")) + +# ----------------------------------------------------------------------- +# Lines: text, font, brush +# ----------------------------------------------------------------------- +$texts = @( + $hostname + "Logged on user: $loggedUser" + "OS: $osName" + "CPU: $cpuCount at $cpuSpeed MHz RAM: $($ramGB)GB" + "IPv4 address: $ips Machine domain: $domain" ) +$fonts = @( $fontTitle, $fontReg, $fontBold, $fontReg, $fontReg ) +$brushes = @( $brushWhite, $brushGray, $brushGray, $brushGray, $brushGray ) # ----------------------------------------------------------------------- -# Render bitmap +# Measure total block height, then center vertically # ----------------------------------------------------------------------- -Add-Type -AssemblyName System.Windows.Forms -ErrorAction SilentlyContinue - -`$screen = [System.Windows.Forms.Screen]::PrimaryScreen -`$width = if (`$screen) { `$screen.Bounds.Width } else { 1920 } -`$height = if (`$screen) { `$screen.Bounds.Height } else { 1080 } - -`$bmp = New-Object System.Drawing.Bitmap(`$width, `$height) -`$g = [System.Drawing.Graphics]::FromImage(`$bmp) - -# Background: solid accent color #223B47 -`$bgColor = [System.Drawing.ColorTranslator]::FromHtml("#223B47") -`$g.Clear(`$bgColor) - -# Font and colors -`$fontFamily = "Consolas" -`$fontSize = $fontSize -`$font = New-Object System.Drawing.Font(`$fontFamily, `$fontSize, [System.Drawing.FontStyle]::Regular) -`$brush = New-Object System.Drawing.SolidBrush([System.Drawing.ColorTranslator]::FromHtml("$fontColor")) -`$shadowBrush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::FromArgb(180, 0, 0, 0)) - -# Measure text block -`$lineHeight = `$font.GetHeight(`$g) + 4 -`$blockH = `$lines.Count * `$lineHeight -`$maxWidth = (`$lines | ForEach-Object { `$g.MeasureString(`$_, `$font).Width } | Measure-Object -Maximum).Maximum - -# Position -`$margin = 24 -`$pos = "$position" -`$x = switch -Wildcard (`$pos) { - "*Right" { `$width - `$maxWidth - `$margin } - "*Left" { `$margin } - default { `$margin } +$lineSpacing = 8 +$heights = @() +for ($i = 0; $i -lt $texts.Count; $i++) { + $heights += [int]($g.MeasureString($texts[$i], $fonts[$i]).Height) } -`$y = switch -Wildcard (`$pos) { - "bottom*" { `$height - `$blockH - `$margin } - "top*" { `$margin } - default { `$height - `$blockH - `$margin } +$totalH = ($heights | Measure-Object -Sum).Sum + $lineSpacing * ($texts.Count - 1) +$currentY = [int](($height - $totalH) / 2) + +# ----------------------------------------------------------------------- +# Draw each line centered horizontally +# ----------------------------------------------------------------------- +for ($i = 0; $i -lt $texts.Count; $i++) { + $sz = $g.MeasureString($texts[$i], $fonts[$i]) + $x = [int](($width - $sz.Width) / 2) + $g.DrawString($texts[$i], $fonts[$i], $brushes[$i], [float]$x, [float]$currentY) + $currentY += $heights[$i] + $lineSpacing } -# Draw shadow then text -foreach (`$line in `$lines) { - `$g.DrawString(`$line, `$font, `$shadowBrush, (`$x + 1), (`$y + 1)) - `$g.DrawString(`$line, `$font, `$brush, `$x, `$y) - `$y += `$lineHeight -} +$g.Dispose() -`$g.Dispose() +# ----------------------------------------------------------------------- +# Save and set as wallpaper +# ----------------------------------------------------------------------- +$bmpPath = "C:\Windows\Setup\Scripts\desktopinfo.bmp" +$bmp.Save($bmpPath, [System.Drawing.Imaging.ImageFormat]::Bmp) +$bmp.Dispose() -# Save BMP -`$bmpPath = "$BmpPath" -`$bmp.Save(`$bmpPath, [System.Drawing.Imaging.ImageFormat]::Bmp) -`$bmp.Dispose() - -# Set as wallpaper # SPI_SETDESKTOPWALLPAPER=20, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE=3 -[WallpaperApi]::SystemParametersInfo(20, 0, `$bmpPath, 3) | Out-Null -"@ +[WallpaperApi]::SystemParametersInfo(20, 0, $bmpPath, 3) | Out-Null +'@ $renderContent | Set-Content -Path $RenderScript -Encoding UTF8 -Force Write-Log "Render script written" -Level OK # ----------------------------------------------------------------------- -# Store deployment date in registry (used by render script) +# Store deployment date in registry (used for reference) # ----------------------------------------------------------------------- Write-Log "Storing deployment date in registry" -Level INFO try {