You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows服务中运行SSH时实现FIDO身份验证器的用户在场检测交互?

如何在Windows服务中运行SSH时实现FIDO身份验证器的用户在场检测交互?

我太懂你这个困扰了——用Windows服务管理SSH隧道十年都顺风顺水,结果换了FIDO密钥就卡在服务模式下的用户触摸验证这一步,确实闹心。结合你贴的日志和尝试的方案,核心问题其实是Windows服务的会话隔离限制:服务默认跑在会话0里,和用户的桌面会话(通常是会话1及以后)完全隔离,既没法弹出验证提示,也没法直接触发FIDO设备的触摸交互,不管是微软OpenSSH还是Cygwin版本,日志里的cannot notify: no display就是最直接的证据。

下面给你几个可行的解决思路,你可以根据自己的场景选:

1. 给服务配置用户会话权限(快速尝试,但有安全风险)

新版Windows虽然弱化了“允许服务与桌面交互”的选项,但还是可以通过命令行给服务配置成以登录用户身份运行,让它进入用户会话:

# 替换成你的服务名、用户账号和密码,注意参数后的空格!
sc config YourSSHTunnelService obj= DOMAIN\YourUserName password= YourPassword type= own interact= yes

不过这个方法有两个问题:一是密码明文写在命令里不安全,二是新版Windows对会话0的隔离限制越来越严,可能还是没法触发FIDO的触摸提示,只能作为快速测试方案。

2. 改用任务计划程序替代Windows服务(最省心的方案)

任务计划程序可以直接让程序运行在用户会话里,完美避开会话隔离的问题:

  • 打开「任务计划程序」,创建新任务
  • 触发器选「用户登录时」(如果需要开机就启动,不要选「不管用户是否登录都运行」,否则还是会回到会话0)
  • 操作选「启动程序」,填入你的autossh/SSH命令(比如autossh -M 0 -N -L 本地端口:目标地址:目标端口 远程用户@远程服务器)
  • 设置里勾选「如果任务失败,重新启动」,模拟服务的自动重启特性

这样每次用户登录后,SSH隧道就会自动启动,而且运行在用户会话里,能正常弹出FIDO的触摸提示,和你交互式运行的效果完全一样。

3. 遵循微软推荐:服务+桌面交互代理(规范的长期方案)

微软官方确实推荐这种模式——后台服务负责核心逻辑,桌面程序专门处理用户交互:

  • 写一个轻量的桌面程序,开机自动启动(放在用户的启动文件夹里),后台运行在用户会话中
  • 服务和桌面程序通过命名管道或本地TCP套接字通信
  • 当服务需要FIDO签名时,把签名请求发送给桌面程序
  • 桌面程序接收到请求后,弹出提示(比如用系统通知或简单窗口),调用ssh-sk-helper或者直接用FIDO相关库触发用户触摸验证,完成后把签名结果返回给服务

这个方案更规范,适合需要严格区分后台服务和用户交互的场景,但需要一点编程能力,不过逻辑不算复杂。

关于SSH Agent的补充说明

你尝试用SSH Agent没成功,是因为Agent通常运行在用户会话里,服务在会话0根本访问不到用户会话的Agent套接字;就算把Agent也做成服务,它同样没法触发用户交互。如果想用Agent的话,得结合上面的方法1或3,让服务和Agent处在同一个用户会话里才行。

备注:内容来源于stack exchange,提问作者Irfy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 13:14:33