SCCM Powershell 检测脚本在什么环境中运行?

alx*_*x9r 11 powershell sccm sccm-2012 sccm-2012-r2

我终于在具有AllSigned执行策略的客户端上使用 PowerShell 检测脚本取得了成功。(提示:它在安装最新的服务包并使用Adam Meltzer 的解决方法后开始工作。)

现在使用 PowerShell 脚本进行应用程序检测是实用的,这让我想知道以下几点:

  1. SCCM 客户端在什么上下文中运行 PowerShell 检测脚本?系统?用户?
  2. 上下文是否取决于您在“部署类型”中选择“为用户安装”还是“为系统安装”?

关于这个主题的文档很少。我为 SCCM PowerShell 检测脚本找到的最佳资源是这篇 Kloud 博客文章,但是,它对上下文问题保持沉默。

alx*_*x9r 14

实验结果

我写了一些 PowerShell,当作为检测脚本运行时,将检测脚本看到的环境变量转储到日志文件中。该脚本位于此答案的末尾。

然后,我通过部署具有不同“安装行为”和“登录要求”参数的部署类型,使该脚本由 SCCM 客户端运行。结果如下表所示:

Test InstallationBehavior LogonRequirement                   DeployedTo LoggedOnUser ScriptRunAs
---- -------------------- ----------------                   ---------- ------------ -----------     
1.1a Install for user     Only when a user is logged on      un2        un2          un2        
1.1b Install for user     Only when a user is logged on      cn1        un2          un2        
1.1c Install for user     Only when a user is logged on      cn1        un1          un1        
1.2a Install for system   Only when a user is logged on      un2        un2          un2        
1.2b Install for system   Only when a user is logged on      cn1        un2          cn1        
1.2c Install for system   Only when a user is logged on      cn1        un1          cn1        
1.3a Install for system   Whether or not a user is logged on un2        un2          un2        
1.3b Install for system   Whether or not a user is logged on cn1        un2          cn1        
1.3c Install for system   Whether or not a user is logged on cn1        un1          cn1        

   
Run Code Online (Sandbox Code Playgroud)
  • unX 是用户名
  • cnX 是计算机名称

分析

上述结果令人惊讶,因为检测脚本运行的上下文似乎部分取决于应用程序是部署到用户还是系统。这足以让我感到惊讶,我第二次运行了测试。结果是一致的。

我们可以从上表中初步得出以下假设:

  1. 将应用程序部署给用户后,该应用程序的 PowerShell 检测脚本将以该用户身份运行。
  2. 当应用程序部署到系统并为系统安装部署类型时,该应用程序的 PowerShell 检测脚本将作为系统运行。
  3. 将应用程序部署到系统并为用户安装部署类型后,该应用程序的 PowerShell 检测脚本将以登录用户身份运行。

以上三个假设得到了检验结果的支持。在这些假设不成立的情况下,很可能还有一些其他变量没有经过测试。在使用 PowerShell 检测脚本时,它们至少是一组很好的初始假设。

不匹配的上下文(当心!)

Jason Sandys 记录了对安装上下文规则的类似测试。 如果您仔细阅读那篇文章,您可能会注意到安装上下文和检测脚本上下文的规则并不完全相同。以下是违规规则:

当应用程序的安装行为设置为“作为系统安装”时,安装程​​序将作为系统运行[无论部署到用户]。

将应用程序部署给用户后,该应用程序的 PowerShell 检测脚本将以该用户身份运行 [无论安装行为是否设置为“作为系统安装”]。

这意味着具有安装行为“作为系统安装”部署到用户集合的应用程序将使用系统上下文进行安装,但使用用户上下文进行检测。

为安装行为为“作为系统安装”的应用程序编写检测脚本的人应该小心避免依赖环境中在系统和用户上下文之间发生变化的任何部分。否则,部署到系统集合的应用程序的检测可能会成功,而部署到用户集合的完全相同的应用程序的检测可能会失败。

脚本

function Write-EnvToLog
{
    $appName = 'script-detect-test'

    $logFolderPath = "c:\$appName-$([System.Environment]::UserName)"

    if ( -not (Test-Path $logFolderPath -PathType Container) )
    {
        New-Item -Path $logFolderPath -ItemType Directory | Out-Null
    }

    if ( -not (Test-Path $logFolderPath -PathType Container ) )
    {
        return
    }

    $logFileName = "$appName`__$((Get-Date).ToString("yyyy-MM-dd__HH-mm-ss")).txt"

    $fp = "$logFolderPath\$logFileName"

    Get-ChildItem Env: | Out-File $fp | Out-Null

    return $true
}

try
{
    if ( Write-EnvToLog ) { "Detected!" }
    [System.Environment]::Exit(0)
}
catch
{
    [System.Environment]::Exit(0)
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@BigHomie。我也在过滤 SCCM ......但我错过了很多,因为没有实用的方法来获得过滤的流[在移动设备上](https://meta.stackexchange.com/questions/244379/is-there-any-移动友好的方式来访问过滤的饲料)。 (2认同)
  • 优秀的 SCCM 问题!快来加入@BigHomie 和我 - [sccm] 标签的保管人。我们实际上有几个人。 (2认同)