diff --git a/Makefile b/Makefile
index 4aca6840cf..614f1d66ef 100644
--- a/Makefile
+++ b/Makefile
@@ -207,7 +207,6 @@ endif
 # win-sshproxy is checked out manually to keep from pulling in gvisor and it's transitive
 # dependencies. This is only used for the Windows client archives, which must
 # include this lightweight helper binary.
-#
 GV_GITURL=https://github.com/containers/gvisor-tap-vsock.git
 GV_SHA=db608827124caa71ba411cec8ea959bb942984fe
 
diff --git a/winmake.ps1 b/winmake.ps1
index 1c390b0801..56a29c3c00 100644
--- a/winmake.ps1
+++ b/winmake.ps1
@@ -2,7 +2,7 @@ $ErrorActionPreference = 'Stop'
 
 # Targets
 function Podman-Remote{
-    New-Item  ./bin/windows -ItemType Directory -ea 0
+    New-Item -ItemType Directory -Force -Path "./bin/windows"
 
     $buildInfo = Get-Date -UFormat %s -Millisecond 0
     $buildInfo = "-X github.com/containers/podman/v4/libpod/define.buildInfo=$buildInfo "
@@ -28,6 +28,49 @@ function Local-Machine {
     Run-Command "./test/tools/build/ginkgo.exe -vv  --tags `"$remotetags`" -timeout=90m --trace --no-color $files pkg/machine/e2e/. "
 }
 
+# Expect starting directory to be /podman
+function Win-SSHProxy {
+    param (
+        [string]$Ref
+    );
+
+    # git is not installed by default on windows
+    # fail if git doesn't exist
+    Get-Command git -ErrorAction SilentlyContinue  | out-null
+    if(!$?){
+        Write-Host "Git not installed, cannot build Win-SSHProxy"
+        Exit 1
+    }
+
+    if (Test-Path ./tmp-gv) {
+        Remove-Item ./tmp-gv -Recurse -Force -Confirm:$false
+    }
+
+    $GV_GITURL = "https://github.com/containers/gvisor-tap-vsock.git"
+
+    New-Item  ./tmp-gv -ItemType Directory -ea 0
+    Push-Location ./tmp-gv
+    Run-Command "git init"
+    Run-Command "git remote add origin $GV_GITURL"
+    Run-Command "git fetch --depth 1 origin main"
+    Run-Command "git fetch --depth 1 --tags"
+    Run-Command "git checkout main"
+    if (-Not $Ref) {
+        Write-Host "empty"
+        $Ref = git describe --abbrev=0
+    }
+    Run-Command "git checkout $Ref"
+    Run-Command "go build -ldflags -H=windowsgui -o bin/win-sshproxy.exe ./cmd/win-sshproxy"
+    Run-Command "go build -ldflags -H=windowsgui -o bin/gvproxy.exe ./cmd/gvproxy"
+    Pop-Location
+
+    # Move location to ./bin/windows for packaging script and for Windows binary testing
+    New-Item -ItemType Directory -Force -Path "./bin/windows"
+    Copy-Item -Path "tmp-gv/bin/win-sshproxy.exe" -Destination "./bin/windows/"
+    Copy-Item -Path "tmp-gv/bin/gvproxy.exe" -Destination "./bin/windows/"
+    Remove-Item ./tmp-gv -Recurse -Force -Confirm:$false
+}
+
 # Helpers
 function Build-Ginkgo{
     if (Test-Path -Path ./test/tools/build/ginkgo.exe -PathType Leaf) {
@@ -48,10 +91,10 @@ function Git-Commit{
     }
     $commit = git rev-parse HEAD
     $dirty = git status --porcelain --untracked-files=no
-     if ($dirty){
+    if ($dirty){
         $commit = "$commit-dirty"
-     }
-     return $commit
+    }
+    return $commit
 }
 
 function Run-Command {
@@ -88,6 +131,12 @@ switch ($target) {
     'clean' {
         Make-Clean
     }
+    'win-sshproxy' {
+        if ($args.Count -gt 1) {
+            $ref = $args[1]
+        }
+        Win-SSHProxy -Ref $ref
+    }
     default {
         Write-Host "Usage: " $MyInvocation.MyCommand.Name "<target> [options]"
         Write-Host