167
New-SamyPrinterProfileJson.ps1
Normal file
167
New-SamyPrinterProfileJson.ps1
Normal file
@@ -0,0 +1,167 @@
|
||||
function New-SamyPrinterProfileJson {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Generates a SAMY printer profile JSON template from existing printers
|
||||
and optionally uploads it to a Git (Gitea) repository.
|
||||
|
||||
.DESCRIPTION
|
||||
Enumerates local printers via Get-Printer, maps them into SAMY printer
|
||||
profile objects, and writes them to a JSON file. The JSON is intended
|
||||
as a starting point / template for building printers.json used by SAMY.
|
||||
|
||||
Each profile includes:
|
||||
- ClientCode (from parameter)
|
||||
- Location (from parameter)
|
||||
- ProfileName (defaults to printer Name)
|
||||
- DisplayName (printer Name)
|
||||
- Type (TcpIp or Shared, best-effort guess)
|
||||
- Address (for TCP/IP printers)
|
||||
- PrintServer (for shared printers)
|
||||
- ShareName (for shared printers)
|
||||
- DriverName (printer DriverName)
|
||||
- DriverInfPath, DriverPackagePath, DriverInfName (empty placeholders)
|
||||
- IsDefault (true if this printer is default)
|
||||
|
||||
Optionally, the generated JSON can be uploaded to a Git repo using
|
||||
a personal access token (PAT) passed as a SecureString.
|
||||
|
||||
.PARAMETER ClientCode
|
||||
MSP/client code to stamp into each profile (for example "SVS").
|
||||
|
||||
.PARAMETER Location
|
||||
Human-friendly location (for example "Embrun"). Used both as a field in
|
||||
each profile and as part of the default JSON file name.
|
||||
|
||||
.PARAMETER OutputPath
|
||||
Folder where the JSON file will be saved. Default is:
|
||||
C:\ProgramData\SVS\Samy\Printers
|
||||
|
||||
.PARAMETER UploadToGit
|
||||
When set, the function will attempt to upload the generated JSON file
|
||||
to the specified Git (Gitea) repository and path.
|
||||
|
||||
.PARAMETER GitApiBase
|
||||
Base URL for the Git API, for example:
|
||||
https://git.svstools.ca/api/v1
|
||||
|
||||
.PARAMETER GitRepo
|
||||
Repository identifier in the form "Owner/Repo", for example:
|
||||
SVS_Public_Repo/SAMY
|
||||
|
||||
.PARAMETER GitBranch
|
||||
Branch name to write to. Default is "beta".
|
||||
|
||||
.PARAMETER GitPath
|
||||
Path inside the repo where the JSON should be written, for example:
|
||||
Printers/SVS/Embrun/printers.json
|
||||
|
||||
.PARAMETER GitToken
|
||||
Personal access token as a SecureString. Recommended source:
|
||||
a secret environment variable (for example $env:GIT_PAT) converted via
|
||||
ConvertTo-SecureString.
|
||||
|
||||
.EXAMPLE
|
||||
New-SamyPrinterProfileJson -ClientCode "SVS" -Location "Embrun"
|
||||
|
||||
Generates a printers_SVS_Embrun.json in:
|
||||
C:\ProgramData\SVS\Samy\Printers
|
||||
|
||||
.EXAMPLE
|
||||
$secureToken = ConvertTo-SecureString $env:GIT_PAT -AsPlainText -Force
|
||||
|
||||
New-SamyPrinterProfileJson `
|
||||
-ClientCode "SVS" `
|
||||
-Location "Embrun" `
|
||||
-UploadToGit `
|
||||
-GitApiBase "https://git.svstools.ca/api/v1" `
|
||||
-GitRepo "SVS_Public_Repo/SAMY" `
|
||||
-GitBranch "beta" `
|
||||
-GitPath "Printers/SVS/Embrun/printers.json" `
|
||||
-GitToken $secureToken
|
||||
|
||||
Generates the JSON locally and uploads it to the specified path
|
||||
in the Git repository.
|
||||
#>
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$ClientCode,
|
||||
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Location,
|
||||
|
||||
[string]$OutputPath = "C:\ProgramData\SVS\Samy\Printers",
|
||||
|
||||
[switch]$UploadToGit,
|
||||
|
||||
[string]$GitApiBase,
|
||||
[string]$GitRepo,
|
||||
[string]$GitBranch = "beta",
|
||||
[string]$GitPath,
|
||||
[SecureString]$GitToken
|
||||
)
|
||||
|
||||
try {
|
||||
Write-Log "Starting New-SamyPrinterProfileJson for ClientCode='$ClientCode' Location='$Location'." "Info" "PrinterJson" -LogToEvent
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# 1) Ensure output folder exists and build a safe file name
|
||||
# ------------------------------------------------------------------
|
||||
if (-not (Test-Path $OutputPath)) {
|
||||
Write-Log "Creating output folder '$OutputPath'." "Info" "PrinterJson" -LogToEvent
|
||||
New-Item -Path $OutputPath -ItemType Directory -Force | Out-Null
|
||||
}
|
||||
|
||||
$safeLocation = $Location -replace '[^A-Za-z0-9_-]', '_'
|
||||
$fileName = "printers_{0}_{1}.json" -f $ClientCode, $safeLocation
|
||||
$filePath = Join-Path $OutputPath $fileName
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# 2) Enumerate printers and build profile objects
|
||||
# ------------------------------------------------------------------
|
||||
$printers = Get-Printer -ErrorAction SilentlyContinue
|
||||
|
||||
if (-not $printers) {
|
||||
Write-Log "No printers found on this system. JSON will be empty." "Warning" "PrinterJson" -LogToEvent
|
||||
} else {
|
||||
Write-Log ("Found {0} printer(s)." -f $printers.Count) "Info" "PrinterJson" -LogToEvent
|
||||
}
|
||||
|
||||
$profiles = @()
|
||||
|
||||
foreach ($p in $printers) {
|
||||
$profileName = $p.Name
|
||||
$displayName = $p.Name
|
||||
$driverName = $p.DriverName
|
||||
$portName = $p.PortName
|
||||
$isDefault = $p.Shared -eq $false -and $p.Default -eq $true
|
||||
|
||||
# Try to resolve port details
|
||||
$port = $null
|
||||
if ($portName) {
|
||||
$port = Get-PrinterPort -Name $portName -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
$type = "TcpIp"
|
||||
$address = $null
|
||||
$printServer = $null
|
||||
$shareName = $null
|
||||
|
||||
if ($port -and $port.PrinterHostAddress) {
|
||||
# Standard TCP/IP port
|
||||
$type = "TcpIp"
|
||||
$address = $port.PrinterHostAddress
|
||||
}
|
||||
elseif ($p.Shared -and $p.ShareName) {
|
||||
# Best guess at a shared printer
|
||||
$type = "Shared"
|
||||
$shareName = $p.ShareName
|
||||
$printServer = $env:COMPUTERNAME
|
||||
}
|
||||
|
||||
$profiles += [PSCustomObject]@{
|
||||
ClientCode = $ClientCode
|
||||
Location = $Location
|
||||
|
||||
ProfileName = $profileName
|
||||
DisplayName = $displayName
|
||||
Reference in New Issue
Block a user