ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SCCM软件分发播发配置与排错:通知、倒计时和日志闭环

SCCM软件分发播发配置与排错:通知、倒计时和日志闭环

简介:围绕 SCCM(System Center Configuration Manager)软件分发的实操文档,面向企业 IT 运维与系统管理员,聚焦如何将软件策略可控地推送到客户端并保证最终安装成功。内容按流程展开:先核查 SCCM 服务器与客户端状态,再启用软件分发代理、勾选通知消息并设置 5 分钟倒计时,随后依次完成共享源文件夹、创建数据包与程序、指定分发点、新建播发并选择强制分配与「从分发点下载内容并在本地运行」,最后在客户机验证效果;对大型软件安装易断线、用户错过通知等常见问题也给出了对应的设置思路。压缩包仅含 1 个 docx 文件,约 1.37MB,以图文步骤串联关键配置界面,便于对照控制台逐项操作。已有 272 人学习,适合需要弄清播发策略、倒计时通知与分发点选择等细节的运维人员查阅。

1. 一次一个弹窗都没出现的播发

某次给一批老机器补装办公客户端,SCCM 软件分发的播发推下去两个多小时,客户端右下角干干净净,一个提示都没有。回头翻配置才发现:客户端代理的「通知」标签没勾,客户端上的软件分发代理也是关着的,等于把包裹寄到了一个不收件的地址。SCCM 软件分发这套流程在内网里太常见了——建共享、建数据包、建程序、建分发点、建播发,八步走完就该弹窗。可真正让人出问题的,基本都是前面那几个开关。下面按 2012 R2 到 Current Branch 都能对上的顺序写:服务器端配什么、客户端怎么确认、弹不出来去翻哪个日志。

2. 站点与客户端代理配置:通知标签、5 分钟倒计时和分发代理的开关位置

这一章全是“装配前的准备清单”,但它直接决定后面第 4 章的播发能不能变成客户端上的一条弹窗。我一般不会先打开控制台建数据包,而是先把站点状态、客户端代理设置、共享目录这三件事过一遍,因为这三件里任何一件不对,后面做得再规范都是白费。

2.1 先确认站点和组件是活的

控制台里「监控」下的「系统状态」和「组件状态」是两个不同层级的东西:前者告诉你站点整体有没有告警,后者才告诉你具体哪个组件停了。软件分发这条链路至少要盯住三个组件——站点组件管理器、站点执行组件(SMS_EXECUTIVE)、分发管理器(SMS_DISTRIBUTION_MANAGER)。分发管理器一旦处于停止状态,你在控制台里新建分发点的操作会“成功”,但内容永远传不下去,最后卡在“进行中”不动。

服务层面我一般直接用一条命令过一遍,比在控制台里翻组件状态快:

# 在站点服务器上以管理员身份运行 # 这三个服务不全在跑,后面分发点、内容传输、策略下发都会出问题 Get-Service -Name 'SMS_EXECUTIVE','SMS_SITE_COMPONENT_MANAGER','SMS_NOTIFICATION_SERVER' | Select-Object Name, Status, StartType | Format-Table -AutoSize

SMS_EXECUTIVE是站点的主执行服务,它挂了基本等于站点瘫痪;SMS_SITE_COMPONENT_MANAGER负责拉起各个组件线程;SMS_NOTIFICATION_SERVER负责站点内部的消息通知。三个都应该是Running,启动类型不是“自动”的话,服务器重启后要人工去拉,这种“玄学故障”十有八九就是这么来的。顺带看一眼服务器的磁盘剩余空间,分发点的内容目录涨起来很快,源目录和分发点目录放同一个卷是常见做法,也是最常见的撑爆方式。

2.2 客户端代理的「通知」标签:那条弹窗是谁发出的

在「管理」下的「客户端设置」里找到默认客户端设置(2012 R2 里它的名字叫“客户端代理”),打开属性,切到「通知」标签,勾上“显示一条通知消息”。这个勾选的语义是:当软件分发策略播发到客户机之后,客户端右下角弹一条提示,告诉用户有个软件等着安装,并且带一个倒计时。

这里要分清两件事。站点级的这个设置只决定“要不要弹通知”,弹窗里那个倒计时长度是客户端收到策略时算出来的,站点级设置里给的是默认值,播发那边还能用「使用自定义倒计时通知时间」单独覆盖(第 4 章细说)。很多环境图省事,只在站点级勾了通知,播发里没管倒计时,结果所有软件都是默认的 5 分钟,用户上个厕所回来程序已经装完了,投诉“我的电脑自己动了”。

改完客户端设置不会立刻生效,默认的客户端策略轮询间隔是 60 分钟。测试阶段别等,直接在客户机上手动触发一次机器策略:

# 客户机上以管理员身份运行:强制拉取一次机器策略 # 021 这个 GUID 对应「计算机策略获取和评估周期」 Invoke-WmiMethod -Namespace 'root\ccm' -Class SMS_Client -Name TriggerSchedule ` -ArgumentList '{00000000-0000-0000-0000-000000000021}'

跑完之后看C:\Windows\CCM\Logs\PolicyAgent.log的尾部,能看到策略请求和评估的记录。GUID 不用背,这段命令存成.ps1放着,后面每次改设置都拿来跑一遍。注意这是“拉策略”,不是“装软件”,它只保证客户端拿到了最新的设置,不保证马上执行播发。

2.3 5 分钟倒计时到底从什么时候开始算

倒计时不是从你在控制台点“完成播发”那一刻开始算的。它的大致顺序是:播发的开始时间到点 → 客户端拉到新策略 → 软件分发管理器评估出有待处理播发 → 弹出通知并启动倒计时 → 5 分钟内用户没响应就自动安装,用户点了“运行”就立刻装。

理解这个顺序,才能理解为什么“明明设了 5 分钟,等了半小时没反应”——问题不在倒计时,在策略压根没到客户端。倒计时的时长在播发里通过「使用自定义倒计时通知时间」设置,默认 5 分钟。我的习惯是:办公类软件 30 分钟,驱动和必须打的安全补丁 5 到 10 分钟,测试环境永远用 1 分钟,方便反复验证不用干等。

提示:倒计时只在客户端处于登录状态时才有界面。机器锁屏、用户登出,弹窗不会出现,但强制分配(第 4 章)依然会让程序在后台装。

2.4 客户端软件分发代理要真的启用

服务器端设置再好,客户端组件没开也没用。在客户机的控制面板里打开 Configuration Manager(老版本叫“配置管理器”),切到「组件」标签,双击列表里的“软件分发”,确认代理处于启用状态、并且没有被本地策略禁用。这一步原文写的是“检查客户端的软件代理组件是否启用”,落到操作上就是这个位置。

命令行验证更直接:

# 客户端侧:服务和代理状态一起看 Get-Service -Name CcmExec | Format-List Name, Status, StartType # 按最近写入时间排出最近活跃的 10 个客户端日志 Get-ChildItem 'C:\Windows\CCM\Logs' -Filter '*.log' | Sort-Object LastWriteTime -Descending | Select-Object -First 10 Name, LastWriteTime

CcmExec是客户端主服务,它停了客户端就是个死盒子。第二段命令是为了确认日志目录里最近有没有新写入——如果最新的日志还是几天前的,说明客户端根本没在通信,重点就不是分发,而是客户端本身或站点通信的问题(边界组、证书、防火墙、站点分配)。

2.5 共享源文件夹和权限,别用映射盘符

数据包的源目录必须放在一个共享路径下,用 UNC 形式引用,比如\\SERVER01\Pkg$\ClientX。共享权限和 NTFS 权限都要给“读取”,授予对象至少包括站点服务器的计算机账户和分发点服务器的计算机账户。有人习惯用Z:\ClientX这种映射盘符建数据包,在控制台那台机器上一切正常,一分发就报“无法访问源目录”——因为映射盘符是用户会话级别的,服务账户看不到它。

我一般的做法是建一个隐藏共享(名字带$),共享权限给Everyone读、NTFS 权限收紧到“域计算机读”或者干脆指定服务器账户,然后源目录建好就不再动它。SCCM 是按内容哈希比对文件的,你事后偷偷改源目录里的安装包,已分发到分发点上的旧内容不会自动更新,得回去“更新分发点”,这一点后面第 5 章还会踩到。

3. 数据包、程序和分发点:从共享目录到客户端能下载的内容

站点和客户端都通了,接下来是把“一个安装包”变成“客户端能下载并执行的东西”。这三步的顺序不能乱:数据包指向源目录,程序定义怎么装,分发点负责把内容送到离客户端近的服务器上。我见过最省事的做法是建完数据包直接建播发,中间漏了程序或分发点,播发推下去客户端只收到一条“无可用程序”的空策略。

3.1 新建数据包:名称、源目录和后续几步

在「软件库」的「软件分发」节点下新建数据包,向导会依次问名称、源目录、数据处理方式和权限。名称建议带软件名和版本号,例如ClientX-3.2.1-x86,后面排查哪个版本装错了,一眼能对出来。源目录填刚才那个 UNC 路径,别填本机路径。

向导后面的几步在原流程里都是“默认设置,直接下一步”:标准程序、不启用二进制差异复制、默认权限。默认权限那一页其实是让大家确认是否沿用数据包的默认安全模型,实际部署里如果涉及内网隔离区,这里要按组织策略改,不过多数办公网保持默认就够了。

数据包建完之后有一个动作不能省:右键数据包,选「更新分发点」。即便你还没建分发点,这一步也是后面内容分发的入口。数据包创建成功只代表“控制台里有一条记录了”,不代表“分发点上有文件了”。

3.2 新建程序:命令行、环境标签和平台限制

在刚才那个数据包下面找到「程序」,新建程序。向导里最关键的三个地方:命令行、运行方式、环境。

命令行就是真正被执行的那条安装命令。以某个办公客户端为例,我一般这样填:

:: 数据包「程序」属性里「命令行」字段填的内容 :: /qn 静默安装,/norestart 不自动重启,/l*v 输出详细安装日志备查 msiexec.exe /i "ClientX.msi" /qn /norestart /l*v "%TEMP%\ClientX-install.log"

/qn表示无界面安装,如果不写,客户端上会跳到交互界面,然后因为运行在后台会话里直接失败;/norestart是防止安装过程把用户的机器重启掉;/l*v那个日志非常有用,SCCM 只能告诉你“返回码 1603”,具体的失败原因要去这个 msi 日志里找。日志路径用%TEMP%,在 SYSTEM 账户下展开成C:\Windows\Temp,跟用户账户下不是同一个目录,找日志的时候别找错地方。

「环境」标签里可以指定程序允许运行的操作系统平台。原流程里这一步是默认设置,同时也提到“也可按需设置需要的操作系统进行安装”——这是最容易被忽略的一个过滤器。讲个反直觉的点:如果你的播发目标集合里混了老版本系统和新版本系统,而程序的环境标签只勾了新平台,老系统那部分客户端会拿到策略但直接判定“不适用”,通知和弹窗都不会有。所以“播发到所有老系统”的时候,环境标签必须把对应平台勾上。

程序属性的「常规」标签里还有运行方式,默认是“使用用户权限运行”还是“使用管理权限运行”,取决于安装包是否需要写系统目录。装机器级别的软件,选“不管用户是否登录都要运行”配合“使用管理权限运行”最稳。

3.3 新建分发点:内容到底传没传上去

在数据包路径下找「分发点」,新建分发点。如果环境里只有一台站点服务器兼任分发点,那就只能选它,这一步没什么取舍空间;多分发点环境里选离客户端最近的那台,或者按边界组来规划。

建完分发点还要看内容状态。控制台里选中数据包,下方的分发点列表里有一个“状态”列,正常是“成功”,传输中是“进行中”,失败是“失败”。只有“成功”才代表分发点上真的有这份安装包。这一列看起来不起眼,但它是第 4 章播发能不能跑通的前置条件,也是第 5 章最常见的卡点。

注意:内容“进行中”超过十几分钟就该去站点服务器上看PkgXferMgr.log和DistMgr.log了,别在那里干等。大包慢是正常的,但状态不动通常是有别的原因。

4. 播发配置:强制分配、下载后本地运行与自定义倒计时

播发(部署)是把前面那些东西真正推到客户端上的动作。这一步的参数选择,直接决定用户体验是“右下角弹一条等我点”还是“到点自己装”。我见过太多环境在这一步一路默认点过去,等到用户投诉机器半夜重启,才发现默认值和现场策略根本对不上。

4.1 新建播发与目标集合

在「软件分发」节点下的「播发」里新建播发,指向刚才那个数据包和程序,然后选目标集合。原流程的例子是“将该播发到所有 XP 系统上”,落到实际操作就是先建一个基于查询的集合,再把这个播发指向它。集合的查询可以这样写:

-- 「创建基于查询的设备集合」里的 WQL,筛选指定操作系统版本的设备 -- 5.1 对应老版本工作站系统的内核版本号,按需改成你自己的判断条件 select * from SMS_R_System where SMS_R_System.OperatingSystemNameandVersion like '%Workstation 5.1%'

SMS_R_System是设备资源类,OperatingSystemNameandVersion这个属性返回的是一整串描述,所以用like做模糊匹配而不是等值匹配。写完查询最好用“预览”看一眼成员数量对不对,集合成员还在刷新的时候直接建播发,会出现“播发建完了但一个客户端都没收到”的假象。成员关系刷新有周期,测试阶段可以在集合上手动“更新成员关系”。

4.2 计划标签:开始时间和强制分配

播发属性的「计划」标签里有两个关键项。一个是播发的开始时间,决定策略从什么时候开始对客户端可见;另一个是「强制分配」(也有的版本叫“分配”或“必需”),勾上之后,客户端不是“你可以装”,而是“到点必须装”。

这两个开关的组合决定最终行为。开始时间 + 不强制 = 用户可以在软件中心里自己选着装;开始时间 + 强制分配 + 有截止时间 = 到点自动装;开始时间 + 强制分配 + 无截止时间 = 策略立马可见,程序按倒计时走。原流程选的是强制分配,意图很明确:不指望用户主动点,到点自己装。

我的经验是,强制分配不要一刀切。生产终端用强制分配 + 较长的倒计时窗口(30 分钟以上),让用户有机会保存工作;测试机用强制分配 + 1 分钟倒计时,快速验证闭环。这个取舍没什么标准答案,但一定要显式地选,别一路默认。

4.3 分发点选项卡:下载后本地运行

播发属性的「分发点」选项卡里有三种运行方式,选择不同,客户端的行为差别很大:

选项客户端行为适用场景
从分发点下载内容并在本地运行先把安装包整个拉到本地,再从本地执行体积大、安装过程长的软件
从分发点直接运行安装程序直接从共享执行,边读边装体积小、安装快的工具
必要时从分发点下载并在本地运行先直接跑,需要时才下载不确定体积或网络状况的环境

原流程选的是第一种,理由写得很实在:直接从分发点安装,装到一半网络断了,客户端会留下一个装了一半的残局,重装比重来还麻烦。先把整个包下载到本地缓存(默认在C:\Windows\ccmcache),再执行安装,断线只影响下载阶段,下载完成后安装过程是本地完成的。代价是客户端要多占一份磁盘空间,大包环境下ccmcache的容量要提前规划。

4.4 自定义倒计时通知时间

播发向导里勾上「使用自定义倒计时通知时间」,填一个值,默认 5 分钟。这个值覆盖站点级的默认倒计时,只对这个播发生效。填的时候注意单位,界面上是分钟。

倒计时走完,程序自动启动。用户在这 5 分钟里可以手动点“运行”提前装,也可以什么都不做等它自己装。有一种情况值得提前想好:用户在倒计时期间点了“稍后提醒”,那不是无限期延后,只是把这一轮通知关掉,强制分配的播发到点还是会装。如果组织里确实需要“用户可拒绝”的语义,那就不该用强制分配,改用可选播发让用户自己在软件中心里点。

4.5 播发建完之后的策略下发

播发创建完成后,控制台那一侧的事就做完了,剩下的全在客户端。播发不会主动“推”到客户端,是客户端按轮询周期来拉。测试阶段照旧手动触发一次机器策略(第 2.2 节那条命令),然后去ExecMgr.log看软件分发管理器有没有接住这条播发。

这一步的常见误判是:在控制台的播发状态里看到“成功”,就以为装好了。那个状态指的是“策略已下发到客户端”,跟程序装没装上完全是两回事。真正的安装结果要看客户端侧的状态消息和ExecMgr.log。

5. 避坑与排查:五条踩过的分发翻车记录

这一章全是血泪经验,每一条我都至少遇到过两次。排查顺序建议按“客户端有没有拿到策略 → 内容有没有下载下来 → 程序有没有执行 → 执行结果是什么”这条链路走,别一上来就怀疑安装包坏了。

5.1 现象:客户端右下角什么都不弹

原因通常有三层:站点级通知没勾、客户端的软件分发代理没启用、或者客户端压根没拿到这条播发策略。前两个在第 2 章解决,第三个要去PolicyAgent.log里确认最近一次策略请求的时间。我遇到过一台机器,日志显示它每天都在请求策略,但站点代码对不上——它还在找一台已经下线的旧站点,等于一直在跟空气握手。

解决顺序:先Get-Service CcmExec确认服务在跑,再触发一次机器策略,然后盯PolicyAgent.log和ExecMgr.log的尾部。日志里出现播发 ID,说明策略到了;日志里连播发 ID 都没有,问题在站点到客户端的通信,去查边界组和客户端分配状态。

5.2 现象:内容状态一直停在「进行中」

原因多半在分发点这一侧:分发点服务器磁盘满了、源目录的共享权限变了、或者分发点上的内容库损坏。也有一种情况是源目录在数据包创建之后被人“顺手整理”过,文件的哈希对不上,分发管理器反复重试但永远传不完。

解决:先去站点服务器看PkgXferMgr.log,里面会明确写出是权限拒绝、磁盘空间不足还是文件被占用。权限问题就回去补共享和 NTFS 的读权限;磁盘满了就清SCCMContentLib之外的临时目录,别直接删内容库;文件哈希对不上,右键数据包「更新分发点」重新刷一遍内容。

5.3 现象:程序跑完了,软件却没装上

原因几乎都在返回码上。SCCM 判断成功与否看的是安装程序返回的那个数字,返回 0 和 3010 算成功(3010 表示需要重启,得在程序属性里把 3010 加进成功返回码列表,否则会被判成失败),返回 1603 是安装过程致命错误,1618 是“另一个安装正在进行”,1619 是“安装包打不开”。

解决:去客户机的C:\Windows\Temp下找那条/l*v指定的 msi 日志,搜 “Return value 3” 附近的内容,失败原因基本都在那里。1618 这种通常是多个播发撞在一起了,把播发时间错开,或者在程序属性里配置“允许同时运行”的限制。1603 千奇百怪,但真正的原因永远在 msi 日志里,不在 SCCM 日志里。

5.4 现象:老版本系统的客户端收不到播发

原因有两个。一是程序属性的「环境」标签没勾上老平台,客户端拿到策略后直接判定不适用,静默跳过,什么提示都没有。二是这套环境的站点版本本身已经不支持这么老的客户端,客户端装不上、或者装上了但无法正常通信。

解决:先确认环境标签里的平台勾选,再看客户端的LocationServices.log有没有正常找到分发点。如果站点版本本身就不支持这批老机器,那再怎么配参数也白搭,得考虑单独维护一批旧客户端,或者把这些机器迁到受支持的平台上。这是版本差异带来的硬性约束,不是配置能绕过去的。

5.5 现象:倒计时走完了,程序却没有自动装

原因通常不是倒计时本身,而是“没有满足执行前提”:客户端在倒计时期间休眠了、用户登出了、或者程序被配置成“仅在用户登录时运行”。强制分配虽然叫强制,但它不负责把睡着的机器叫醒。

解决:在播发属性的「计划」标签里确认强制分配和截止时间都设了;程序属性里确认运行方式是“不管用户是否登录都要运行”;客户端的电源策略别在安装窗口期进入深度休眠。测试阶段我会专门拿一台机器锁屏放一晚上,第二天看ExecMgr.log,这比在工位上盯着屏幕可靠得多。

6. 验证一次完整闭环:客户机上的四步确认与日志对照

配完不等于跑通。我的习惯是拿一台干净的客户端,从零走一遍完整闭环,四步确认,一步都不能跳。

第一步,确认客户端在线且拿到了策略。触发一次机器策略,看PolicyAgent.log末尾有没有新的请求记录。第二步,确认内容下载下来了,去C:\Windows\ccmcache底下看有没有一个新目录,大小对不对得上安装包。第三步,确认程序被执行了,ExecMgr.log里能看到播发 ID、命令行、启动时间和返回码。第四步,确认安装结果,去C:\Program Files或注册表里看软件真的在,别只信日志。

日志对不上现象的时候,按这张表定位,比在控制台里瞎点快得多:

日志文件位置看什么
PolicyAgent.log客户端 CCM\Logs策略有没有拉到,站点代码对不对
ExecMgr.log客户端 CCM\Logs播发有没有被评估、程序有没有启动、返回码
CAS.log客户端 CCM\Logs内容有没有在本地缓存里命中
ContentTransferManager.log客户端 CCM\Logs内容下载任务有没有排队、有没有失败
DataTransferService.log客户端 CCM\Logs实际传输过程、分发点地址、断点续传
PkgXferMgr.log站点服务器内容从源目录传到分发点的过程
DistMgr.log站点服务器分发点创建、内容版本、分发状态

还有一个小技巧:验证“下载后本地运行”这个选项到底生效没有,别只看安装成没成功。断网测试更直接——让客户端在下载完成后拔掉网线再等倒计时,如果程序照样装完了,说明确实是从本地缓存跑的;如果直接失败,那就是配置成了“从分发点直接运行”。

从那以后我每次配完播发,都强制走一遍这四步和断网验证,哪怕只是改了一个倒计时数字。SCCM 这套东西的坑不在难,而在“看起来都配了”。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表