경험적 결과
감지 스크립트로 실행될 때 감지 스크립트가 보는 환경 변수를 로그 파일에 덤프하는 일부 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
컴퓨터 이름입니다
분석
위의 결과는 탐지 스크립트가 실행되는 컨텍스트가 응용 프로그램이 사용자 또는 시스템에 배포되었는지 여부에 부분적으로 의존하는 것처럼 보이기 때문에 놀랍습니다. 테스트를 두 번째로 실행 한 것은 놀랍습니다. 결과는 일관되었다.
위의 표에서 다음과 같은 가설을 잠정적으로 그릴 수 있습니다.
- 응용 프로그램이 사용자에게 배포되면 해당 응용 프로그램의 PowerShell 검색 스크립트가 해당 사용자로 실행됩니다.
- 응용 프로그램을 시스템에 배포하고 시스템에 배포 유형을 설치하면 해당 응용 프로그램의 PowerShell 검색 스크립트가 시스템으로 실행됩니다.
- 응용 프로그램이 시스템에 배포되고 사용자에 대한 배포 유형이 설치되면 해당 응용 프로그램의 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)
}