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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
| $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
}
} |
$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:
powershell.exe -ExecutionPolicy Bypass -file „SCCMMailsFuerApprovalRequests.ps1“
Das Skript lässt sich auch hier herunterladen:
Downloadlink über OneDrive