SCCM-TaskSequence per LogonScript triggern
Hallo @ All
Wieder mal stehe ich leicht vor eine Wand und hoffe auf eure Hilfe.
Aktueller Stand:
Im Unternehmen gibt es einige Core-Applicationen die via SCCM (Application die entsprechenden Device-Collections zugewiesen sind (Deployments)) periodisch aktualisiert werden (Patch-Day). Das passiert ca. 1x die Woche, weil sich die Sourcen ständig ändern. Dazu nutzen wir WoL und verteilen die entsprechenden Applications
Für alle Clients die am Patch-Day nicht erreicht werden konnten, weil sie ausgeschaltet waren oder nicht im Haus, müssen die Apps während des Logon aktualisiert werden.
Das funktioniert. Dauert nur manchmal etwas länger. Ein Snipped des entsprechenden Codes im LogonScript.ps1 (per GPO verteilt) siehe hier::
Nun gibt es eine neue Vorgabe, nämlich, dass die Core-Apps in einer TS aktualisiert werden. Das Logon-Script soll nun also die TS triggern.
Und hier stehe ich aktuell auch an.
Ich habe eine entsprechende TS erstellt, frage mich aber wie ich sie im Script triggern kann. Die TS einer Collection zuzuweisen kommt nicht in frage, weil der User sie nicht im Software-Center sehen soll.
Einige Foren beschreiben ein Tool (bsp: Trigger-SCCMTaskSequence.exe <PackageID>) Ich will aber kein Tool verwenden, (bzw. ist untersagt) sondern die TS direkt per WMI triggern.
aktuelle Infrastruktur (rudimentät):
SCCM 1809. Clients: ausschließlich Windows 10 Enterprise x64 1809.
Hat jemand eine Idee wie ich das bewerkstelligen kann?
Vielen Dank für eure Unterstützung!
Mayho
Wieder mal stehe ich leicht vor eine Wand und hoffe auf eure Hilfe.
Aktueller Stand:
Im Unternehmen gibt es einige Core-Applicationen die via SCCM (Application die entsprechenden Device-Collections zugewiesen sind (Deployments)) periodisch aktualisiert werden (Patch-Day). Das passiert ca. 1x die Woche, weil sich die Sourcen ständig ändern. Dazu nutzen wir WoL und verteilen die entsprechenden Applications
Für alle Clients die am Patch-Day nicht erreicht werden konnten, weil sie ausgeschaltet waren oder nicht im Haus, müssen die Apps während des Logon aktualisiert werden.
Das funktioniert. Dauert nur manchmal etwas länger. Ein Snipped des entsprechenden Codes im LogonScript.ps1 (per GPO verteilt) siehe hier::
# ensure PSRemoting is enabled !!
# as Admin Enable-PSRemoting –force
Function Start-WinRM()
{
$ServiceStatus = Get-Service -Name WinRM
if($ServiceStatus.Status -eq 'Stopped')
{
Start-Service -Name WinRM -ErrorAction SilentlyContinue
}
}
Function Get-SCCMApps()
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$false, ValueFromPipeline=$true, Position=0)][string]$AppNames
)
Begin{
Start-WinRM
if (![string]::IsNullOrEmpty($AppNames))
{
$AppList = @()
if($AppNames)
{
if($AppNames -match ',')
{$AppList = [Regex]::Split($AppNames,",")}
elseif($AppNames -match ';')
{$AppList = [Regex]::Split($AppNames,";")}
else
{$AppList = $AppNames}
}
}
}
Process{
$Application = (Get-CimInstance -ClassName CCM_Application -Namespace "root\ccm\clientSDK" | Where-Object {$_.InstallState -like 'NotInstalled'})
$toReturn = @()
if (![string]::IsNullOrEmpty($AppNames))
{
foreach ($app in $Application)
{
foreach ($search in $AppList)
{
if([regex]::Match($app.FullName, $search, [System.Text.RegularExpressions.RegexOptions]::IgnoreCase).Success)
{
$toReturn += $app
}
}
}
}
else
{
$toReturn = $Application
}
}
End{
return $toReturn
}
}
function Invoke-SCCMAppInstall()
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$false, ValueFromPipeline=$true, Position=0)][string]$AppNames
)
Begin{
Start-WinRM
$Computername = "."
$AppList = @()
if(![string]::IsNullOrEmpty($AppNames))
{
if($AppNames -match ',')
{$AppList = [Regex]::Split($AppNames,",")}
elseif($AppNames -match ';')
{$AppList = [Regex]::Split($AppNames,";")}
else
{$AppList = $AppNames}
}
}
Process{
if($AppList -ne $null -or $AppList.count -lt 1)
{
$Application = (Get-SCCMApps -AppNames $AppNames)
}
else
{
$Application = (Get-CimInstance -ClassName CCM_Application -Namespace "root\ccm\clientSDK" | Where-Object {$_.InstallState -like 'NotInstalled'})
}
if (![string]::IsNullOrEmpty($AppNames))
{
foreach ($app in $Application)
{
foreach ($search in $AppList)
{
if ([regex]::Match($app.FullName, $search, [System.Text.RegularExpressions.RegexOptions]::IgnoreCase).Success)
{
$installArguments = @{
"EnforcePreference"=[uint32] 0;
"Id"="$($app.id)";
"IsMachineTarget"=$app.IsMachineTarget;
"IsRebootIfNeeded"=$false;
"Priority"="High";
"Revision"="$($app.Revision)"}
Invoke-CimMethod -Namespace "root\ccm\clientSDK" -ClassName CCM_Application -ComputerName $Computername -MethodName "Install" -Arguments $installArguments | Out-Null
WaitForCompletition -Application $app
}
}
}
}
else
{
foreach ($app in $Application)
{
$installArguments = @{
"EnforcePreference"=[uint32] 0;
"Id"="$($app.id)";
"IsMachineTarget"=$app.IsMachineTarget;
"IsRebootIfNeeded"=$false;
"Priority"="High";
"Revision"="$($app.Revision)"}
Invoke-CimMethod -Namespace "root\ccm\clientSDK" -ClassName CCM_Application -ComputerName $Computername -MethodName "Install" -Arguments $installArguments | Out-Null
WaitForCompletition -Application $app
}
}
}
}
function WaitForCompletition()
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$True, ValueFromPipeline=$true, Position=0)][Object]$Application=""
)
Process{
Start-WinRM
do
{
$AppStatus = (Get-CimInstance -ClassName CCM_Application -Namespace "root\ccm\clientSDK" | Where-Object {$_.FullName -like $Application.FullName.ToString()})
[System.Threading.Thread]::Sleep(3000)
if($AppStatus.InstallState -eq 'Installed' -and ($AppStatus.PercentComplete -eq 0 -or $AppStatus.PercentComplete -eq 100) )
{
$exitDo = $True
}
}
until ($exitDo -eq $True)
}
}
# AppNames mit entsprechendem AppCatalog-Name ersetzen
Invoke-SCCMAppInstall -AppNames "java 8,canon"
Nun gibt es eine neue Vorgabe, nämlich, dass die Core-Apps in einer TS aktualisiert werden. Das Logon-Script soll nun also die TS triggern.
Und hier stehe ich aktuell auch an.
Ich habe eine entsprechende TS erstellt, frage mich aber wie ich sie im Script triggern kann. Die TS einer Collection zuzuweisen kommt nicht in frage, weil der User sie nicht im Software-Center sehen soll.
Einige Foren beschreiben ein Tool (bsp: Trigger-SCCMTaskSequence.exe <PackageID>) Ich will aber kein Tool verwenden, (bzw. ist untersagt) sondern die TS direkt per WMI triggern.
aktuelle Infrastruktur (rudimentät):
SCCM 1809. Clients: ausschließlich Windows 10 Enterprise x64 1809.
Hat jemand eine Idee wie ich das bewerkstelligen kann?
Vielen Dank für eure Unterstützung!
Mayho
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 441173
Url: https://administrator.de/contentid/441173
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
4 Kommentare
Neuester Kommentar
Zitat von @mayho33:
Es gibt bestimmt 100te bessere Möglichkeiten, aber wenn du eine Domain-Architect vor der Nase sitzen hast, kann du 1000 mal bessere Vorschläge liefern. Der DomAr...ch hat das letzte Wort.
Es gibt bestimmt 100te bessere Möglichkeiten, aber wenn du eine Domain-Architect vor der Nase sitzen hast, kann du 1000 mal bessere Vorschläge liefern. Der DomAr...ch hat das letzte Wort.
Moin,
in größeren Umgebungen ist ein Standard halt wertvoll, wenn auch nicht immer ideal. Einen Lösungsansatz könntest du hier finden.
/Thomas]