J'ai enfin eu beaucoup de succès en utilisant des scripts de détection PowerShell sur les clients avec AllSigned
Politique d'exécution. (Astuce: il a commencé à fonctionner après l'installation le dernier service de service et en utilisant Solution de contournement de Adam Meltzer .)
Maintenant qu'il est pratique d'utiliser des scripts PowerShell pour la détection des applications, cela me permet de me demander les choses suivantes:
La documentation est assez clairsemée sur ce sujet. La meilleure ressource que j'ai trouvée pour SCCM Scripts de détection PowerShell est ce poste de blog Kloud Cependant, il est silencieux sur la question du contexte.
J'ai écrit un peu de powerShell qui, lorsqu'il est exécuté en tant que script de détection, jette les variables d'environnement que le script de détection voit à un fichier journal. Ce script est à la fin de cette réponse.
Je fais ensuite exécuter ce script par le client SCCM en déployant un type de déploiement avec différents paramètres de "comportement d'installation" et de "exigence de connexion". Les résultats sont dans le tableau ci-dessous:
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
sont des noms d'utilisateurcnX
sont des noms informatiquesLes résultats ci-dessus sont surprenants car le contexte qu'un script de détection s'effectue semble dépendre de la partie si l'application a été déployée sur un utilisateur ou un système. Cela était suffisant d'une surprise que j'ai dirigé les tests une seconde fois. Les résultats étaient cohérents.
Nous pouvons attirer provisoirement les hypothèses suivantes de la table ci-dessus:
Les trois hypothèses ci-dessus sont étayées par les résultats du test. Il se peut que d'autres variables ne soient pas testées là où ces hypothèses ne tiennent pas. Ils sont au moins un bon ensemble d'hypothèses initiales lors de l'utilisation de scripts de détection PowerShell.
Jason Sandys a documenté un test similaire des règles de contexte d'installation. Si vous lisez ce post avec soin, vous remarquerez peut-être que les règles du contexte d'installation et du contexte de script de détection ne sont pas tout à fait identiques. Voici les règles incriminées:
Lorsqu'un comportement d'installation d'une application est défini sur "Installer en tant que système", le programme d'installation est exécuté en tant que système [quel que soit le déploiement à l'utilisateur].
Lorsqu'une application est déployée sur un utilisateur, un script de détection PowerShell pour cette application est exécuté comme cet utilisateur [quel que soit le comportement d'installation soit défini sur "Installer en tant que système"].
Cela signifie que une application qui a un comportement d'installation "Installer comme système" et est déployé sur une collection utilisateur utilisera le contexte système pour l'installation, mais l'utilisateur Contexte de détection.
Quelqu'un d'écriture de scripts de détection pour les applications où le comportement d'installation est "Installer comme système" doit veiller à ne pas s'appuyer sur une partie de l'environnement qui change entre le système et les contextes utilisateur. Sinon, la détection d'une application déployée sur une collection système peut réussir lors de la détection de la même application déployée sur une collection d'utilisateurs échoue.
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)
}