AWS CodeDeploy部署时Windows EC2实例Start-Process命令执行异常问题咨询
问题根因
Windows系统存在会话0隔离机制,AWS CodeDeploy代理服务默认运行在无交互桌面权限的会话0环境中,所有在该会话下启动的程序界面都会被系统隐藏,因此你直接在脚本中调用Start-Process弹出的cmd窗口不会在登录用户的桌面会话中显示,多数场景下bat实际已经执行完成,只是界面不可见。
解决方案
场景1:无需弹出可见窗口,仅需保证bat后台正常执行
直接调整postinstall-batchfile.ps1脚本的调用逻辑,避免使用带交互属性的Start-Process,添加日志即可排查执行状态:
# 写入执行日志 "$(Get-Date) 开始调用DeployCode.bat" | Out-File C:\CodeDeploy\deploy_run.log -Append # 直接执行bat,捕获标准输出和错误输出 & C:\CodeDeploy\DeployCode.bat >> C:\CodeDeploy\deploy_run.log 2>&1 # 记录bat退出码 "$(Get-Date) bat执行完成,退出码:$LASTEXITCODE" | Out-File C:\CodeDeploy\deploy_run.log -Append # 将bat的退出码传递给CodeDeploy,避免执行失败也显示部署成功 exit $LASTEXITCODE
场景2:必须弹出可见的cmd窗口给登录的Administrator用户查看
可以通过Sysinternals的psexec工具指定活跃桌面会话ID启动进程,绕过会话0隔离:
- 提前将psexec.exe放到EC2实例的
C:\Windows\System32目录下 - 修改
postinstall-batchfile.ps1脚本内容:
# -i参数后接登录用户的会话ID,默认活跃桌面会话ID为1,可通过quser命令查询实际ID psexec -i 1 -accepteula cmd /c "C:\CodeDeploy\DeployCode.bat"
通用配置:修复runas用户权限问题
Windows环境下CodeDeploy使用runas用户执行脚本前,需要提前在EC2实例中配置对应用户的凭据,否则会出现无权限执行的问题:
# 新建CodeDeploy凭据存储目录 New-Item -Path C:\ProgramData\Amazon\CodeDeploy\conf -Name credentials -ItemType Directory -Force # 替换为你实际的Administrator账号密码 $securePwd = ConvertTo-SecureString "你的Administrator密码" -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential ("Administrator", $securePwd) # 导出凭据到CodeDeploy指定路径 $cred | Export-Clixml -Path C:\ProgramData\Amazon\CodeDeploy\conf\credentials\Administrator.xml
验证方法
部署完成后查看C:\CodeDeploy\deploy_run.log日志,如果日志内容正常生成,且bat的执行输出符合预期,说明脚本已经正常执行。如果需要可见窗口,再使用psexec方案即可。
内容的提问来源于stack exchange,提问作者dhusha
相关产品推荐
相关产品推荐

