Windows 使用技巧
点击展开更新日志
2025
04-12
如何删除 Windows 远程桌面连接历史记录
04-20
新增:
更改 RDP 默认端口
禁用用户登录
10-06
【新增】OpenSSH 章节
nexttime
会有些什么呢(❁´◡`❁)
¶删除 Windows 远程桌面连接历史记录
¶源起
⚠️: 我在删除之后,遇到了一些bug:
- 任务栏错位
- 资源管理器存在黑块
不确定是否是由删除这玩意导致的,建议先备份,真有问题了也能还原(你问我备份呢?这不是忘记了嘛😿)
因为在局域网会远程连接笔记本,原本是 192.168.2.0/24 的网段,最近(4月7日-9日)心血来潮,将局域网网段更换为了新的网段,不想每次远程时还留着旧的连接记录,因此想要删掉。
¶注册表删除
-
打开注册表编辑器
Win + R打开运行,输入regedit打开注册表编辑器。 -
备份注册表
左上角选择【文件】-【导出】备份注册表(ps: 建议不定期备份注册表)。 -
删除历史记录
进入到HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client, 展开- Default:展开可以看到远程连接记录,右键【名称】删除不需要的记录
- Servers:展开可以看到包含远程连接记录的目录,删除不需要的目录
¶更改远程桌面端口号
Windows RDP 默认端口号为 3389 ,如果觉得没必要的话不需要修改。
-
开启远程桌面
- 方式一:进入【设置】-【系统】-【远程桌面】,开启功能。
- 方式二:【控制面板】-【系统和安全】-【系统】下方【允许远程访问】,勾选远程桌面标签框中的允许远程连接到此计算机
-
修改默认端口
打开注册表编辑器:
Win+R输入regedit回车,- 修改路径
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp下PortNumber值,选择十进制,修改为新的端口号,比如22333; - 修改路径
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp下PortNumber值,选择十进制,修改为新的端口号,比如22333; - 退出注册表编辑器;
- 重启系统生效。
第一条路径
\Wds\rdpwd\Tds\tcp:PortNumber键值负责底层网络协议栈的端口监听,属于远程桌面服务的基础网络层配置。它定义了RDP服务通过TCP协议监听的具体端口号,确保客户端能通过该端口发起连接请求
第二条路径
\WinStations\RDP-Tcp:PortNumber键值控制会话管理层的端口配置,属于应用层设置。它定义了RDP会话建立后数据传输的端口规则,包括用户认证、会话分配等功能。
只修改第二项也可以使用,但建议还是都修改。
- 修改路径
-
配置入站规则
打开【高级安全Windows Defender防火墙】,选择到左侧【入站规则】,创建两条
22333/TCP和22333/UDP的规则,限专用网络。 -
(可选)禁用默认端口规则
在防火墙入站规则配置页面,找到"远程桌面-用户模式(TCP-In)",禁用。
-
验证。
¶禁用用户登录
此需求的起因是因为将 WS2022 作为文件服务器使用需要共享给其他设备使用,但是又不想直接使用 Admin 用户,因此用此方法,如果觉得只是自己用用管理员账号倒也没什么问题,只是我又强迫症。。。
Win+R输入gpedit.msc打开组策略编辑器,进入【计算机配置】-【Windows设置】-【安全设置】-【本地策略】-【用户权限分配】- 将拒绝本地登录和拒绝通过远程桌面登录服务器两项添加共享用户;
- 重启服务器生效。
¶自定义添加服务
如果要将自定义程序添加成 Windows 服务,可以用自带的 sc 命令。
sc 是用来与服务控制管理器和服务进行通信的命令行程序,具体可以在 cmd 直接输入 sc 查看详细信息。如果要查看子命令信息,比如 create,可以使用 sc create 查看语法和参数信息。
添加服务
1 | sc <server> create [service name] [binPath= ] <option1> <option2>... |
- server:服务器地址,本地添加不需要
- service name:服务名,命令行中使用的名称
- displayname:服务管理台显示的名称
- binPath:应用程序路径
注意参数和等号之间没有空格,但是等号和值之间有一个空格。
选项大小写不敏感,binPath和binpath是一样的。
以将 C:\Users\admin\Documents\configs\windows exporter 目录下的 windows_exporter-0.31.3-amd64.exe 为例,正常启动命令为 windows_exporter-0.31.3-amd64.exe --config.file=config.yml,因此:
1 | sc create windows_exporter binPath= "\"C:\Users\admin\Documents\configs\windows exporter\windows_exporter-0.31.3-amd64.exe\" --config.file=\"C:\Users\admin\Documents\configs\windows exporter\config.yml\"" start= auto displayname= windows_exporter |
因为绝对路径中存在空格,因此需要使用引号,并做了转义。
如果添加之后发现启动不了,可以先把完整命令在cmd执行一遍看看报错
添加成功之后就可以在 Windows 服务管理台看到了。
删除服务
1 | sc delete windows_exporter |
¶OpenSSH
¶源起
这个也是需求驱动,正如之前在文章 MCP 镜像构建 提到,主机A上并没有安装 Docker Desktop,因此需要将代码拷贝到有 Docker 环境的 Mini 主机B,目前已经实现的基本流程是:
- 主机A:PyCharm开发调试 ✅
- 主机A:PyCharm 中又写了一个脚本同步代码到主机B——smb ✅
- 主机B:到项目目录下构建最新镜像,并重新创建容器 ❎
第三步目前还需要手动登录到主机B进行操作,因此想着借助 n8n 进行半自动化。要实现的效果,手动点击流程自动完成新镜像构建和部署,那要怎么操作呢,那就是这一节的主要内容了。
¶方式
根据元宝的回答,远程 Windows 执行命令有以下方式:
- 基于内置远程协议
- WinRM(Windows Remote Management):内置远程管理服务,支持 PowerShell 命令执行
- WMI(Windows Management Instrunebtation)
- 基于SSH 选择这种
为什么选择 SSH 的方式,因为:
- 类似 Linux 上的方式,操作起来有一定熟练度;
- 手动在主机B上打开的命令行工具是 Git bash,因此偏向于 Linux 命令行方式;
- Win 11内置支持(不过不包含服务端,还是得自己安装)
另外两种方式暂不做深究,因为目前实现的效果已经满足预期,不做扩展,因此如果有需要,请自行探索。
¶概要
OpenSSH 是 Linux 管理员和其他非 Windows 用于跨平台管理远程系统的安全外壳(SSH)工具的开源版本。 从 Windows 10 内部版本 1809 和 Windows Server 2019 开始,OpenSSH 作为按需功能提供。资料来源-Microsoft Learn
使用前提:
- 系统:支持 Win10(1809+),Windows Server 2019 及以上版本,如果是其它版本,本文仅作参考,下面提及的命令可能会有报错,请善于使用搜索引擎及AI。
- PowerShell >= 5.1:执行
$PSVersionTable.PSVersion检查主要和次要版本号(Win11默认的版本就是5.1,7版本需要自己安装) - 账户:内置管理员组。我这里用的是本地管理员,不确定微软账户是否可用,知悉。
¶安装服务器和客户端
参考资料:
GUI
官方介绍说【可选功能】里有,但是我没找到。。
PowerShell
以管理员身份运行 PowerShell
-
检查 OpenSSH 状态:
1
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
输出类似:
1
2
3
4
5Name : OpenSSH.Client~~~~0.0.1.0
State : NotPresent
Name : OpenSSH.Server~~~~0.0.1.0
State : NotPresent -
安装服务端或客户端:Win11 默认已安装客户端,没有服务端
1
2
3
4
5# Install the OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 -
启动服务
1
2
3
4
5
6
7
8
9
10
11
12
13# 启动 sshd 服务,通过【服务】进入也是一样的,名称是 OpenSSH SSH Server
Start-Service sshd
# 设置服务为开机自启:推荐
Set-Service -Name sshd -StartupType 'Automatic'
# 配置防火墙规则,应该会自动配置,可以执行下面的命令检查一下
if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue)) {
Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
} else {
Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
} -
修改默认 shell
远程登录默认的 shell 是 PowerShell,用起来不太方便,因此这里选择更改为
git bash:1
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\Git\bin\bash.exe" -PropertyType String -Force
另一种写法:
1
2
3
4
5
6
7
8$NewItemPropertyParams = @{
Path = "HKLM:\SOFTWARE\OpenSSH"
Name = "DefaultShell"
Value = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
PropertyType = "String"
Force = $true
}
New-ItemProperty @NewItemPropertyParams
¶连接
连接方式就和 Linux 类似了,比如:
1 | ssh [email protected] |
如果是加域服务器,在用户名前加上域名:
1 | ssh domain\username@servername |
此时应该是可以从另一台机器远程连接到服务器,使用账号密码的方式。
¶卸载服务器和客户端
以管理员身份运行 PowerShell
-
删除 OpenSSH:
1
2
3
4
5# Uninstall the OpenSSH Client
Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
# Uninstall the OpenSSH Server
Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 -
删除防火墙规则:
1
2
3
4
5
6if ((Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue)) {
Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' is being removed."
Remove-NetFirewallRule -Name 'OpenSSH-Server-In-TCP'
} else {
Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, removal failed..."
}
如果卸载服务时正在使用该服务,则应重启 Windows。
¶注意事项
¶密钥认证
~~关于密钥认证还没弄明白,就不卖弄了,算是一个遗留问题,后续补充吧。~~刚说完又试了下就弄好了,不愧是我。
-
生成密钥对:随便找台机器,打开命令行,以
Git bash为例:1
ssh-keygen -t rsa -b 4096 -m pem
具体可以参考 密钥对生成, 建议是使用
ed25519算法,但是因为我需要在 n8n 中使用,试过ed25519会报错不支持,且不支持添加密码,只能使用 pem 编码的 rsa 算法。如果一路回车会在
~/.ssh/id_rsa下生成密钥对。 -
部署公钥
- 标准用户:将
id_rsa.pub公钥中的内容拷贝到用户目录%USERPROFILE%/.ssh/authorized_keys1
2
3
4
5
6
7
8# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
# Generate the PowerShell command to run remotely that copies the public key file generated previously on your client to the authorized_keys file on your server.
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"
# Connect to your server and run the PowerShell command by using the $remotePowerShell variable.
ssh username@[email protected] $remotePowershell - 管理用户:将
id_rsa.pub公钥中的内容复制到%ProgramDATA%/ssh/administrators_authorized_keys1
2
3
4
5
6
7
8# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
# Generate the PowerShell command to run remotely that copies the public key file generated previously on your client to the authorized_keys file on your server.
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""Administrators:F"" /grant ""SYSTEM:F"""
# Connect to your server and run the PowerShell command by using the $remotePowerShell variable.
ssh username@[email protected] $remotePowershell
- 标准用户:将
-
部署私钥
将
id_rsa中的内容拷贝到另一台 Windows 的~/.ssh/id_rsa_pem文件(文件名自定),修改~/.ssh/config文件,新增一条配置,参考:SSH 客户端配置我这里就是直接把私钥添加到 n8n 的凭据中做一下验证了。
-
验证
打开一个终端直接
ssh hostname看是否可以免密登录,如果还是需要密码说明密钥对没有配置正确。
¶遇到的问题
¶远程 docker build 无法使用
- 问题描述:远程连接 Windows OpenSSH 服务器后,使用
docker build命令会报错:error storing credentials - 服务器环境:
- 系统:Win11 24H2 26100.6584
- Docker 版本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28$ docker version
Client:
Version: 28.4.0
API version: 1.51
Go version: go1.24.7
Git commit: d8eb465
Built: Wed Sep 3 20:59:40 2025
OS/Arch: windows/amd64
Context: default
Server: Docker Desktop 4.47.0 (206054)
Engine:
Version: 28.4.0
API version: 1.51 (minimum version 1.24)
Go version: go1.24.7
Git commit: 249d679
Built: Wed Sep 3 20:57:37 2025
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.27
GitCommit: 05044ec0a9a75232cad458027ca83437aae3f4da
runc:
Version: 1.2.5
GitCommit: v1.2.5-0-g59923ef
docker-init:
Version: 0.19.0
GitCommit: de40ad0
- 原因:不知道
- 排查过程:首先怀疑是 n8n 的问题,但是从另一台 Windows 测试也存在,从服务器本地执行一切正常,因此锁定是 OpenSSH 远程的问题,拿报错日志给 DeepSeek 未得到有效方法,在 Edge 上以
windows openssh docker关键字搜索到相关问题 issues,另外几个相关的 issues 也都指向了这里,提供了解决方法。 - 解决方案:
-
修改
C:\Users\<User>\.docker\config.json配置内容如下:1
2
3
4
5
6
7
8
9{
"auths": {
"https://index.docker.io/v1/": {
"auth": "F876fFfefgfes78fefe78feshfes=="
}
},
"credsStore": "",
"currentContext": "default"
}- 修改前提前备份配置!!!
- 已有内容不需要做删除,没有的新增,有的按照上面修改
auth字段的值是 Dockerusername:password的 base64 编码,可以使用echo -n "username:password" | openssl base64生成,但不建议(base64 可以解码,不安全)。推荐网页登录docker 获取 PAT(Personal access tokens) 之后,按照指引从命令行进行登录,配置文件会自动生成 token,比如:
1
docker login --username <username>
- 修改配置之后重启 Docker Desktop
-




