mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-02-24 04:00:02 +01:00
add script parameters to add user, machine, and devices names, default is to not include. (#44880)
## Summary of the Pull Request Update the screen capture/layout powershell script to NOT include user name, machine name, and device names - these can be added into the output JSON file using new command line parameters - also added '-help'. <!-- Please review the items on the PR checklist before submitting--> - [ ] Closes: #xxx <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed Ran the script locally with each of the new command line parameters and validated the json output.
This commit is contained in:
@@ -7,22 +7,62 @@
|
||||
Queries Windows for all connected monitors and saves their configuration
|
||||
(position, size, DPI, primary status) to a JSON file that can be used
|
||||
for testing the CursorWrap module.
|
||||
|
||||
By default, potentially identifying information (computer name, user name,
|
||||
device names) is anonymized to protect privacy when sharing layout files.
|
||||
|
||||
.PARAMETER OutputPath
|
||||
Path where the JSON file will be saved. Default: monitor_layout.json
|
||||
Path where the JSON file will be saved. Default: cursorwrap_monitor_layout.json
|
||||
|
||||
.PARAMETER AddUserMachineNames
|
||||
Include computer name and user name in the output. By default these are
|
||||
blank to protect privacy when sharing layout files.
|
||||
|
||||
.PARAMETER AddDeviceNames
|
||||
Include device names (e.g., \\.\DISPLAY1) in the output. By default these
|
||||
are anonymized to "DISPLAY1", "DISPLAY2", etc. to reduce fingerprinting.
|
||||
|
||||
.PARAMETER Help
|
||||
Show this help message and exit.
|
||||
|
||||
.EXAMPLE
|
||||
.\Capture-MonitorLayout.ps1
|
||||
Captures layout with privacy-safe defaults (no user/machine names).
|
||||
|
||||
.EXAMPLE
|
||||
.\Capture-MonitorLayout.ps1 -OutputPath "my_setup.json"
|
||||
Saves to a custom filename.
|
||||
|
||||
.EXAMPLE
|
||||
.\Capture-MonitorLayout.ps1 -AddUserMachineNames
|
||||
Includes computer name and user name in the output.
|
||||
|
||||
.EXAMPLE
|
||||
.\Capture-MonitorLayout.ps1 -AddUserMachineNames -AddDeviceNames
|
||||
Includes all identifying information (useful for personal debugging).
|
||||
#>
|
||||
|
||||
param(
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]$OutputPath = "$($env:USERNAME)_monitor_layout.json"
|
||||
[string]$OutputPath = "cursorwrap_monitor_layout.json",
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[switch]$AddUserMachineNames,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[switch]$AddDeviceNames,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[Alias("h", "?")]
|
||||
[switch]$Help
|
||||
)
|
||||
|
||||
# Show help if requested
|
||||
if ($Help) {
|
||||
Get-Help $MyInvocation.MyCommand.Path -Detailed
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Add Windows Forms for screen enumeration
|
||||
Add-Type -AssemblyName System.Windows.Forms
|
||||
|
||||
@@ -137,12 +177,20 @@ function Capture-MonitorLayout {
|
||||
|
||||
$screens = [System.Windows.Forms.Screen]::AllScreens
|
||||
$monitors = @()
|
||||
|
||||
$monitorIndex = 1
|
||||
|
||||
foreach ($screen in $screens) {
|
||||
$isPrimary = $screen.Primary
|
||||
$bounds = $screen.Bounds
|
||||
$dpi = Get-MonitorDPI -Screen $screen
|
||||
|
||||
# Anonymize device name by default to reduce fingerprinting
|
||||
$deviceName = if ($AddDeviceNames) {
|
||||
$screen.DeviceName
|
||||
} else {
|
||||
"DISPLAY$monitorIndex"
|
||||
}
|
||||
|
||||
$monitor = [ordered]@{
|
||||
left = $bounds.Left
|
||||
top = $bounds.Top
|
||||
@@ -153,10 +201,11 @@ function Capture-MonitorLayout {
|
||||
dpi = $dpi
|
||||
scaling_percent = [math]::Round(($dpi / 96.0) * 100, 0)
|
||||
primary = $isPrimary
|
||||
device_name = $screen.DeviceName
|
||||
device_name = $deviceName
|
||||
}
|
||||
|
||||
$monitors += $monitor
|
||||
$monitorIndex++
|
||||
|
||||
# Display info
|
||||
$primaryTag = if ($isPrimary) { " [PRIMARY]" } else { "" }
|
||||
@@ -170,11 +219,11 @@ function Capture-MonitorLayout {
|
||||
Write-Host " Bounds: [$($bounds.Left), $($bounds.Top), $($bounds.Right), $($bounds.Bottom)]"
|
||||
}
|
||||
|
||||
# Create output object
|
||||
# Create output object with privacy-safe defaults
|
||||
$output = [ordered]@{
|
||||
captured_at = (Get-Date -Format "yyyy-MM-ddTHH:mm:sszzz")
|
||||
computer_name = $env:COMPUTERNAME
|
||||
user_name = $env:USERNAME
|
||||
computer_name = if ($AddUserMachineNames) { $env:COMPUTERNAME } else { "" }
|
||||
user_name = if ($AddUserMachineNames) { $env:USERNAME } else { "" }
|
||||
monitor_count = $monitors.Count
|
||||
monitors = $monitors
|
||||
}
|
||||
@@ -200,10 +249,22 @@ try {
|
||||
Write-Host "`n" + ("=" * 80)
|
||||
Write-Host "SUMMARY" -ForegroundColor Cyan
|
||||
Write-Host ("=" * 80)
|
||||
Write-Host "Configuration Name: $($layout.computer_name)"
|
||||
if ($layout.computer_name) {
|
||||
Write-Host "Configuration Name: $($layout.computer_name)"
|
||||
}
|
||||
Write-Host "Captured: $($layout.captured_at)"
|
||||
Write-Host "Monitors: $($layout.monitor_count)"
|
||||
|
||||
# Privacy notice
|
||||
if (-not $AddUserMachineNames -or -not $AddDeviceNames) {
|
||||
Write-Host "`nPrivacy: " -NoNewline -ForegroundColor Yellow
|
||||
$privacyNotes = @()
|
||||
if (-not $AddUserMachineNames) { $privacyNotes += "user/machine names excluded" }
|
||||
if (-not $AddDeviceNames) { $privacyNotes += "device names anonymized" }
|
||||
Write-Host ($privacyNotes -join ", ") -ForegroundColor Yellow
|
||||
Write-Host " Use -AddUserMachineNames and/or -AddDeviceNames to include." -ForegroundColor DarkGray
|
||||
}
|
||||
|
||||
# Calculate desktop dimensions
|
||||
$widths = @($layout.monitors | ForEach-Object { $_.width })
|
||||
$heights = @($layout.monitors | ForEach-Object { $_.height })
|
||||
|
||||
Reference in New Issue
Block a user