AllSigned
実行ポリシーを使用して、クライアントでPowerShell検出スクリプトを使用してようやく成功しました。 (ヒント: 最新のサービスパック をインストールして Adam Meltzerの回避策 を使用した後に機能し始めました。)
アプリケーションの検出にPowerShellスクリプトを使用するのが実際的であるため、次のことを不思議に思います。
このトピックに関するドキュメントはかなりまばらです。 SCCM PowerShell検出スクリプトで見つけた最良のリソースは このKloudブログ投稿 ですが、コンテキストの問題については触れていません。
検出スクリプトとして実行すると、検出スクリプトで確認された環境変数をログファイルにダンプする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回目のテストを実行するのに十分な驚きでした。結果は一貫していた。
上記の表から次の仮説を仮に描くことができます。
上記の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)
}