ผลลัพธ์เชิงประจักษ์
ฉันเขียน 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)
}