如何在管理员权限运行的PowerShell脚本中以普通用户身份执行子脚本
问题原因
- 路径语法错误:你给出的脚本路径为
C:Software\script_executed_as_user.ps1,缺失盘符后的反斜杠,正确路径应为C:\Software\script_executed_as_user.ps1,路径解析失败会导致进程直接退出。 - PowerShell启动参数缺失:调用powershell.exe执行脚本时未指定
-File参数,PowerShell默认会将路径解析为命令而非脚本文件,导致执行失败。 - 无报错捕获逻辑:
Start-Process默认会以独立窗口启动进程,执行失败时窗口会瞬间关闭,不会向主脚本返回任何错误信息,你无法感知到执行异常。 - 执行策略限制:新启动的普通用户PowerShell进程默认可能启用了禁止执行未签名脚本的策略,脚本会直接被拦截终止。
- 权限不足:目标普通用户没有
C:\Software目录的读取权限,或是没有脚本内涉及的操作权限,会导致脚本启动后直接闪退。
解决方法
首先使用修正后的调用代码:
$username = 'domain\username' # 域账号格式为 域名\用户名,本地账号格式为 .\用户名 $password = '你的密码' $scriptPath = "C:\Software\script_executed_as_user.ps1" $logPath = "C:\temp\script_run.log" # 提前确保普通用户对该目录有写入权限 # 预先校验路径存在 if(-not (Test-Path $scriptPath)){ Write-Error "目标脚本不存在:$scriptPath" exit 1 } $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword # 启动进程时新增参数,捕获执行状态和日志 $process = Start-Process powershell -ArgumentList "-ExecutionPolicy Bypass -File `"$scriptPath`" > `"$logPath`" 2>&1" -Credential $credential -PassThru -Wait # 输出进程退出码,非0代表执行异常 Write-Host "子进程退出码:$($process.ExitCode)"
补充注意项:
- 被调用的脚本
script_executed_as_user.ps1开头可添加Start-Transcript -Path C:\temp\user_script.log,记录脚本内部的执行细节,方便排查内部逻辑错误。 - 提前确认目标普通用户对脚本路径、脚本涉及的所有读写资源、日志存储路径都有对应的访问权限。
- 如果是在任务计划程序等会话0环境中执行,需勾选
仅在用户登录时运行,跨用户启动的进程无法在会话0中正常执行。
内容的提问来源于stack exchange,提问作者M.vacc
相关产品推荐
相关产品推荐

