SCCM Powershell 탐지 스크립트는 어떤 컨텍스트에서 실행됩니까?

SCCM Powershell 탐지 스크립트는 어떤 컨텍스트에서 실행됩니까?

AllSigned실행 정책이 있는 클라이언트에서 PowerShell 감지 스크립트를 사용하여 마침내 성공했습니다 . (힌트: 설치 후 작동하기 시작했습니다.최신 서비스 팩그리고 사용Adam Meltzer의 해결 방법.)

이제 애플리케이션 검색을 위해 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 감지 스크립트가 로그인된 사용자로 실행됩니다.

위의 세 가지 가설은 테스트 결과에 의해 뒷받침됩니다. 이러한 가설이 성립되지 않는 곳에 테스트되지 않은 다른 변수가 있을 수도 있습니다. 이는 최소한 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)
}

관련 정보