PS1 SCCM 中的卸载脚本

PS1 uninstallation script in SCCM

我是一个 nub 脚本编写者,我正在尝试编写一个非常简单的脚本来 taskkill 2 个程序,然后卸载其中的 1 个。

我在 Powershell 中编写它并将其粘贴在 SCCM 中进行部署...但是每次我部署它时,都不是 运行 卸载程序的最后一行。

代码如下:

# Closing Outlook instance
#
taskkill /IM outlook.exe /F
#
# Closing Linkpoint instance
#
taskkill /IM LinkPointAssist.exe /F
#
# Uninstalling Linkpoint via uninstall string if in Program Files
#
MsiExec.exe /X {DECDCD14-DEF6-49ED-9440-CC5E562FDC41} /qn
#
# Uninstalling Linkpoint via WmiObject if installed manually in AppData
Get-WmiObject -class win32_product -Filter "Name like '%Linkpoint%'" | ForEach-Object { $_.Uninstall()}
#
Exit

有人可以帮忙吗? SCCM 说脚本完成且没有错误,我知道它能够执行它,因为 taskkills 工作...但它没有卸载程序。

提前感谢您的任何意见。

我在 SO 和 SF 上看到很多此类问题:有人在为应用程序、脚本或 ConfigMgr 的意外行为而苦苦挣扎,而关于我可以对他们的环境做出的假设的信息很少。在那个阶段,通常需要数天的互动才能将问题缩小到可以解决的程度。

希望这个回答可以作为以后此类问题的参考。 OP 的第一个问题应该是 "Which of these 9 principles are you violating?" 您可以将其视为 ConfigMgr 应用程序打包的一种 Joel Test


改进 ConfigMgr 应用程序包的九个步骤

我发现使用 ConfigMgr 可靠地安装和卸载应用程序需要仔细遵守一系列原则。我通过艰难的方式学会了这些原则。如果您正在努力弄清楚为什么某个应用程序无法在 ConfigMgr 下正常运行,您很可能会回答 "no" 以下问题之一。

1。您是否在测试整个生命周期?

为了可靠地管理应用程序,您需要测试应用程序的整个生命周期。这是我测试的序列:

  • 检测:确保检测脚本结果是否定的
  • 安装:使用安装脚本安装应用程序
  • 检测:运行
  • 时确保检测脚本结果为正
  • 卸载:使用您的卸载脚本进行卸载

我运行这个序列反复对每个步骤进行调整,直到整个序列正常工作。

2。您是否首先独立于 ConfigMgr 进行测试?

使用 ConfigMgr 测试应用程序的生命周期很慢,并且有其自身的失败方式,可以掩盖应用程序包的问题。那么,目标就是能够独立于但等效于 ConfigMgr 客户端来测试应用程序的安装、检测和卸载。为了实现该目标,您最终需要为每个应用程序编写三个单独的脚本:

  • Install-Application.bat - 安装脚本的入口点
  • Detect-Application.ps1 - 检测应用程序是否安装的脚本
  • Uninstall-Application.bat - 卸载脚本的入口点

这三个脚本中的每一个都可以由您或 ConfigMgr 客户端直接调用。对于作为系统安装的应用程序,您需要使用 psexec -s 在与 ConfigMgr (caveat) 相同的上下文中调用脚本。

3。你知道上下文吗?

根据调用它们的上下文,安装程序的行为可能会有所不同。您需要考虑应用程序是为用户还是为系统安装的。如果它是为系统安装的,当您独立于 ConfigMgr 进行测试时,使用 psexec -s 调用您的脚本。

4。您了解用户交互吗?

一个安装程序can also behave rather differently depending on whether a user can interact with it。要将脚本作为具有用户交互的系统进行测试,请使用 psexec -i -s.

5。您是否将 ConfigMgr 与测试的上下文和用户交互相匹配?

一旦您拥有完整的生命周期,请确保您 select 上下文(为用户与系统安装)和交互(用户是否可以与应用程序交互)的正确对应选项。如果您不这样做,ConfigMgr 客户端将以与您测试的方式不同的方式安装应用程序,因此您真的不能指望成功。

6.您是否知道应用程序检测上下文不匹配的可能性?

检测脚本 运行 所在的上下文取决于应用程序是部署到用户还是系统。这意味着 in some cases the installation and detection contexts won't matched。编写检测脚本时请记住这一点。

7.您是否构建了脚本以便退出代码起作用?

ConfigMgr 需要从您的安装和卸载脚本中查看退出代码,以便做正确的事情。安装程序发出失败信号或需要使用退出代码重新启动。为了让退出代码到达 ConfigMgr 客户端,您需要确保安装和卸载脚本的结构正确。

8。您是否使用 PowerShell 脚本进行检测?

ConfigMgr 有一个很好的用户界面,用于检查文件的存在、注册表项等,作为是否安装应用程序的代理。该方案的问题在于,无法独立于 ConfigMgr 客户端或等同于它来测试应用程序检测。如果您想独立于 ConfigMgr 客户端测试应用程序生命周期(相信我,您想要那样),则所有检测都必须使用 PowerShell 脚本进行。

9。您是否正确构建了 PowerShell 检测脚本?

ConfigMgr 用来解释 PowerShell 检测脚本输出的规则是神秘的。谢天谢地,they are documented.

因此,SCCM 就是 运行 这个脚本,脚本中的任何内容都不会引发错误。

如果您想抛出 SCCM 可以 return 了解部署进展情况的错误,则需要添加一个额外的步骤。

$result = Get-WmiObject -class win32_product -Filter "Name like '%Linkpoint%'" | ForEach-Object { $_.Uninstall()}

   if ($result.ReturnValue -ne 0){
 [System.Environment]::Exit(1603)
}else
{
[System.Environment]::Exit(0)
}