In quale context vengono eseguiti script SCCM Powershell di rilevamento?

Ho finalmente avuto successo utilizzando script di rilevamento di PowerShell sui client con la politica di esecuzione AllSigned . (suggerimento: ha iniziato a lavorare dopo l'installazione del service pack più recente e utilizzando la soluzione di Adam Meltzer .)

Ora che è pratico utilizzare gli script PowerShell per il rilevamento delle applicazioni, mi fa domandare le seguenti cose:

  • Do SCCM 2012 R2 Manutenzione Windows Inherit?
  • Come accettare EULAs per gli aggiornamenti software distribuiti tramite SCCM utilizzando Powershell
  • Rapporto SCCM: aggiornamento della conformità per dispositivo in una raccolta
  • SCCM WMI Ottenere Patch che richiedono il riavvio
  • SCCM Distribuzione di Win7 Enterprise select la lingua durante l'OSD
  • Shrinking Database utilizzando AUTO_SHRINK ON, utile o sta consumando molte risorse?
    1. In quale context il client SCCM esegue gli script di rilevamento di PowerShell? Sistema? Utente?
    2. Il context dipende dal fatto che si seleziona "Installa per utente" o "Installa per sistema" nel tipo di distribuzione?

    La documentazione è piuttosto scarsa su questo argomento. La migliore risorsa che ho trovato per gli script di rilevamento di SCCM PowerShell è questo post di blog Kloud , tuttavia, è silenzioso sulla questione del context.

  • SCCM 2012 e WSUS ... cartella Schema mancante
  • SCCM WMI Ottenere Patch che richiedono il riavvio
  • Shrinking Database utilizzando AUTO_SHRINK ON, utile o sta consumando molte risorse?
  • SCCM 2012 R2 - avvio di PC sconosciuto su PXE - errore di file bcd
  • Come accettare EULAs per gli aggiornamenti software distribuiti tramite SCCM utilizzando Powershell
  • Nome path directory non valido che tenta di eseguire il backup dell'object Criteri di gruppo
  • One Solution collect form web for “In quale context vengono eseguiti script SCCM Powershell di rilevamento?”

    Risultati empirici

    Ho scritto qualche PowerShell che, quando viene eseguito come script di rilevamento, dissipa le variables di ambiente che lo script di rilevamento vede un file di registro. Lo script è alla fine di questa risposta.

    Procedo quindi che questo script venga eseguito dal client SCCM distribuendo un tipo di distribuzione con diversi parametri "Comportmento di installazione" e "Requisito di accesso". I risultati sono riportti nella seguente tabella:

     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 context in cui viene eseguito uno script di rilevamento sembra dipendere in parte da se l'applicazione è stata distribuita a un utente o un sistema. Questo è stato abbastanza di una sorpresa che ho eseguito i test una seconda volta. I risultati sono stati coerenti.

    Possiamo tentare di disegnare le seguenti ipotesi dalla tabella precedente:

    1. Quando un'applicazione viene distribuita a un utente, uno script di rilevamento PowerShell per tale applicazione viene eseguito come tale utente.
    2. Quando un'applicazione viene distribuita in un sistema e il tipo di distribuzione è installato per il sistema, uno script di rilevamento di PowerShell per tale applicazione viene eseguito come sistema.
    3. Quando un'applicazione viene distribuita in un sistema e il tipo di distribuzione è installato per l'utente, uno script di rilevamento PowerShell per tale applicazione viene eseguito come utente registrato.

    Le tre ipotesi sopra indicate sono supportte dai risultati del test. Ci possono essere alcune altre variables che non sono state testate in cui queste ipotesi non si trovano. Sono, alless, un buon insieme di assunzioni iniziali quando si utilizzano script di rilevamento di PowerShell.

    Contesti non corrispondenti (attenzione!)

    Jason Sandys ha documentato un simile test delle regole per il context di installazione. Se leggete con attenzione questo post, puoi notare che le regole per il context di installazione e il context di script di rilevamento non sono uguali. Ecco le regole offensive:

    Quando un comportmento di 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 di PowerShell per tale applicazione viene eseguito come tale utente [indipendentemente dal fatto che il comportmento dell'installazione sia impostato su "Installa come sistema"].

    Ciò significa che un'applicazione che ha comportmento di installazione "Installa come sistema" e viene distribuito in una raccolta di utenti utilizzerà il context di sistema per l'installazione, ma il context utente per il rilevamento.

    Alcuni script di rilevazione di scrittura per applicazioni in cui il comportmento dell'installazione è "Installa come sistema" dovrebbero fare attenzione a non fare affidamento su alcuna parte dell'ambiente che cambia tra il sistema ei contesti utente. In caso contrario, la rilevazione di un'applicazione distribuita in una collezione di sisthemes potrebbe avere successo, mentre il rilevamento della stessa applicazione distribuita in una collezione 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) } 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.