Risultati empirici
Ho scritto alcuni PowerShell che, quando eseguito come script di rilevamento, scarica le variabili di ambiente che lo script di rilevamento vede in un file di registro. Quella sceneggiatura è alla fine di questa risposta.
Quindi faccio eseguire questo script dal client SCCM distribuendo un tipo di distribuzione con diversi parametri "Comportamento installazione" e "Requisiti di accesso". I risultati sono nella tabella seguente:
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
sono nomi utente
cnX
sono nomi di computer
Analisi
I risultati di cui sopra sono sorprendenti perché il contesto in cui viene eseguito uno script di rilevamento sembra dipendere in parte dal fatto che l'applicazione sia stata distribuita a un utente o un sistema. Questa è stata una sorpresa abbastanza che ho eseguito i test una seconda volta. I risultati sono stati coerenti.
Possiamo provvisoriamente trarre le seguenti ipotesi dalla tabella sopra:
- Quando un'applicazione viene distribuita a un utente, uno script di rilevamento PowerShell per tale applicazione viene eseguito come tale utente.
- Quando un'applicazione viene distribuita su un sistema e il tipo di distribuzione è installato per il sistema, uno script di rilevamento PowerShell per quell'applicazione viene eseguito come sistema.
- Quando un'applicazione viene distribuita su un sistema e viene installato il tipo di distribuzione per l'utente, uno script di rilevamento di PowerShell per tale applicazione viene eseguito come utente connesso.
Le tre ipotesi sopra riportate sono supportate dai risultati del test. Potrebbero esserci alcune altre variabili che non sono state testate in cui queste ipotesi non valgono. Sono almeno una buona serie di ipotesi iniziali quando si usano gli script di rilevamento di PowerShell.
Contesti non corrispondenti (attenzione!)
Jason Sandys ha documentato un test analogo delle regole per il contesto di installazione. Se leggi attentamente questo post, potresti notare che le regole per il contesto di installazione e il contesto dello script di rilevamento non sono esattamente le stesse. Ecco le regole offensive:
Quando il comportamento dell'installazione di un'applicazione è impostato su "Installa come sistema", il programma di installazione viene eseguito come sistema [indipendentemente dalla distribuzione all'utente].
Quando un'applicazione viene distribuita a un utente, uno script di rilevamento PowerShell per quell'applicazione viene eseguito come quell'utente [indipendentemente dal fatto che il comportamento dell'installazione sia impostato su "Installa come sistema"].
Ciò significa che un'applicazione con comportamento di installazione "Installa come sistema" e distribuita a una raccolta utenti utilizzerà il contesto di sistema per l'installazione, ma il contesto utente per il rilevamento.
Qualcuno che scrive script di rilevamento per applicazioni in cui il comportamento dell'installazione è "Installa come sistema" dovrebbe fare attenzione a evitare di fare affidamento su qualsiasi parte dell'ambiente che cambia tra il sistema e il contesto dell'utente. In caso contrario, il rilevamento di un'applicazione distribuita in una raccolta di sistemi potrebbe avere esito positivo mentre il rilevamento della stessa applicazione distribuita in una raccolta di utenti non riesce.
copione
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)
}