สคริปต์การตรวจจับ SCCM Powershell ทำงานในบริบทใด


11

ในที่สุดฉันก็ประสบความสำเร็จในการใช้สคริปต์ตรวจจับ PowerShell กับลูกค้าที่มีAllSignedนโยบายการดำเนินการ (คำใบ้: มันเริ่มทำงานหลังจากติดตั้งService Pack ล่าสุดและใช้วิธีแก้ปัญหาของ Adam Meltzer )

ตอนนี้มันเป็นประโยชน์ในการใช้สคริปต์ PowerShell สำหรับการตรวจจับแอปพลิเคชันทำให้ฉันสงสัยในสิ่งต่อไปนี้:

  1. ไคลเอนต์ SCCM เรียกใช้สคริปต์ตรวจจับ PowerShell ในบริบทใด ระบบ? ผู้ใช้?
  2. บริบทขึ้นอยู่กับว่าคุณเลือก "ติดตั้งสำหรับผู้ใช้" หรือ "ติดตั้งสำหรับระบบ" ในประเภทการปรับใช้หรือไม่

เอกสารประกอบค่อนข้างเบาบางในหัวข้อนี้ ทรัพยากรที่ดีที่สุดที่ฉันพบสำหรับสคริปต์การตรวจจับ SCCM PowerShell คือโพสต์บล็อกของ Kloud นี้อย่างไรก็ตามมันเงียบในเรื่องของบริบท

คำตอบ:


13

ผลลัพธ์เชิงประจักษ์

ฉันเขียน 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)
}

+1 สำหรับคำถามและคำตอบที่มั่นคง SCCM ฉันหวังว่าชุมชน SCCM ที่นี่จะเติบโตขึ้นเพราะมันเป็นสิ่งเดียวที่ฉันเฝ้าระวัง (การสมัครสมาชิกอีเมลสำหรับแท็ก) ที่นี่มีตัวแทนพิเศษบางอย่างที่เป็นแรงจูงใจให้ 'em comin
MDMoore313

2
ขอบคุณ @BigHomie ฉันกำลังกรอง SCCM ด้วย ... แต่ฉันพลาดไปเพราะมันไม่มีวิธีการที่จะนำสตรีมที่ผ่านการกรองนั้นไปใช้บนมือถือได้
alx9r

2
คำถาม SCCM ที่ยอดเยี่ยม! มาเข้าร่วม @BigHomie และ I - custodians ของแท็ก [sccm] มีพวกเราสองคน

Darn Skippy, @kce มีคำถามที่ดีที่สุดที่ด้านข้างของแท็ก Windows นี้เช่นกัน
MDMoore313
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.