Files
scadalink-design/windev.md
Joseph Doherty 4303f06fc3 docs(lmxproxy): add v2 rebuild design, 7-phase implementation plans, and execution prompt
Design doc covers architecture, v2 protocol (TypedValue/QualityCode), COM threading
model, session lifecycle, subscription semantics, error model, and guardrails.
Implementation plans are detailed enough for autonomous Claude Code execution.
Verified all dev tooling on windev (Grpc.Tools, protobuf-net.Grpc, Polly v8, xUnit).
2026-03-21 23:29:42 -04:00

7.8 KiB

WinDev — Windows Development VM

Remote Windows 10 VM used for development and testing.

  • ESXi host: See esxi.md — VM name WW_DEV_VM on ESXi 8.0.3 at 10.2.0.12
  • Backup: See veeam.md — Veeam B&R 12.3 at 10.100.0.30. Dedicated job "Backup WW_DEV_VM" targeting NAS repo. First restore point (2026-03-21) = Baseline: Win10 + .NET 10 SDK + .NET Fx 4.8 + Git + 7-Zip + Chrome + Claude Code + csharp-ls.

Connection Details

Field Value
Hostname DESKTOP-6JL3KKO
IP 10.100.0.48
OS Windows 10 Enterprise (10.0.19045), 64-bit
CPU Intel Xeon E5-2697 v4 @ 2.30GHz
RAM ~12 GB
Disk C: 235 GB free / 256 GB total
User dohertj2 (local administrator)
SSH OpenSSH Server (passwordless via ed25519 key)
Default shell cmd.exe

SSH Access

Passwordless SSH is configured. An alias windev is set up in ~/.ssh/config.

# Connect
ssh windev

# Run a command
ssh windev "hostname"

# Run PowerShell
ssh windev "powershell -Command \"Get-Process\""

SSH Config Entry (~/.ssh/config)

Host windev
    HostName 10.100.0.48
    User dohertj2
    IdentityFile ~/.ssh/id_ed25519

How Passwordless Auth Works

Since dohertj2 is in the local Administrators group, Windows OpenSSH uses a special authorized keys file instead of the per-user ~/.ssh/authorized_keys:

C:\ProgramData\ssh\administrators_authorized_keys

This is configured in C:\ProgramData\ssh\sshd_config via the Match Group administrators block. If you need to add another key, append it to that file and ensure ACLs are correct:

icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

File Transfer

# Copy file to Windows
scp localfile.txt windev:C:/Users/dohertj2/Desktop/

# Copy file from Windows
scp windev:C:/Users/dohertj2/Desktop/file.txt ./

# Copy directory recursively
scp -r ./mydir windev:C:/Users/dohertj2/Desktop/mydir

Running Commands

The default shell is cmd.exe. For PowerShell, prefix commands explicitly.

# cmd (default)
ssh windev "dir C:\Users\dohertj2"

# PowerShell
ssh windev "powershell -Command \"Get-Service | Where-Object { \$_.Status -eq 'Running' }\""

# Multi-line PowerShell script
ssh windev "powershell -File C:\scripts\myscript.ps1"

Service Management

# List services
ssh windev "sc query state= all"

# Start/stop a service
ssh windev "sc stop ServiceName"
ssh windev "sc start ServiceName"

# Check a specific service
ssh windev "sc query ServiceName"

Process Management

# List processes
ssh windev "tasklist"

# Kill a process
ssh windev "taskkill /F /PID 1234"
ssh windev "taskkill /F /IM process.exe"

Installed Software

Package Manager

Tool Version Install Path
winget v1.28.190 AppX package

The msstore source has been removed (requires interactive agreement acceptance). Only the winget community source is configured. To install packages:

ssh windev "winget install --id <PackageId> --silent --disable-interactivity"

Development Tools

Tool Version Install Path
7-Zip 26.00 (x64) C:\Program Files\7-Zip\
.NET Framework 4.8.1 (Developer Pack) GAC / Reference Assemblies (v4.8.1 ref assemblies present)
.NET SDK 10.0.201 C:\Program Files\dotnet\
.NET Runtime 10.0.5 (Core + ASP.NET + Desktop) C:\Program Files\dotnet\
Git 2.53.0.2 C:\Program Files\Git\
Claude Code 2.1.81 C:\Users\dohertj2\.local\bin\claude.exe

Launch with cc alias (cmd or Git Bash) which runs claude --dangerously-skip-permissions --chrome.

C# LSPcsharp-ls v0.22.0 installed as dotnet global tool (C:\Users\dohertj2\.dotnet\tools\csharp-ls.exe). Configured via the csharp-lsp@claude-plugins-official plugin. Provides goToDefinition, findReferences, hover, documentSymbol, workspaceSymbol, goToImplementation, and call hierarchy operations on .cs files. First invocation in a session is slow (~1-2 min) while the solution loads.

Git is configured with credential.helper=store (not GCM — the bundled Git Credential Manager was removed from system config to avoid OAuth/tty issues over SSH). Credentials are stored in C:\Users\dohertj2\.git-credentials.

Gitea (gitea.dohertylan.com) is pre-authenticated — no login prompts. Clone repos with:

ssh windev "git clone https://gitea.dohertylan.com/dohertj2/<repo>.git C:\src\<repo>"

Applications

App Version Default For
Google Chrome 146.0.7680.154 HTTP, HTTPS, .htm, .html, .pdf
Notepad++ 8.9.2

Defaults set via Group Policy DefaultAssociationsConfiguration pointing to C:\Windows\System32\DefaultAssociations.xml.

Not Installed

  • Gitwinget install Git.Git
  • Pythonwinget install Python.Python.3.12
  • Visual Studiowinget install Microsoft.VisualStudio.2022.BuildTools

Network

Single network interface:

Interface IP
Ethernet0 10.100.0.48 (static)

Other Users with SSH Access

The sshus user also has passwordless SSH access (used for LmxProxy operations). See lmxproxy_protocol.md for details on the LmxProxy service running on this machine.

Backup (Veeam)

Veeam job "Backup WW_DEV_VM" on the Veeam server (10.100.0.30). Targets the NAS repo (nfs41://10.50.0.25:/mnt/mypool/veeam).

# Incremental backup (changed blocks only)
ssh dohertj2@10.100.0.30 "powershell -Command \"Add-PSSnapin VeeamPSSnapin; Connect-VBRServer -Server localhost; Start-VBRJob -Job (Get-VBRJob -Name 'Backup WW_DEV_VM')\""

# Full backup
ssh dohertj2@10.100.0.30 "powershell -Command \"Add-PSSnapin VeeamPSSnapin; Connect-VBRServer -Server localhost; Start-VBRJob -Job (Get-VBRJob -Name 'Backup WW_DEV_VM') -FullBackup\""

# Check status
ssh dohertj2@10.100.0.30 "powershell -Command \"Add-PSSnapin VeeamPSSnapin; Connect-VBRServer -Server localhost; (Get-VBRJob -Name 'Backup WW_DEV_VM').FindLastSession() | Select-Object State, Result, CreationTime, EndTime\""

# List restore points
ssh dohertj2@10.100.0.30 "powershell -Command \"Add-PSSnapin VeeamPSSnapin; Connect-VBRServer -Server localhost; Get-VBRRestorePoint -Backup (Get-VBRBackup -Name 'Backup WW_DEV_VM') | Select-Object CreationTime, Type, @{N='SizeGB';E={[math]::Round(\`$_.ApproxSize/1GB,2)}} | Format-Table -AutoSize\""

Restore Points

ID Date Type Notes
f2cd44a9 2026-03-21 14:28 Full Baseline — Win10 + .NET 10 SDK + .NET Fx 4.8 + Git + 7-Zip + Chrome + Claude Code + csharp-ls (old UUID)
2879a744 2026-03-21 15:15 Increment UUID fixed to 1BFC4D56-8DFA-A897-D1E4-BF1FD7F0096C, static IP 10.100.0.48
b4e87cfe 2026-03-21 16:43 Increment Pre-licensing — Notepad++ added, firewall/Defender disabled, licensing backups staged
f38a8aed 2026-03-21 17:01 Increment Post-licensing — WPS2020 licensing applied and verified working

Troubleshooting

"Permission denied" on SSH key auth

Windows OpenSSH is strict about file permissions on administrators_authorized_keys. Re-run:

icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

Host key changed error

If the VM is rebuilt, clear the old key:

ssh-keygen -R 10.100.0.48

Firewall blocking SSH

If the VM becomes unreachable, RDP in and check Windows Firewall or disable it:

Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False