Intune部署Win32App打包PowerShell弹窗脚本运行失败问题
Intune Win32App部署PowerShell脚本执行异常排查指引
问题背景
将PowerShell脚本打包为Win32App格式(.intunewin)通过Intune分发部署,先后测试System上下文、User上下文两种部署模式,使用CMD批处理作为执行入口调用PowerShell脚本,两种模式下均部署失败,本地管理员账号直接运行脚本无异常。
现有部署配置
- 安装入口脚本(filename.cmd)内容:
@echo off powershell -ExecutionPolicy bypass -command "&{.\TestPopUp.ps1}"
- 被调用的PowerShell脚本内容:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Force $TPath = "C:\ProgramData\ScriptTest" $TPR=Test-Path -Path $TPath if ($TPR -ne "true"){ $wshell = New-Object -ComObject Wscript.Shell $Output = $wshell.Popup("This is a Text",0,"Header it is!",0+16) New-Item -Path $TPath -ItemType Directory -InformationAction SilentlyContinue | Out-Null }
已确认故障现象
- 本地设备使用管理员权限直接运行启动脚本,可正常弹出Wscript.Shell弹窗,成功创建
C:\ProgramData\ScriptTest目录,所有逻辑执行符合预期 - System上下文部署时,Intune日志显示脚本已触发,但无弹窗弹出、目标目录未创建,因检测规则以目录存在性为判定依据,平台判定部署失败
- User上下文部署时,日志同样记录执行失败
- 测试覆盖Intune全托管虚拟机、物理设备、Co-Managed(共同管理)模式设备,故障复现一致
排查方向与修复方案
1. 修复相对路径调用错误
Intune Management Extension(IME)执行Win32App安装逻辑时,默认工作目录为系统目录,而非安装包解压后的缓存根目录,当前CMD脚本中用.\TestPopUp.ps1的相对路径调用PowerShell脚本,大概率会出现找不到文件的错误,直接导致脚本执行中断。
- 修复方案:在CMD脚本开头先切换到批处理文件自身所在目录(即安装包解压根目录),再执行后续调用,修正后的CMD参考:
@echo off :: 切换到批处理所在目录 pushd "%~dp0" powershell.exe -ExecutionPolicy Bypass -NoProfile -NonInteractive -File ".\TestPopUp.ps1" popd
- 注意调用PowerShell时优先用
-File参数指定脚本路径,不要用-Command嵌套脚本块的写法,后者执行可靠性更低。
2. 排查System上下文会话0隔离阻塞问题
System账户运行在系统专属的Session 0隔离会话中,默认无法与当前登录用户的交互式桌面进行UI交互,脚本中调用的Wscript.Shell.Popup属于交互式UI组件,在Session 0环境下不会弹出窗口,且会无限阻塞脚本进程等待用户响应,直接导致后续创建目录的逻辑无法执行。
- 验证方式:临时注释掉弹窗相关代码,重新打包部署,确认目录是否可以正常创建。如果需要实现向登录用户弹窗的逻辑,System上下文下需要使用支持跨会话调用的方案,或切换到User上下文部署执行UI相关逻辑。
- System上下文执行脚本必须加
-NonInteractive参数,避免脚本因等待交互输入挂起。
3. 修复PowerShell脚本逻辑不严谨问题
当前脚本存在两处易触发异常的写法:
Test-Path返回值为布尔类型$true/$false,而非字符串"true",当前判断逻辑$TPR -ne "true"依赖PowerShell隐式类型转换,存在判断失效风险- 创建目录时未加
-Force参数,仅靠-InformationAction SilentlyContinue无法抑制权限类报错,可能导致目录创建失败
- 修正后的脚本逻辑参考:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Force $TPath = "C:\ProgramData\ScriptTest" if (-not (Test-Path -Path $TPath)){ # 弹窗逻辑仅在用户上下文可正常生效,System上下文请注释或替换为跨会话弹窗方案 $wshell = New-Object -ComObject Wscript.Shell $Output = $wshell.Popup("This is a Text",0,"Header it is!",0+16) New-Item -Path $TPath -ItemType Directory -Force | Out-Null }
4. 本地日志定位具体报错
不要仅依赖Intune控制台的汇总执行状态,直接到设备本地抓取详细日志定位根因:
- IME客户端日志路径:
C:\ProgramData\Microsoft\IntuneManagementExtension\Logs,用CMTrace打开IntuneManagementExtension.log,可查看脚本执行的完整错误码、标准输出/错误输出信息,直接定位是文件找不到、权限不足还是脚本语法错误 - 可临时在PowerShell脚本开头加
Start-Transcript -Path "C:\ProgramData\ScriptTest_Install.log" -Append,结尾加Stop-Transcript,把脚本全程执行输出转储到本地日志文件,部署后直接查看该日志即可定位具体报错步骤。
5. 共同管理(Co-Managed)设备策略排查
对于Co-Managed模式设备,需要先确认工作负载配置:如果Win32App工作负载的归属权仍配置为SCCM,Intune下发的Win32App策略不会被IME正常执行,可查看设备上的C:\Windows\CCM\Logs\CoManagementHandler.log确认Win32App工作负载的实际归属方。
内容的提问来源于stack exchange,提问作者B0RN2SL0W
相关产品推荐
相关产品推荐

