SCCM中的PS1卸载脚本

时间:2015-10-20 07:32:53

标签: powershell scripting sccm

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

我在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说脚本完成没有错误,我知道它可以执行它,因为任务技能工作......但是它没有卸载程序。

提前感谢任何输入。

2 个答案:

答案 0 :(得分:0)

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

我希望这个答案可以作为未来此类问题的参考。 OP的第一个问题应该是"你违反了这九项原则中的哪一项?"您可以将其视为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与测试的上下文和用户交互相匹配?

完成整个生命周期后,请确保为上下文(为用户与系统安装)和交互选择正确的相应选项(用户可以与应用程序交互,或不与之交互)。如果你不这样做,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

答案 1 :(得分:0)

因此,SCCM正在运行此脚本,脚本中没有任何内容会引发错误。

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



$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)
}