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

如何让PowerShell模块Cmdlet以SYSTEM身份被识别并运行?

问题

我开发了一个PowerShell模块,内置PowerShell 5.1和MSI安装的pwsh.exe 7.3.1在普通用户身份下都能正常识别并运行模块中的Cmdlet。但在Windows任务计划程序中设置任务「无论用户是否登录都运行」,以NT AUTHORITY\SYSTEM身份执行时,PowerShell找不到该模块。

模块存放路径:

C:\Users\<UserName>\OneDrive\Documents\PowerShell\Modules\ModuleFolder

已尝试的任务配置:

  • 用BUILTIN\Administrators组作为任务主体:无法在用户未登录时运行
  • 用-LogonType S4U -UserId $env:USERNAME:可满足「无论用户是否登录都运行」的需求,但依赖特定用户账户,希望解决SYSTEM身份下的模块识别问题
原因

SYSTEM账户的默认PowerShell模块搜索路径不包含普通用户的Documents\PowerShell\Modules目录,且SYSTEM账户无权限访问普通用户的OneDrive个人文件夹(即使权限允许,该路径也不在其默认搜索范围内)。

解决方案

方案1:迁移模块至公共目录

将模块复制到所有用户(包括SYSTEM)都能访问的公共模块路径:

  • PowerShell 5.1公共路径:C:\Program Files\WindowsPowerShell\Modules
  • PowerShell 7+公共路径:C:\Program Files\PowerShell\Modules(或C:\Program Files\PowerShell\7\Modules,取决于安装方式)

迁移后,SYSTEM身份运行PowerShell时会自动扫描这些公共目录,无需额外配置。

方案2:任务命令中手动指定模块路径

若不想移动模块,可在任务的PowerShell命令中手动添加模块路径并导入:

$moduleRoot = "C:\Users\<UserName>\OneDrive\Documents\PowerShell\Modules"
$action = New-ScheduledTaskAction -Execute "pwsh.exe" -Argument "-command `& {`$env:PSModulePath += ';$moduleRoot'; Import-Module ModuleFolder; myCmdLet -parameter1 $variable1}"

注意:需提前给SYSTEM账户分配该OneDrive目录的读取和执行权限,否则模块导入会失败。

方案3:修改SYSTEM账户的PSModulePath环境变量

通过注册表为SYSTEM账户添加模块路径:

  1. 打开注册表编辑器,定位到HKEY_USERS\S-1-5-18\Environment(S-1-5-18是SYSTEM账户的固定SID)
  2. 添加或修改PSModulePath值,在原有内容后追加模块根路径:;C:\Users\<UserName>\OneDrive\Documents\PowerShell\Modules
  3. 重启计算机后生效,SYSTEM身份运行PowerShell时会自动识别该路径下的模块
注意事项
  • 若依赖OneDrive同步模块,需确保SYSTEM账户能访问OneDrive本地同步目录(可能需要调整文件夹权限)
  • 公共模块目录是最稳妥的方案,可避免权限和路径依赖问题

内容的提问来源于stack exchange,提问作者user20682592

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:50:51