Finalmente tive sucesso ao usar scripts de detecção do PowerShell em clientes com AllSigned
política de execução. (dica: começou a funcionar após a instalaçãoo pacote de serviços mais recentee usandoSolução alternativa de Adam Meltzer.)
Agora que é prático usar scripts do PowerShell para detecção de aplicativos, fico pensando o seguinte:
- Em que contexto o cliente SCCM executa os scripts de detecção do PowerShell? Sistema? Do utilizador?
- O contexto depende de você selecionar "Instalar para usuário" ou "Instalar para sistema" no Tipo de implantação?
A documentação é bastante escassa sobre este tópico. O melhor recurso que encontrei para scripts de detecção do SCCM PowerShell éesta postagem do blog do Kloud, no entanto, é omisso sobre a questão do contexto.
Responder1
Resultados empíricos
Eu escrevi um PowerShell que, quando executado como um script de detecção, despeja as variáveis de ambiente que o script de detecção vê em um arquivo de log. Esse script está no final desta resposta.
Em seguida, faço com que esse script seja executado pelo cliente SCCM, implantando um tipo de implantação com diferentes parâmetros "Comportamento de instalação" e "Requisitos de logon". Os resultados estão na tabela abaixo:
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
unX
são nomes de usuáriocnX
são nomes de computadores
Análise
Os resultados acima são surpreendentes porque o contexto em que um script de detecção é executado parece depender em parte de o aplicativo ter sido implantado em um usuário ou em um sistema. Isso foi uma surpresa suficiente para que eu fizesse os testes uma segunda vez. Os resultados foram consistentes.
Podemos tentar tirar as seguintes hipóteses da tabela acima:
- Quando um aplicativo é implantado para um usuário, um script de detecção do PowerShell para esse aplicativo é executado como esse usuário.
- Quando um Aplicativo é implantado em um sistema e o Tipo de Implantação é instalado no sistema, um script de detecção do PowerShell para esse Aplicativo é executado como sistema.
- Quando um Aplicativo é implantado em um sistema e o Tipo de Implantação é instalado para o usuário, um script de detecção do PowerShell para esse Aplicativo é executado como o usuário conectado.
As três hipóteses acima são apoiadas pelos resultados do teste. Pode muito bem haver algumas outras variáveis que não foram testadas onde essas hipóteses não se sustentam. Eles são, pelo menos, um bom conjunto de suposições iniciais ao usar scripts de detecção do PowerShell.
Contextos incompatíveis (cuidado!)
Jason Sandys documentou um teste semelhante das regras para contexto de instalação. Se você ler essa postagem com atenção, poderá notar que as regras para o contexto de instalação e o contexto do script de detecção não são exatamente as mesmas. Aqui estão as regras ofensivas:
Quando o comportamento de instalação de um aplicativo é definido como "Instalar como sistema", o instalador é executado como sistema [independentemente da implantação para o usuário].
Quando um aplicativo é implantado em um usuário, um script de detecção do PowerShell para esse aplicativo é executado como esse usuário [independentemente de o comportamento da instalação estar definido como "Instalar como sistema"].
Isso significa queum aplicativo que possui comportamento de instalação “Instalar como sistema”eé implantado em uma coleção de usuários usará o contexto do sistema para instalação, mas o contexto do usuário para detecção.
Alguém que escreve scripts de detecção para aplicativos onde o comportamento de instalação é "Instalar como sistema" deve ter cuidado para evitar depender de qualquer parte do ambiente que mude entre o sistema e os contextos do usuário. Caso contrário, a detecção de um Aplicativo implantado em uma coleção de sistemas poderá ser bem-sucedida, enquanto a detecção exatamente do mesmo Aplicativo implantado em uma coleção de usuários falhará.
Roteiro
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)
}