From 7cfa4d443c009e26a2bc739915e023efbdbe00a0 Mon Sep 17 00:00:00 2001 From: Mike Hall Date: Wed, 21 Jan 2026 12:58:00 +0000 Subject: [PATCH] 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'. - [ ] Closes: #xxx - [ ] **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 ## Detailed Description of the Pull Request / Additional comments ## Validation Steps Performed Ran the script locally with each of the new command line parameters and validated the json output. --- .../CursorWrapTests/Capture-MonitorLayout.ps1 | 77 +++++++++++++++++-- 1 file changed, 69 insertions(+), 8 deletions(-) diff --git a/src/modules/MouseUtils/CursorWrap/CursorWrapTests/Capture-MonitorLayout.ps1 b/src/modules/MouseUtils/CursorWrap/CursorWrapTests/Capture-MonitorLayout.ps1 index 6d6e3da528..10c0f252f3 100644 --- a/src/modules/MouseUtils/CursorWrap/CursorWrapTests/Capture-MonitorLayout.ps1 +++ b/src/modules/MouseUtils/CursorWrap/CursorWrapTests/Capture-MonitorLayout.ps1 @@ -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 })