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

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

実行ポリシーを持つクライアントでPowerShell検出スクリプトを使用することにようやく成功しましたAllSigned。(ヒント:インストール後に動作し始めました。最新のサービスパックそして使用アダム・メルツァーの回避策

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

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

このトピックに関するドキュメントは非常に少ないです。SCCM PowerShell検出スクリプトに関する最良のリソースは、このKloudブログ投稿しかし、文脈については何も言及されていない。

答え1

実証結果

検出スクリプトとして実行すると、検出スクリプトが認識する環境変数をログ ファイルにダンプする 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コンピュータ名

分析

上記の結果は驚くべきものです。検出スクリプトが実行されるコンテキストは、アプリケーションがユーザーに展開されたかシステムに展開されたかによって部分的に左右されるようです。これは十分に驚くべきことだったので、テストをもう一度実行しました。結果は一貫していました。

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

  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)
}

関連情報