実証結果
PowerShellを作成しました。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
unX
ユーザー名です
cnX
コンピューター名です
分析
検出スクリプトが実行されるコンテキストは、アプリケーションがユーザーに展開されたかシステムに展開されたかに一部依存しているように見えるため、上記の結果は驚くべきものです。これは、2回目のテストを実行したので十分な驚きでした。結果は一貫していました。
上記の表から次の仮説を暫定的に引き出すことができます。
- アプリケーションがユーザーにデプロイされると、そのアプリケーションのPowerShell検出スクリプトがそのユーザーとして実行されます。
- アプリケーションがシステムに展開され、そのシステムに展開の種類がインストールされると、そのアプリケーションのPowerShell検出スクリプトがシステムとして実行されます。
- アプリケーションがシステムにデプロイされ、ユーザーにデプロイメントタイプがインストールされると、そのアプリケーションのPowerShell検出スクリプトがログインユーザーとして実行されます。
上記の3つの仮説は、テスト結果によってサポートされています。これらの仮説が当てはまらない場合は、テストされなかった他の変数があるかもしれません。これらは、少なくとも、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)
}