In einem aktuellen Projekt bin ich auf einen Anforderung gestoßen, die mich dazu gebracht hat „mal eben“ ein PowerShell Skript mit grafischer Oberfläche zu bauen:
Szenario:
- Ein Unternehmen setzt den SCCM ein um neue Clients mit Betriebsystemen und Anwendungen zu versehen.
- Zudem setzt das Untrnehmen auf DHCP Reservierungen
- Außerdem werden am DHCP Server „Zulassen“-Filter verwendet
- Das Unternehmen muss nun 50 neue Clients installieren.
An sich klingt das noch nicht besonders schlimm….nein, eher alltäglich. Doch betrachtet man nun, dass für die Installtion der Client nun folgende Schritte notwendig sind:
- 50 x ggf. MAC-Adresse auslesen (wenn nicht vom Hersteller / Lieferanten bezogen)
- 50 x MAC-Adresse in „Zulassen“-Filter eintragen
- 50 x MAC-Adresse, IP und Beschreibung in DHCP-Reservierung eintragen
- 50 x Client mit MAC-Adresse und Namen in SCCM importieren
- 50 x Client in entsprechende Sammlung hinzufügen
Erst dann können die neuen Clients per PXE gebootet und mit einem Betriebssystem versehen werden. Dies kann einen erheblichen Aufwand darstellen.
Stellt man sich nu zusätzlich vor, dass jemand ohne große technische Ahnung die Installation erledigen soll, dann wird es umso schwieriger. Der / die Kollege/in muss wissen wie die DHCP Konsole funtkioniert, wie die SCCM-Konsole zu bedienen ist und wie man MAC-Adressen ausliest.
Script:
Um den Aufwand an dieser Stelle gering zu halten und alle oben ganannten Schritte möglichst komfortabel zu erledigen, habe ich folgendes Skript geschrieben. In der aktuellen Version werden keine Fehler abgefangen. Auch wird der Inhalt der Eingaben nicht überprüft. Trägt man aber alles richtig ein, so funktionert es.
Beim Aufruf des Skriptes öffnet sich eine grafische Oberfläche die nach MAC, IP und Name fragt. Zudem kann eine Zielsammlung ausgewählt werden
Mit einem Klick auf OK kann dann der Ablauf gestartet werden.
Das Script sieht wie folgt aus:
Zunächst wird das Formular aufgerufen
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
| [void] [System.Reflection.Assembly]::LoadWithPartialName(“System.Drawing”)
[void] [System.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”)
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = “Neuen PC importieren”
$objForm.Size = New-Object System.Drawing.Size(400,400)
$objForm.StartPosition = “CenterScreen”
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq “Enter”) { $objForm.DialogResult=”OK”;$objForm.Close()}
{
foreach ($objItem in $objListbox.SelectedItems)
{$x += $objItem}
$objForm.Close()
}
})
$objForm.Add_KeyDown({if ($_.KeyCode -eq “Escape”) { $objForm.DialogResult=”Cancel”;$objForm.Close()} })
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,350)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = “OK”
$OKButton.DialogResult = “OK”
$OKButton.Add_Click(
{
foreach ($objItem in $objListbox.SelectedItems)
{$x += $objItem}
$objForm.Close()
}
)
$objForm.Controls.Add($OKButton)
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(200,350)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = “Abbrechen”
$CancelButton.DialogResult = “Cancel”
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20)
$objLabel.Size = New-Object System.Drawing.Size(350,20)
$objLabel.Text = “Bitte MAC-Adresse im Format 00-11-22-33-44-55 eingeben:”
$objForm.Controls.Add($objLabel)
$objMACBox = New-Object System.Windows.Forms.TextBox
$objMACBox.Location = New-Object System.Drawing.Size(10,40)
$objMACBox.Size = New-Object System.Drawing.Size(350,20)
$objMACBox.Text = “MAC-Adresse”
$objForm.Controls.Add($objMACBox)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,80)
$objLabel.Size = New-Object System.Drawing.Size(350,20)
$objLabel.Text = “Bitte Computernamen eingeben:”
$objForm.Controls.Add($objLabel)
$objNameBox = New-Object System.Windows.Forms.TextBox
$objNameBox.Location = New-Object System.Drawing.Size(10,100)
$objNameBox.Size = New-Object System.Drawing.Size(350,20)
$objNameBox.Text = “Computername”
$objForm.Controls.Add($objNameBox)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,140)
$objLabel.Size = New-Object System.Drawing.Size(350,20)
$objLabel.Text = “Bitte IP-Adresse eingeben:”
$objForm.Controls.Add($objLabel)
$objIPBox = New-Object System.Windows.Forms.TextBox
$objIPBox.Location = New-Object System.Drawing.Size(10,160)
$objIPBox.Size = New-Object System.Drawing.Size(350,20)
$objIPBox.Text = “IP-Adresse”
$objForm.Controls.Add($objIPBox)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,200)
$objLabel.Size = New-Object System.Drawing.Size(350,20)
$objLabel.Text = "Wählen Sie eine Sammlung aus"
$objForm.Controls.Add($objLabel)
$objListbox = New-Object System.Windows.Forms.Listbox
$objListbox.Location = New-Object System.Drawing.Size(10,220)
$objListbox.Size = New-Object System.Drawing.Size(350,20)
$objListbox.SelectionMode = "MultiExtended"
[void] $objListbox.Items.Add("Deploy Windows 7 Pro x64")
[void] $objListbox.Items.Add("Deploy Windows 8 Ent x64")
[void] $objListbox.Items.Add("not defined")
[void] $objListbox.Items.Add("not defined")
[void] $objListbox.Items.Add("not defined")
$objListbox.Height = 70
$objForm.Controls.Add($objListbox)
[void] $objForm.ShowDialog()
If ($objForm.DialogResult -like “OK”)
{DHCPFilterAdd}
else
{“Abbruch geklickt”} |
[void] [System.Reflection.Assembly]::LoadWithPartialName(“System.Drawing”)
[void] [System.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”)
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = “Neuen PC importieren”
$objForm.Size = New-Object System.Drawing.Size(400,400)
$objForm.StartPosition = “CenterScreen”
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq “Enter”) { $objForm.DialogResult=”OK”;$objForm.Close()}
{
foreach ($objItem in $objListbox.SelectedItems)
{$x += $objItem}
$objForm.Close()
}
})
$objForm.Add_KeyDown({if ($_.KeyCode -eq “Escape”) { $objForm.DialogResult=”Cancel”;$objForm.Close()} })
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,350)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = “OK”
$OKButton.DialogResult = “OK”
$OKButton.Add_Click(
{
foreach ($objItem in $objListbox.SelectedItems)
{$x += $objItem}
$objForm.Close()
}
)
$objForm.Controls.Add($OKButton)
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(200,350)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = “Abbrechen”
$CancelButton.DialogResult = “Cancel”
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20)
$objLabel.Size = New-Object System.Drawing.Size(350,20)
$objLabel.Text = “Bitte MAC-Adresse im Format 00-11-22-33-44-55 eingeben:”
$objForm.Controls.Add($objLabel)
$objMACBox = New-Object System.Windows.Forms.TextBox
$objMACBox.Location = New-Object System.Drawing.Size(10,40)
$objMACBox.Size = New-Object System.Drawing.Size(350,20)
$objMACBox.Text = “MAC-Adresse”
$objForm.Controls.Add($objMACBox)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,80)
$objLabel.Size = New-Object System.Drawing.Size(350,20)
$objLabel.Text = “Bitte Computernamen eingeben:”
$objForm.Controls.Add($objLabel)
$objNameBox = New-Object System.Windows.Forms.TextBox
$objNameBox.Location = New-Object System.Drawing.Size(10,100)
$objNameBox.Size = New-Object System.Drawing.Size(350,20)
$objNameBox.Text = “Computername”
$objForm.Controls.Add($objNameBox)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,140)
$objLabel.Size = New-Object System.Drawing.Size(350,20)
$objLabel.Text = “Bitte IP-Adresse eingeben:”
$objForm.Controls.Add($objLabel)
$objIPBox = New-Object System.Windows.Forms.TextBox
$objIPBox.Location = New-Object System.Drawing.Size(10,160)
$objIPBox.Size = New-Object System.Drawing.Size(350,20)
$objIPBox.Text = “IP-Adresse”
$objForm.Controls.Add($objIPBox)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,200)
$objLabel.Size = New-Object System.Drawing.Size(350,20)
$objLabel.Text = "Wählen Sie eine Sammlung aus"
$objForm.Controls.Add($objLabel)
$objListbox = New-Object System.Windows.Forms.Listbox
$objListbox.Location = New-Object System.Drawing.Size(10,220)
$objListbox.Size = New-Object System.Drawing.Size(350,20)
$objListbox.SelectionMode = "MultiExtended"
[void] $objListbox.Items.Add("Deploy Windows 7 Pro x64")
[void] $objListbox.Items.Add("Deploy Windows 8 Ent x64")
[void] $objListbox.Items.Add("not defined")
[void] $objListbox.Items.Add("not defined")
[void] $objListbox.Items.Add("not defined")
$objListbox.Height = 70
$objForm.Controls.Add($objListbox)
[void] $objForm.ShowDialog()
If ($objForm.DialogResult -like “OK”)
{DHCPFilterAdd}
else
{“Abbruch geklickt”}
Dann wird ganz einfach Schritt für Schritt der Import vollzogen:
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
| #########################
# set DHCP allow filter #
#########################
Function DHCPFilterAdd {
$MAC = $objMACBox.Text -replace("[-]","")
netsh dhcp server \\dhcpserver v4 add filter allow $MAC $objNameBox.Text
DHCPReservationAdd
}
########################
# set DHCP reservation #
########################
Function DHCPReservationAdd {
$MAC2 = $objMACBox.Text -replace("[-]","")
netsh dhcp server \\dhcpserver scope 10.0.0.0 add reservedip $objIPBox.Text $MAC2 $objNameBox.Text $objNameBox.Text "BOTH"
Import-ConfigMgr
}
##############################
# import Client to SCCM #
##############################
Function Import-ConfigMgr
{
### Define variables to import the client to ConfigMgr
$ResourceName = $objNameBox.Text
$MACAddress = $objMACBox.Text
### Which collection should the client be imported to?
$CollectionName = $objListbox.Text
#Collection query
$CollectionQuery = Get-WmiObject -Namespace "Root\SMS\Site_PRI" -Class SMS_Collection -Filter "Name='$CollectionName'"
#New computer account information
$WMIConnection = ([WMIClass]"\\sccmserver\root\SMS\Site_PRI:PRI_Site")
$NewEntry = $WMIConnection.psbase.GetMethodParameters("ImportMachineEntry")
$NewEntry.MACAddress = $MACAddress
$NewEntry.NetbiosName = $ResourceName
$NewEntry.OverwriteExistingRecord = $True
$Resource = $WMIConnection.psbase.InvokeMethod("ImportMachineEntry",$NewEntry,$null)
#Create the Direct MemberShip Rule
$NewRule = ([WMIClass]"\\sccmserver\root\SMS\Site_PRI:SMS_CollectionRuleDirect").CreateInstance()
$NewRule.ResourceClassName = "SMS_R_SYSTEM"
$NewRule.ResourceID = $Resource.ResourceID
$NewRule.Rulename = $ResourceName
#Add the newly created machine to collection
$CollectionQuery.AddMemberShipRule($NewRule)
end
}
####################
# Abschlussmeldung #
####################
function end {
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup("Vorgang abgeschlossen",0,"Import erfolgreich",64)
} |
#########################
# set DHCP allow filter #
#########################
Function DHCPFilterAdd {
$MAC = $objMACBox.Text -replace("[-]","")
netsh dhcp server \\dhcpserver v4 add filter allow $MAC $objNameBox.Text
DHCPReservationAdd
}
########################
# set DHCP reservation #
########################
Function DHCPReservationAdd {
$MAC2 = $objMACBox.Text -replace("[-]","")
netsh dhcp server \\dhcpserver scope 10.0.0.0 add reservedip $objIPBox.Text $MAC2 $objNameBox.Text $objNameBox.Text "BOTH"
Import-ConfigMgr
}
##############################
# import Client to SCCM #
##############################
Function Import-ConfigMgr
{
### Define variables to import the client to ConfigMgr
$ResourceName = $objNameBox.Text
$MACAddress = $objMACBox.Text
### Which collection should the client be imported to?
$CollectionName = $objListbox.Text
#Collection query
$CollectionQuery = Get-WmiObject -Namespace "Root\SMS\Site_PRI" -Class SMS_Collection -Filter "Name='$CollectionName'"
#New computer account information
$WMIConnection = ([WMIClass]"\\sccmserver\root\SMS\Site_PRI:PRI_Site")
$NewEntry = $WMIConnection.psbase.GetMethodParameters("ImportMachineEntry")
$NewEntry.MACAddress = $MACAddress
$NewEntry.NetbiosName = $ResourceName
$NewEntry.OverwriteExistingRecord = $True
$Resource = $WMIConnection.psbase.InvokeMethod("ImportMachineEntry",$NewEntry,$null)
#Create the Direct MemberShip Rule
$NewRule = ([WMIClass]"\\sccmserver\root\SMS\Site_PRI:SMS_CollectionRuleDirect").CreateInstance()
$NewRule.ResourceClassName = "SMS_R_SYSTEM"
$NewRule.ResourceID = $Resource.ResourceID
$NewRule.Rulename = $ResourceName
#Add the newly created machine to collection
$CollectionQuery.AddMemberShipRule($NewRule)
end
}
####################
# Abschlussmeldung #
####################
function end {
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup("Vorgang abgeschlossen",0,"Import erfolgreich",64)
}
Ich werde das Skript kontinuierlich anpassen, verbessern und hier zur Verfügung stellen…
Die aktuelle Version findet sich im Download Bereich: Hier
Ähnliche Beiträge
Leave a comment