Files
windows-install/DSC-FileOperations.ps1
EzekialSA 79df17763a Add DSC configurations for user interface, Windows features, and services; implement app installation and removal scripts
- Created `DSC-UserInterfaceConfiguration.ps1` to manage user interface settings via registry changes.
- Developed `DSC-WindowsFeatures.ps1` to install OpenSSH Client and enable NFS Client features.
- Implemented `DSC-WindowsServices.ps1` to ensure Terminal Services are running and set to automatic startup.
- Added `PS-InstallApps.ps1` to manage app installations and remove the msstore source if it exists.
- Created `PS-RemoveApps.ps1` to remove unwanted apps, provisioned packages, and handle Office applications via winget.
2025-09-28 11:59:28 -05:00

256 lines
11 KiB
PowerShell

Configuration FileOperations {
param(
[string]$ScriptDir
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
# Calculate paths outside of Script resources
$FontsPath = Join-Path $ScriptDir "Fonts"
$FastStonePath = Join-Path $ScriptDir "FastStone"
$FirefoxPath = Join-Path $ScriptDir "Firefox\policies.json"
$ShareXAppConfigPath = Join-Path $ScriptDir "ShareX\ApplicationConfig.json"
$ShareXHotkeysPath = Join-Path $ScriptDir "ShareX\HotkeysConfig.json"
$PowerToysPath = Join-Path $ScriptDir "PowerToys\settings_133974244713307595.ptb"
Node localhost {
# === FONT INSTALLATION ===
# Install all Unifont files using Script resource for dynamic paths
Script InstallUnifontFonts {
SetScript = {
$fontSourceFolder = $using:FontsPath
$fontDestFolder = "C:\Windows\Fonts"
$regPath = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts"
# List of font files to install
$fontFiles = @(
"unifont-15.1.05.ttf",
"unifont-all.ttf",
"unifont-smooth.ttf",
"unifont_csur-15.1.05.ttf",
"unifont_jp-15.1.05.ttf",
"unifont_upper-15.1.05.ttf"
)
foreach ($fontFile in $fontFiles) {
$sourcePath = Join-Path $fontSourceFolder $fontFile
$destPath = Join-Path $fontDestFolder $fontFile
$fontName = [System.IO.Path]::GetFileNameWithoutExtension($fontFile)
$regName = "$fontName (TrueType)"
if (Test-Path $sourcePath) {
# Copy font file
if (-not (Test-Path $destPath)) {
Copy-Item -Path $sourcePath -Destination $destPath -Force
Write-Verbose "Copied font: $fontFile"
}
# Register font in registry
try {
$regValue = Get-ItemProperty -Path $regPath -Name $regName -ErrorAction SilentlyContinue
if (-not $regValue) {
New-ItemProperty -Path $regPath -Name $regName -Value $fontFile -PropertyType String -Force | Out-Null
Write-Verbose "Registered font: $regName"
}
}
catch {
Write-Warning "Failed to register font $fontFile in registry: $_"
}
} else {
Write-Warning "Source font file not found: $sourcePath"
}
}
}
TestScript = {
$fontSourceFolder = $using:FontsPath
$fontDestFolder = "C:\Windows\Fonts"
$regPath = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts"
$fontFiles = @(
"unifont-15.1.05.ttf",
"unifont-all.ttf",
"unifont-smooth.ttf",
"unifont_csur-15.1.05.ttf",
"unifont_jp-15.1.05.ttf",
"unifont_upper-15.1.05.ttf"
)
$allInstalled = $true
foreach ($fontFile in $fontFiles) {
$sourcePath = Join-Path $fontSourceFolder $fontFile
$destPath = Join-Path $fontDestFolder $fontFile
$fontName = [System.IO.Path]::GetFileNameWithoutExtension($fontFile)
$regName = "$fontName (TrueType)"
# Check if source exists (skip if not available)
if (Test-Path $sourcePath) {
# Check if font file exists and is registered
$fileExists = Test-Path $destPath
$regExists = $false
try {
$regValue = Get-ItemProperty -Path $regPath -Name $regName -ErrorAction SilentlyContinue
$regExists = ($regValue -ne $null)
}
catch {
$regExists = $false
}
if (-not ($fileExists -and $regExists)) {
$allInstalled = $false
break
}
}
}
return $allInstalled
}
GetScript = {
$fontDestFolder = "C:\Windows\Fonts"
$installedFonts = Get-ChildItem "$fontDestFolder\unifont*.ttf" -ErrorAction SilentlyContinue
return @{Result = "Installed Unifont files: $($installedFonts.Count)"}
}
}
# === APPLICATION CONFIGURATION DEPLOYMENTS ===
# Deploy FastStone Image Viewer configuration
Script DeployFastStoneConfig {
SetScript = {
$sourcePath = $using:FastStonePath
$uid = [System.Environment]::UserName
$destPath = "C:\Users\$uid\AppData\Local\FastStone"
if (Test-Path $sourcePath) {
if (-not (Test-Path $destPath)) {
New-Item -ItemType Directory -Path (Split-Path $destPath) -Force | Out-Null
}
Copy-Item -Path $sourcePath -Destination "C:\Users\$uid\AppData\Local\" -Recurse -Force
Write-Verbose "Deployed FastStone configuration"
}
}
TestScript = {
$uid = [System.Environment]::UserName
$destPath = "C:\Users\$uid\AppData\Local\FastStone"
return (Test-Path $destPath)
}
GetScript = {
$uid = [System.Environment]::UserName
$destPath = "C:\Users\$uid\AppData\Local\FastStone"
return @{
Result = if (Test-Path $destPath) { "Present" } else { "Absent" }
}
}
}
# Deploy Firefox policies
Script DeployFirefoxPolicies {
SetScript = {
$sourceFile = $using:FirefoxPath
$firefoxPath = "C:\Program Files\Mozilla Firefox"
$distributionPath = Join-Path $firefoxPath "distribution"
$destinationFile = Join-Path $distributionPath "policies.json"
if (Test-Path $sourceFile) {
if (-not (Test-Path $distributionPath)) {
New-Item -ItemType Directory -Path $distributionPath -Force | Out-Null
}
Copy-Item -Path $sourceFile -Destination $destinationFile -Force
Write-Verbose "Deployed Firefox policies"
}
}
TestScript = {
$firefoxPath = "C:\Program Files\Mozilla Firefox"
$distributionPath = Join-Path $firefoxPath "distribution"
$destinationFile = Join-Path $distributionPath "policies.json"
return (Test-Path $destinationFile)
}
GetScript = {
$firefoxPath = "C:\Program Files\Mozilla Firefox"
$distributionPath = Join-Path $firefoxPath "distribution"
$destinationFile = Join-Path $distributionPath "policies.json"
return @{
Result = if (Test-Path $destinationFile) { "Present" } else { "Absent" }
}
}
}
# Deploy ShareX configuration
Script DeployShareXConfig {
SetScript = {
$sourceConfigPath = $using:ShareXAppConfigPath
$sourceHotkeyPath = $using:ShareXHotkeysPath
$shareXSettingsDir = "$env:USERPROFILE\Documents\ShareX"
if (-not (Test-Path $shareXSettingsDir)) {
New-Item -ItemType Directory -Path $shareXSettingsDir -Force | Out-Null
}
if (Test-Path $sourceConfigPath) {
$destConfigPath = Join-Path $shareXSettingsDir "ApplicationConfig.json"
Copy-Item -Path $sourceConfigPath -Destination $destConfigPath -Force
Write-Verbose "Deployed ShareX ApplicationConfig.json"
}
if (Test-Path $sourceHotkeyPath) {
$destHotkeyPath = Join-Path $shareXSettingsDir "HotkeysConfig.json"
Copy-Item -Path $sourceHotkeyPath -Destination $destHotkeyPath -Force
Write-Verbose "Deployed ShareX HotkeysConfig.json"
}
}
TestScript = {
$shareXSettingsDir = "$env:USERPROFILE\Documents\ShareX"
$configExists = Test-Path (Join-Path $shareXSettingsDir "ApplicationConfig.json")
$hotkeyExists = Test-Path (Join-Path $shareXSettingsDir "HotkeysConfig.json")
return ($configExists -and $hotkeyExists)
}
GetScript = {
$shareXSettingsDir = "$env:USERPROFILE\Documents\ShareX"
$configExists = Test-Path (Join-Path $shareXSettingsDir "ApplicationConfig.json")
$hotkeyExists = Test-Path (Join-Path $shareXSettingsDir "HotkeysConfig.json")
return @{
Result = if ($configExists -and $hotkeyExists) { "Present" } else { "Absent" }
}
}
}
# Deploy PowerToys settings
Script DeployPowerToysSettings {
SetScript = {
$sourceFile = $using:PowerToysPath
$powerToysSettingsDir = "$env:LOCALAPPDATA\Microsoft\PowerToys"
if (-not (Test-Path $powerToysSettingsDir)) {
New-Item -ItemType Directory -Path $powerToysSettingsDir -Force | Out-Null
}
if (Test-Path $sourceFile) {
$destFile = Join-Path $powerToysSettingsDir "settings.ptb"
Copy-Item -Path $sourceFile -Destination $destFile -Force
Write-Verbose "Deployed PowerToys settings"
}
}
TestScript = {
$powerToysSettingsDir = "$env:LOCALAPPDATA\Microsoft\PowerToys"
$settingsFile = Join-Path $powerToysSettingsDir "settings.ptb"
return (Test-Path $settingsFile)
}
GetScript = {
$powerToysSettingsDir = "$env:LOCALAPPDATA\Microsoft\PowerToys"
$settingsFile = Join-Path $powerToysSettingsDir "settings.ptb"
return @{
Result = if (Test-Path $settingsFile) { "Present" } else { "Absent" }
}
}
}
}
}
# Generate the MOF file
$outputPath = "$env:TEMP\DSC\FileOperations"
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
FileOperations -ScriptDir $scriptDir -OutputPath $outputPath
# Apply the configuration
Start-DscConfiguration -Path $outputPath -Wait -Verbose -Force