alx*_*x9r 11 powershell sccm sccm-2012 sccm-2012-r2
我终于在具有AllSigned
执行策略的客户端上使用 PowerShell 检测脚本取得了成功。(提示:它在安装最新的服务包并使用Adam Meltzer 的解决方法后开始工作。)
现在使用 PowerShell 脚本进行应用程序检测是实用的,这让我想知道以下几点:
关于这个主题的文档很少。我为 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
是计算机名称上述结果令人惊讶,因为检测脚本运行的上下文似乎部分取决于应用程序是部署到用户还是系统。这足以让我感到惊讶,我第二次运行了测试。结果是一致的。
我们可以从上表中初步得出以下假设:
以上三个假设得到了检验结果的支持。在这些假设不成立的情况下,很可能还有一些其他变量没有经过测试。在使用 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)
归档时间: |
|
查看次数: |
8377 次 |
最近记录: |