Ampirik Sonuçlar
Algılama komut dosyası olarak çalıştırıldığında, algılama komut dosyasının bir günlük dosyasına gördüğü ortam değişkenlerini dökerken bazı PowerShell yazdım. Bu senaryo bu cevabın sonunda.
Daha sonra farklı "Kurulum Davranışı" ve "Oturum açma gereksinimi" parametreleriyle bir Dağıtım Türü dağıtarak bu komut dosyasının SCCM istemcisi tarafından çalıştırılmasına neden olur. Sonuçlar aşağıdaki tabloda verilmiştir:
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
kullanıcı adları
cnX
bilgisayar isimleri
analiz
Yukarıdaki sonuçlar şaşırtıcıdır çünkü bir algılama komut dosyasının içinde çalıştığı bağlamın kısmen Uygulamanın bir kullanıcıya mı yoksa bir sisteme mi dağıtıldığına bağlı olduğu görülmektedir. Testleri ikinci kez çalıştırmam şaşırtıcıydı. Sonuçlar tutarlıydı.
Yukarıdaki tablodan aşağıdaki hipotezleri geçici olarak çizebiliriz:
- Bir Uygulama bir kullanıcıya dağıtıldığında, o Uygulama için bir PowerShell algılama komut dosyası o kullanıcı olarak çalıştırılır.
- Bir sisteme Uygulama dağıtıldığında ve sistem için Dağıtım Türü yüklendiğinde, o Uygulama için bir PowerShell algılama komut dosyası sistem olarak çalıştırılır.
- Bir sisteme bir Uygulama dağıtıldığında ve Dağıtım Türü kullanıcı için yüklendiğinde, o Uygulama için bir PowerShell algılama komut dosyası oturum açmış kullanıcı olarak çalıştırılır.
Yukarıdaki üç hipotez test sonuçları tarafından desteklenmektedir. Bu hipotezlerin olmadığı yerde test edilmemiş başka değişkenler de olabilir. Bunlar, PowerShell algılama komut dosyalarını kullanırken en azından iyi bir başlangıç varsayımı kümesidir.
Eşleşmeyen Bağlamlar (Dikkat!)
Jason Sandys, kurulum bağlamındaki kuralların benzer bir testini belgeledi. Bu gönderiyi dikkatlice okursanız, yükleme bağlamı ve algılama komut dosyası bağlamıyla ilgili kuralların tamamen aynı olmadığını fark edebilirsiniz. İşte rahatsız edici kurallar:
Bir Uygulamanın yükleme davranışı "Sistem Olarak Yükle" olarak ayarlandığında, yükleyici [kullanıcıya dağıtımdan bağımsız olarak) sistem olarak çalıştırılır.
Bir Uygulama bir kullanıcıya dağıtıldığında, o Uygulama için bir PowerShell algılama komut dosyası o kullanıcı olarak çalıştırılır [yükleme davranışının "Sistem Olarak Yükle" olarak ayarlanmasına bakılmaksızın].
Bu , yükleme davranışı “Sistem olarak yükle” olan ve bir kullanıcı koleksiyonuna dağıtılan bir Uygulamanın yükleme için sistem bağlamını, ancak algılama için kullanıcı bağlamını kullanacağı anlamına gelir .
Yükleme davranışının "Sistem Olarak Yükle" olduğu Uygulamalar için algılama komut dosyaları yazan bir kişi, ortamın sistem ve kullanıcı bağlamları arasında değişen herhangi bir bölümüne güvenmemeye dikkat etmelidir. Aksi takdirde, bir sistem koleksiyonuna dağıtılan bir Uygulamanın algılanması başarılı olurken, bir kullanıcı koleksiyonuna dağıtılan Uygulamanın tam olarak algılanması başarısız olur.
Senaryo
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)
}