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 客户端,您需要确保安装和卸载脚本的结构正确。
- 对于批处理脚本,使用
exit /b %errorlevel%
将可执行文件的退出代码传递给 ConfigMgr 客户端
- 对于 PowerShell 脚本,this is the only way I have seen work reliably
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)
}
我是一个 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 客户端,您需要确保安装和卸载脚本的结构正确。
- 对于批处理脚本,使用
exit /b %errorlevel%
将可执行文件的退出代码传递给 ConfigMgr 客户端 - 对于 PowerShell 脚本,this is the only way I have seen work reliably
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)
}