SCCM Powershell検出スクリプトはどのコンテキストで実行されますか?


11

AllSigned実行ポリシーを使用して、クライアントでPowerShell検出スクリプトを使用してようやく成功しました。(ヒント:最新のサービスパックをインストールしAdam Meltzerの回避策を使用して動作し始めました。)

PowerShellスクリプトを使用してアプリケーションを検出することが実用的になったので、次のことを疑問に思います。

  1. SCCMクライアントはどのような状況でPowerShell検出スクリプトを実行しますか?システム?ユーザー?
  2. コンテキストは、展開タイプで「ユーザー用にインストール」または「システム用にインストール」のどちらを選択したかによって異なりますか?

このトピックに関するドキュメントはかなり少ない。SCCM PowerShell検出スクリプトについて私が見つけた最良のリソースは、このKloudのブログ投稿ですが、コンテキストの問題については言及していません。

回答:


13

実証結果

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回目のテストを実行したので十分な驚きでした。結果は一貫していました。

上記の表から次の仮説を暫定的に引き出すことができます。

  1. アプリケーションがユーザーにデプロイされると、そのアプリケーションのPowerShell検出スクリプトがそのユーザーとして実行されます。
  2. アプリケーションがシステムに展開され、そのシステムに展開の種類がインストールされると、そのアプリケーションのPowerShell検出スクリプトがシステムとして実行されます。
  3. アプリケーションがシステムにデプロイされ、ユーザーにデプロイメントタイプがインストールされると、そのアプリケーションの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)
}

SCCMの質疑応答に+1。SCCMコミュニティが私が注目している唯一のものであるため、ここでSCCMコミュニティが成長することを願っています(タグのサブスクリプションをメールで送信します)。
MDMoore313

2
@BigHomieに感謝します。私もSCCMでフィルタリングしています...しかし、モバイルでそのフィルタリングされたストリームを取得する実用的な方法がないため、私は束を見逃しています。
-alx9r

2
優れたSCCMの質問!@BigHomieと私-[sccm]タグの管理者に参加してください。文字通り私たちのカップルがあります。

ダーンスキッピー、@ kceにはWindowsタグのこちら側にも最高の質問があります。
MDMoore313
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.