前言¶
在 Windows 上让 DeepSeek Harness(DSH)里的 agent 执行系统操作,常见做法是写 .ps1 再调用。一条简单的查询也要先落盘脚本,交互成本高。内置工具有 pwsh,但同名注册会抢插件、且 elevated: true 会被静默忽略,提权失败看起来像普通权限报错,排查困难。
dsh-powershell 由维护者 a5899 发布,分类为 admin-security,面向「命令行优先」:agent 在工具参数里直接写 PowerShell,需要管理员时用独立的提权工具,长任务用轮询式后台任务看到增量输出。下面介绍定位、工具集、安装与典型用法。
这是什么¶
一句话:dsh-powershell 是 DSH 原生插件,在 agent 侧用 code 内联 PowerShell(不必先写脚本文件),提供普通执行、UAC 提权、长命令轮询、提权进程终止与状态查询,并可在配置中开启「优先命令而非脚本」的策略提示。
- 目录页:SkillHub 插件页
- 源码与说明:GitHub a5899/dsh-powershell
- 当前 package 版本(资料原文):1.0.12,MIT 许可证,要求 Node.js >= 20;
package.json中os为win32。
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。
注意:
- 插件工具在 DSH 宿主进程权限下运行;提权仅在使用
psh_elevated且用户确认 UAC 后成立。 - 提权实现依赖临时文件信箱、UTF-16LE 的
-EncodedCommand约束等,详见 README「设计上必须知道的四件事」。 psh_kill通过 run 目录下kill-request哨兵让高权限进程自退,不依赖调高系统策略。- 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,安装来源以你核对过的仓库与 patch 为准。
结尾¶
dsh-powershell 把 Windows 上的 PowerShell 执行收成一组语义清晰的 DSH 工具:普通 psh、显式 psh_elevated、长任务 psh_job,并避免与内置 pwsh 撞名导致的静默提权失败。更多细节与测试命令见 GitHub README,插件索引见 SkillHub 目录页。