dsh-powershell:让 DSH Agent 直接跑 PowerShell 命令

前言

在 Windows 上让 DeepSeek Harness(DSH)里的 agent 执行系统操作,常见做法是写 .ps1 再调用。一条简单的查询也要先落盘脚本,交互成本高。内置工具有 pwsh,但同名注册会抢插件、且 elevated: true 会被静默忽略,提权失败看起来像普通权限报错,排查困难。

dsh-powershell 由维护者 a5899 发布,分类为 admin-security,面向「命令行优先」:agent 在工具参数里直接写 PowerShell,需要管理员时用独立的提权工具,长任务用轮询式后台任务看到增量输出。下面介绍定位、工具集、安装与典型用法。

这是什么

一句话:dsh-powershell 是 DSH 原生插件,在 agent 侧用 code 内联 PowerShell(不必先写脚本文件),提供普通执行、UAC 提权、长命令轮询、提权进程终止与状态查询,并可在配置中开启「优先命令而非脚本」的策略提示。

Linux / macOS 上插件可加载,但提权相关能力会返回 unsupported-platform(UAC 为 Windows 专有)。

为什么叫 psh,而不是再注册 pwsh

DSH 自带内置工具 pwsh,插件若用同名注册,本插件其余工具会出现 unknown tool,整体不生效;内置 pwsh 接受 elevated: true 却静默忽略,危险在于「该提权却像普通失败」。因此主工具命名为 psh,提权单独为 psh_elevated,不与内置工具撞名。

作者也说明:并非用 MCP 实现提权——另一进程无法在同一架构下可靠承接 UAC 会话与输出;本插件在 DSH 进程内注册工具,提权走 Start-Process -Verb RunAs,经临时目录文件信箱回收 stdout/stderr。

核心功能:五个工具

工具 作用
psh 主工具。code 内写 PowerShell(可多行)。普通权限,每次调用新进程。
psh_elevated UAC 提权执行;输出边跑边写回。用户取消 UAC(1223)如实上报,不重试。
psh_job 长命令:后台跑 + 按字节游标 poll,运行中可读输出。
psh_kill 通知提权进程自行退出(低权限无法直接终止高权限进程)。
psh_status 查询是否已提权、当前 shell、脚本块日志等,避免猜测。

策略说明(README 原文):「命令行优先」不等于禁止脚本——逻辑长、要复用、计划任务或版本管理时仍应写脚本再用 psh 执行;不应把数百行塞进 code。

DSH 工具接口与 psh_job

DSH 工具定义为单次 execute 返回的 Promise,没有内置增量流。因此短命令用 psh 即可;耗时命令用 psh_job 拆成多次短调用:

psh_job action=start code="..." timeoutMs=0   → 立刻返回 id
psh_job action=poll  id=... offset=0          → 新输出 + 下一 offset
psh_job action=poll  id=... offset=<上次返回>  → 直到 done: true

输出落在 %TEMP%\dsh-powershell-jobs\<id>\ 下的 stdout.txt / stderr.txt;单次 poll 最多 64 KiB并在换行边界切分;另有 action=list、action=stop 等。短命令不必用 psh_job。

配置项

在 profile 的 cordis.patch.yml 中插入(节选,与 README 一致):

- insert:
    - id: dsh-powershell
      name: './node_modules/dsh-powershell/lib/index.js'
      config:
        enabled: true
        preferCommands: true          # 向系统提示注入「命令行优先」策略
        shell: auto                   # auto | powershell | pwsh
        timeoutMs: 120000             # 普通命令超时
        maxOutputChars: 200000        # 输出截断上限
        elevateTimeoutMs: 300000      # 提权总预算(含等待 UAC)

name 必须是相对路径 ./node_modules/dsh-powershell/lib/index.js,写裸包名 dsh-powershell 会在冷启动时被静默跳过,表现为 DSH 正常启动但工具不可用。

安装与启用

官方 README 给出的步骤如下(在 Windows / PowerShell 环境按顺序做):

# 1. 链接进 profile
New-Item -ItemType Junction -Path "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-powershell" -Target "<本仓库路径>"

# 2. 加进 profile 的 bundles
#    ~/.dsh/profiles/desktop/package.json -> dsh.profile.bundles 里加 "dsh-powershell"

# 3. 在 profile 的 cordis.patch.yml 末尾追加(注意 name 是相对路径!)
#    - insert:
#        - id: dsh-powershell
#          name: './node_modules/dsh-powershell/lib/index.js'
#          config: { enabled: true, preferCommands: true }

# 4. 重启 DSH

安装前应在 GitHub 阅读源码与 LICENSE,确认你愿意以当前 DSH 进程权限加载该插件;junction 安装时插件需自带 @deepseek-ai/schemastery 依赖,否则 Config 校验可能静默失败。

加载失败时看 load.log

插件在 ~/.dsh/plugins/dsh-powershell/load.log 记录加载阶段:无日志则模块未 import;停在 import-evaluated 多因 Config 非 schemastery schema;register-failed 会带工具名与错误。不要仅凭「有没有 pwsh」判断——内置 pwsh 会与插件混淆观感。

典型用法示意

普通权限执行(概念示例,实际由 agent 调用工具 API):

psh  code="Get-ComputerInfo | Select-Object CsName, OsName"

需要管理员且接受 UAC 弹窗时使用 psh_elevated,不要用内置 pwsh 的 elevated: true。

长任务(README 模式):

psh_job action=start code="..." timeoutMs=0
psh_job action=poll  id=<返回的 id> offset=0

结束前执行敏感操作前,可先 psh_status 确认 elevation 与 shell 配置。

README 中在 Windows 11 / PowerShell 5.1 上的实测包括:psh 退出码原样返回、psh_elevated 下 BitLocker 查询等需管理员的操作。具体数值以仓库文档为准。

适用场景与注意

适合:在 Windows 上以 DSH agent 做本机管理、安全相关排查(admin-security 分类)、需要明确 UAC 提权边界、希望默认内联命令而非随手写临时脚本的 profile。

注意:

  1. 插件工具在 DSH 宿主进程权限下运行;提权仅在使用 psh_elevated 且用户确认 UAC 后成立。
  2. 提权实现依赖临时文件信箱、UTF-16LE 的 -EncodedCommand 约束等,详见 README「设计上必须知道的四件事」。
  3. psh_kill 通过 run 目录下 kill-request 哨兵让高权限进程自退,不依赖调高系统策略。
  4. 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,安装来源以你核对过的仓库与 patch 为准。

结尾

dsh-powershell 把 Windows 上的 PowerShell 执行收成一组语义清晰的 DSH 工具:普通 psh、显式 psh_elevated、长任务 psh_job,并避免与内置 pwsh 撞名导致的静默提权失败。更多细节与测试命令见 GitHub README,插件索引见 SkillHub 目录页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye