Nach einem Absturz der SCCM Konsole ist ein Objekt für die Bearbeitung durch den sogenannten SEDO-Lock gesperrt. In meinem Fall war dies heute eine Application (Anwendung):
Neben der früher angesprochenen (und bis heute nicht supporteten) Variante, den Lock direkt auf der Datenbank zu löschen, gibt es zwei Varianten die unterstützt werden (eigentlich drei – die dritte wäre, 30 Minuten zu warten):
PowerShell:
Die erste Alternative (und auch die erste Wahl ) ist die Verwendung der PowerShell:
Alternativ kann einfach der SMS Executive Dienst neugestartet werden, was die Wartezeit von 30 Minuten abkürzt, aber natürlich auch weitere Folgen für den Betrieb des SCCM hat.
Das Update wird automatisch, aber erst nach und nach verteilt. Wer zu den Ersten gehören möchte, die es bekommen, kann dieses PowerShell-Skript nutzen:
Um den Site Code (Standortcode) eines SCCM Clients auszulesen, kann man WMI verwenden. Ich habe dafür ein kleines PowerShell Script geschrieben:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<# .Synopsis Returns the Site Code of a SCCM Client as a String .DESCRIPTION Queries a given computer using WMI and returns its site code for System Center Configuration Manager (Tested on 2012 R2 and 1511) .EXAMPLE Get-SMSSiteCode -MachineName PC1 Get's the site code of the Computer named PC1 #>Function Get-SMSSiteCode
{Param(# The Computername of the machine that you want to query for it's SCCM Site Code[Parameter(Mandatory=$true)][string]$MachineName)Return(Get-WmiObject-ComputerName$MachineName `
-Namespace"root\CCM" `
-Class sms_authority `
).Name.TrimStart("SMS:")}
<# .Synopsis Returns the Site Code of a SCCM Client as a String .DESCRIPTION Queries a given computer using WMI and returns its site code for System Center Configuration Manager (Tested on 2012 R2 and 1511) .EXAMPLE Get-SMSSiteCode -MachineName PC1 Get's the site code of the Computer named PC1 #>
Function Get-SMSSiteCode
{
Param(
# The Computername of the machine that you want to query for it's SCCM Site Code
[Parameter(Mandatory=$true)]
[string]$MachineName
)
Return (Get-WmiObject -ComputerName $MachineName `
-Namespace "root\CCM" `
-Class sms_authority `
).Name.TrimStart("SMS:")
}
Ich habe in den letzten Wochen einige neue Videos zum System Center Configuration Manager 2012 R2 bzw. 2016 (1511) gemacht. Diese könnt ihr hier ansehen:
Nur ein kurzer Hinweis: Seit einigen Tagen gibt es ein kostenloses eBook zum Verteilen von Windows 10 mit Hilfe des System Center Configuration Manager (SCCM). Das fast 100 Seiten umfassende Werk enthält viel Wissenswertes vor allem für SCCM-Einsteiger, die Windows 10 in Ihren Umgebungen ausrollen wollen.
In einem älteren Artikel habe ich mich schon einmal mit der Frage beschäftigt, wie man neue Genehmigungsanforderungen für Software (Anwendungen) in System Center Configuration Manager per Mail an den Admin melden kann.
Was aber, wenn nicht (nur) der Admin eine Mail erhalten soll, sondern z.B. auch der Vorgesetzte des jeweiligen Benutzers, der die Software angefordert hat? Und was ist mit dem Benutzer selbst? Es wäre doch gut, wenn dieser bei Genehmigung/Ablehnung auch informiert wird?!
Das Ganze lässt sich natürlich wunderbar per PowerShell lösen. Damit nun aber nicht ein Prozess o.ä. permanent laufen muss, wäre es sinnvoll, dieses Skript z.B. nur 1x pro Stunde (über den Taskplaner) automatisch laufen zu lassen. In sofern interessieren in jedem Durchlauf des Skriptes auch nur diejenigen Anforderungen, die
In der letzten Stunde neu erstellt wurden (“CurrentState” ist 1)
In der letzten Stunde abgelehnt wurden (“CurrentState” ist 3)
In der letzten Stunde genehmigt wurden (“CurrentState” ist 4)
Aus dieser Überlegung und der Tatsache, dass sich sowohl der Vorgesetzte als auch die Mailadressen aus dem AD auslesen lassen, resultierte dieses einfache Script (Es ist nicht wirklich “schön” geschrieben, aber zumindest rudimentär kommentiert. Für einen produktiven Einsatz wird man es ohnehin nochmal an die eigenen Bedürfnisse anpassen müssen:
$SiteName="PS0"$SiteName="PS0"$AdminsMail="helpdesk@kurs.intern"$Mailserver="mail.kurs.intern"$Absender="SCCM Application Request Admin"$MailAnAdmins=$True$MailAnVorgesetzten=$Truefunction Send-MyEmail
{Param([string]$Sender,[string]$Empfaenger,[string]$Mailserver,[string]$Betreff,[string]$Mailtext,[Switch]$TestOnly)
try{If(-not$TestOnly){
Send-MailMessage -From $Sender-To $Empfaenger-Subject $Betreff-Body$Mailtext-SmtpServer $Mailserver-ErrorAction Stop
}else{Write-Host"E-Mail für '$Empfaenger' von '$Sender' über den Mailserver '$MailServer' `n
mit dem Betreff '$Betreff' und dem Text:"Write-Host"$Mailtext `n"}}
catch{Write-Debug"Fehler beim Versand der E-Mail über den Mailserver $SmtpServer!"}}# PS-Modul für AD lasen
Import-Module ActiveDirectory
# PS-Module für SCCM laden
Import-Module "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1"Set-Location"$($SiteName):\"# ApprovalRequests auslesen, die sich in der letzten Stunde geändert haben # (Script soll stündlich laufen)$OffeneRequests= Get-CMApprovalRequest |Where{$_.LastModifiedDate -gt(Get-Date).AddHours(-1)}ForEach($Requestin$OffeneRequests){# Anfordernder Benutzer$Benutzer=$Request.User
$BenutzerLogin= Get-ADUser $($Benutzer.Substring(($Benutzer.IndexOf("\")+1),$Benutzer.Length-$Benutzer.IndexOf("\")-1))$BenutzerName=($BenutzerLogin| Get-ADUser).Name
# Anwendung um die es geht$Anwendung=$Request.Application
# Neue AnforderungIf($Request.CurrentState -eq1){# E-Mail an Admin / Helpdeks sendenIf($MailAnAdmins){
Send-MyEmail -Sender $Absender-Empfaenger $AdminsMail-Mailserver $Mailserver-Betreff "Neue Softwareanforderung von $BenutzerName"-Mailtext "Blabla..."-TestOnly
}# E-Mail an Vorgesetzten sendenIf($MailAnVorgesetzten){# Vorgesetzter des anfordernden Benutzers$Vorgesetzter=($BenutzerLogin| Get-ADObject -Properties Manager).Manager | Get-ADUser
$VorgesetzterMail=(Get-ADObject $Vorgesetzter-Properties mail).Mail
Send-MyEmail -Sender $Absender-Empfaenger $VorgesetzterMail-Mailserver $Mailserver-Betreff "Neue Softwareanforderung von $BenutzerName"-Mailtext "Blabla..."-TestOnly
}}# Anforderung wurde durch einen Administrator im SCCM genehmigtIf($Request.CurrentState -eq4){# Mail an den anfordernden User senden$BenutzerMail=(Get-ADObject $BenutzerLogin-Properties mail).Mail
Send-MyEmail -Sender $Absender-Empfaenger $BenutzerMail-Mailserver $Mailserver-Betreff "Ihre Softwareanforderung für $Anwendung wurde genehmigt"-Mailtext "Blabla..."-TestOnly
}# Anforderung wurde durch einen Administrator im SCCM abgelehntIf($Request.CurrentState -eq3){# Mail an den anfordernden User senden$BenutzerMail=(Get-ADObject $BenutzerLogin-Properties mail).Mail
Send-MyEmail -Sender $Absender-Empfaenger $BenutzerMail-Mailserver $Mailserver-Betreff "Ihre Softwareanforderung für $Anwendung wurde abgelehnt"-Mailtext "Blabla..."-TestOnly
}}
$SiteName = "PS0"
$SiteName = "PS0"
$AdminsMail = "helpdesk@kurs.intern"
$Mailserver = "mail.kurs.intern"
$Absender = "SCCM Application Request Admin"
$MailAnAdmins = $True
$MailAnVorgesetzten = $True
function Send-MyEmail
{
Param(
[string]$Sender,
[string]$Empfaenger,
[string]$Mailserver,
[string]$Betreff,
[string]$Mailtext,
[Switch]$TestOnly
)
try{
If(-not $TestOnly)
{
Send-MailMessage -From $Sender -To $Empfaenger -Subject $Betreff -Body $Mailtext
-SmtpServer $Mailserver -ErrorAction Stop
}
else
{
Write-Host "E-Mail für '$Empfaenger' von '$Sender' über den Mailserver '$MailServer' `n
mit dem Betreff '$Betreff' und dem Text:"
Write-Host "$Mailtext `n"
}
}
catch{
Write-Debug "Fehler beim Versand der E-Mail über den Mailserver $SmtpServer!"
}
}
# PS-Modul für AD lasen
Import-Module ActiveDirectory
# PS-Module für SCCM laden
Import-Module "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1"
Set-Location "$($SiteName):\"
# ApprovalRequests auslesen, die sich in der letzten Stunde geändert haben
# (Script soll stündlich laufen)
$OffeneRequests = Get-CMApprovalRequest | Where {$_.LastModifiedDate -gt (Get-Date).AddHours(-1)}
ForEach($Request in $OffeneRequests)
{
# Anfordernder Benutzer
$Benutzer = $Request.User
$BenutzerLogin = Get-ADUser $($Benutzer.Substring(($Benutzer.IndexOf("\")+1),
$Benutzer.Length-$Benutzer.IndexOf("\")-1))
$BenutzerName = ($BenutzerLogin | Get-ADUser).Name
# Anwendung um die es geht
$Anwendung = $Request.Application
# Neue Anforderung
If($Request.CurrentState -eq 1)
{
# E-Mail an Admin / Helpdeks senden
If($MailAnAdmins)
{
Send-MyEmail -Sender $Absender -Empfaenger $AdminsMail -Mailserver $Mailserver
-Betreff "Neue Softwareanforderung von $BenutzerName" -Mailtext "Blabla..."
-TestOnly
}
# E-Mail an Vorgesetzten senden
If($MailAnVorgesetzten)
{
# Vorgesetzter des anfordernden Benutzers
$Vorgesetzter = ($BenutzerLogin | Get-ADObject -Properties Manager).Manager | Get-ADUser
$VorgesetzterMail = (Get-ADObject $Vorgesetzter -Properties mail).Mail
Send-MyEmail -Sender $Absender -Empfaenger $VorgesetzterMail -Mailserver $Mailserver
-Betreff "Neue Softwareanforderung von $BenutzerName" -Mailtext "Blabla..."
-TestOnly
}
}
# Anforderung wurde durch einen Administrator im SCCM genehmigt
If($Request.CurrentState -eq 4)
{
# Mail an den anfordernden User senden
$BenutzerMail = (Get-ADObject $BenutzerLogin -Properties mail).Mail
Send-MyEmail -Sender $Absender -Empfaenger $BenutzerMail -Mailserver $Mailserver
-Betreff "Ihre Softwareanforderung für $Anwendung wurde genehmigt" -Mailtext "Blabla..."
-TestOnly
}
# Anforderung wurde durch einen Administrator im SCCM abgelehnt
If($Request.CurrentState -eq 3)
{
# Mail an den anfordernden User senden
$BenutzerMail = (Get-ADObject $BenutzerLogin -Properties mail).Mail
Send-MyEmail -Sender $Absender -Empfaenger $BenutzerMail -Mailserver $Mailserver
-Betreff "Ihre Softwareanforderung für $Anwendung wurde abgelehnt" -Mailtext "Blabla..."
-TestOnly
}
}
In der Ausführung sieht das dann so aus:
Ausführen lässt sich das Skript via Taskplaner dann beispielsweise mit:
Durch einen Hinweis wurde ich kürzlich auf eine ziemlich praktische Funktion aufmerksam. Stellen wir uns vor, wir brauchen “schnell” alle Geräte mit einer gemeinsamen Eigenschaft oder einfach alle Geräte einer bestimmten Sammlung. Und zwar möglichst in Excel, um diese an Kollegen weitergeben oder weiter verarbeiten zu können. Natürlich kann man nun einen entsprechenden Report erzeugen und dessen Ergebnis in XLS oder CSV abspeichern – aber es geht auch einfacher. Da hier ein Video mehr als viele Worte oder Bilder sagt, habe ich kurzerhand einen kurzen Clip erstellt. Seht selbst!
In Kurzform und wenigen Worten: Man kann die Elemente (bspw. Geräte) markieren (geht mit STRG+A, oder auch mit STRG/SHIFT und Mausklick), mit STRG+C kopieren und dann eben mit STRG+V in Excel einfügen…
Wenn man auch noch nicht viel darüber im Internet findet, so kann man aber auf der Webseite des gut informierten SCCM-MVP Niall C. Brady nachlesen, dass heute die Technical Preview vom System Center Configuration Manager in Version 1601 erschienen ist:
Am leichtesten ist es für den Administrator natürlich, wenn alle verwalteten Geräte in der selben Domäne stehen. Aber der System Center Configuration Manager ist auch in der Lage, mit Geräten umzugehen, die außerhalb der eigenen Gesamtstruktur (“Forest”) in einer nicht-vertrauten Domäne (“Non-trusted Domain”) oder sogar nur in einer Arbeitsgruppe (“Workgroup”) stehen. Dafür sind ein paar Voraussetzungen zu erfüllen und ein paar Besonderheiten bei der Einrichtung zu beachten.
Voraussetzungen:
Geräte der nicht-vertrauten Domäne (“nvD”) oder der Workgroup (“WG”) können den gewünschten Verwaltungspunkt (“Management Point”, MP) per DNS auflösen
Verwaltete Geräte in der nvD und/oder der WG können von den Standortsystemservern (“Site Server”) des SCCMs aufgelöst werden (bei nvD zusätzlich der Domänen-Name der nvD)
Das Konto der Client-Push-Installation hat ausreichend Rechte auf den Zielcomputern
Bei nvD ist ein Domänen-Account der nvD nötig, der auf den Clients lokale Admin-Rechte hat
Bei WG-Computern ist ein lokales Admin-Konto nötig, dass auf jedem WG-Computer gleich konfiguriert ist (Name / Passwort)
Um nun den Configuration Manager Client auf einem Gerät in einer Workgroup hinzuzufügen, kann die Push-Installation verwendet werden. Dazu muss a) die Firewall des PCs entsprechend geöffnet werden und b) ein passendes (lokales!) Konto als Push-Installations-Konto hinterlegt werden (Mehrere Konten möglich!):
Außerdem ist es notwendig, ein passendes Netzwerkzugriffskonto (“Network Access Account”) im SCCM zu hinterlegen, denn das Computerkonto des WG-Systems hat ja keine Leserechte auf den Site-Servern der Domäne:
Nun kann der Client mittels Pushinstallation (oder auch händisch!) verteilt werden und Software und co. auf den Arbeitsgruppen-PCs bereitgestellt werden.
Für die Verwaltung von Computern in einer nicht-vertrauten Domäne (nvD) muss zunächst die Gesamtstruktur der nvD bekannt gemacht werden:
Außerdem muss die “Active Directory Systemermittlung” um die externe Domäne (nvD) ergänzt werden:
Damit können denn Geräte der externen Domäne gefunden werden – und später per Push-Installation (siehe oben) mit dem Client betankt und somit verwaltet werden.
Hinweis: Für den Aufbau einer Secondary Site in einer externen Domäne ist eine bidirektionale Vertrauensstellung notwendig! (Two-Way-Trust)