#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
	#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
; #SCRIPT# --------------------------------------------------------------------------------------------------------------------------------------------
;	Script Name		:	Install (WLAN-Drucker).au3
;	Beschreibung	:	Script 2 zum Installieren eines WLAN-Druckers.
;
;	Includes		:	<ButtonConstants.au3>, <GUIConstantsEx.au3>, <StaticConstants.au3>, <String.au3>, <WindowsConstants.au3>, <GuiIPAddress.au3>
;							<EditConstants.au3>, <_EigeneFunktionen.au3>
;	AutoIt Version	:	3.3.14.5
;	Script Autor	:	BigRox
;	Anmerkung/en	:	Mit diesem Script wird der Drucker so installiert, dass man über WLAN drucken kann, wenn der Drucker
;							an einen WLAN-Router angeschlossen ist, der das Drucken über WLAN unterstützt.
;
;									! ! ! Script nur für Windows 10 Pro 64-Bit und Windows 10 Enterprise 64-Bit ! ! !
; -----------------------------------------------------------------------------------------------------------------------------------------------------

; Dateien einbinden.
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <String.au3> ; Wird für die Funktion _StringRepeat() gebraucht.
#include <WindowsConstants.au3>
#include <GuiIPAddress.au3>
#include <EditConstants.au3>
#include <_EigeneFunktionen.au3>

; Optionen für dieses Script festlegen.
Opt("MustDeclareVars", 1)

; Variablen deklarieren.
Global $Btn_Abbrechen, $Btn_Installieren, $Btn_PfadAendern, $Btn_StandardDrucker, $Btn_StandardPort, $Btn_StandardTreiber, $GUI_Main, $GUI_Msg
Global $Inp_DruckerName, $Inp_PortName, $Inp_TreiberName, $Inp_TreiberPfad, $InstallProgrammPfad, $InstallSonstigesPfad, $IP_Adresse, $Lbl_Adresse
Global $Lbl_AktuellerPfad, $Lbl_Drucker, $Lbl_DruckerName, $Lbl_Linie_1, $Lbl_Linie_2, $Lbl_Linie_3, $Lbl_Linie_4, $Lbl_Linie_5, $Lbl_Port, $Lbl_PortName
Global $Lbl_Treiber, $Lbl_TreiberName, $NeuerPfad, $RegistrySchluesselDrucker, $RegistrySchluesselPorts, $StandardWerte[5], $Tab

; Einigen Variablen Werte zuweisen.
$InstallProgrammPfad = FileGetShortName(@HomeDrive & "\WLAN-Drucker\Programm")
$InstallSonstigesPfad = FileGetShortName(@HomeDrive & "\WLAN-Drucker\Sonstiges")

$StandardWerte[0] = "192.168.193.169" ; Standardwert für die IP-Adresse.
$StandardWerte[1] = "WLAN-Router" ; Standardwert für den Namen des TCP/IP-Ports.
$StandardWerte[2] = "HP LaserJet 1320" ; Standardwert für den Drucker Namen.
$StandardWerte[3] = "C:\WLAN-Drucker\Programm\HP LaserJet 1320 Treiber\hpc1320u.inf" ; Standard Pfad zu der .inf-Datei des Treibers.
$StandardWerte[4] = "HP LaserJet 1320 PCL 6" ; Standardwert für den Treibernamen.

$RegistrySchluesselPorts = "HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\"
$RegistrySchluesselDrucker = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices\"

; Die MsgBox anzeigen und auswerten der Frage, ob der neue Drucker als WLAN-Drucker installiert und eingerichtet werden soll.
If MsgBox(4 + 32 + 256 + 0 + 262144, _StringRepeat(" ", 19) & "! ! !  H I N W E I S  ! ! !", _
		'Wollen Sie den Drucker als WLAN-Drucker' & @CRLF & "installieren und einrichten?" & @CRLF & @CRLF & _
		"(Nein = Script abbrechen).") = 7 Then
	; Das Script beenden (abbrechen).
	Exit (-1)
EndIf

; Die GUI erstellen und formatieren.
$GUI_Main = GUICreate(_StringRepeat(" ", 28) & "WLAN-Drucker installieren.", 642, 595, -1, -1, BitXOR($GUI_SS_DEFAULT_GUI, $WS_MINIMIZEBOX)) ; BitXOR($GUI_SS_DEFAULT_GUI, $WS_MINIMIZEBOX) = die GUI hat nur einen Schließen-Button.
GUISetIcon(@SystemDir & "\shell32.dll", -60, $GUI_Main)
GUISetBkColor(0x6791C9)

; Das Tab-Control erstellen.
$Tab = GUICtrlCreateTab(20, 20, 600, 485)
GUICtrlSetFont($Tab, 12, 400, 0, "Times New Roman")


; Das erste Tab erstellen.
GUICtrlCreateTabItem("TCP/IP Drucker Port:")

; Die Hintergrundfarbe lässt sich bei einer Gruppe nicht für die ganze Gruppe ändern, das geht nur bei Verwendung eines Labels. Dabei muss man die Styles aber
; extra setzt, damit der Default-Style "$SS_NOTIFY" entfernt wird, da dieser das Label anklickbar macht und AutoIt dann nicht mehr auf anklicken des Button reagieren kann!
$Lbl_Port = GUICtrlCreateLabel("TCP/IP Drucker Port:", 35, 70, 572, 320)
GUICtrlSetStyle($Lbl_Port, BitOR($SS_CENTER, $SS_SUNKEN, $WS_BORDER), $WS_EX_CLIENTEDGE)
GUICtrlSetFont($Lbl_Port, 14, 800, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_Port, 0xFF874D) ; Orange

$Lbl_Adresse = GUICtrlCreateLabel("IP-Adresse:", 70, 133, 135, 30, BitOR($SS_CENTER, $SS_SUNKEN), $WS_EX_CLIENTEDGE)
GUICtrlSetFont($Lbl_Adresse, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_Adresse, 0xFFFF00) ; Gelb

$Lbl_Linie_1 = GUICtrlCreateLabel("--------", 205, 133, 80, 30, $SS_CENTER)
GUICtrlSetFont($Lbl_Linie_1, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_Linie_1, 0xFF874D) ; Orange

$IP_Adresse = _GUICtrlIpAddress_Create($GUI_Main, 285, 125, 280, 43, $WS_DLGFRAME)
_GUICtrlIpAddress_SetFont($IP_Adresse, "Times New Roman", 18, 800, True)
_GUICtrlIpAddress_Set($IP_Adresse, $StandardWerte[0])
_GUICtrlIpAddress_SetFocus($IP_Adresse, 2)
_GUICtrlIpAddress_ShowHide($IP_Adresse, @SW_HIDE)

$Lbl_PortName = GUICtrlCreateLabel("Port Name:", 70, 236, 135, 30, BitOR($SS_CENTER, $SS_SUNKEN), $WS_EX_CLIENTEDGE)
GUICtrlSetFont($Lbl_PortName, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_PortName, 0xFFFF00) ; Gelb

$Lbl_Linie_2 = GUICtrlCreateLabel("--------", 205, 237, 80, 30, $SS_CENTER)
GUICtrlSetFont($Lbl_Linie_2, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_Linie_2, 0xFF874D) ; Orange

$Inp_PortName = GUICtrlCreateInput("", 285, 229, 280, 43, BitOR($SS_CENTER, $WS_DLGFRAME, $ES_AUTOHSCROLL))
GUICtrlSetFont($Inp_PortName, 16, 800, 0, "Times New Roman")
GUICtrlSetData($Inp_PortName, $StandardWerte[1])

$Btn_StandardPort = GUICtrlCreateButton("Standard TCP/IP-Port.", 200, 316, 240, 34)
GUICtrlSetFont($Btn_StandardPort, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Btn_StandardPort, 0x00AA55) ; Grün


; Das zweite Tab erstellen.
GUICtrlCreateTabItem("Neuer Drucker:")
GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")

$Lbl_Drucker = GUICtrlCreateLabel("Neuer Drucker:", 35, 70, 572, 290)
GUICtrlSetStyle($Lbl_Drucker, BitOR($SS_CENTER, $SS_SUNKEN, $WS_BORDER), $WS_EX_CLIENTEDGE)
GUICtrlSetFont($Lbl_Drucker, 14, 800, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_Drucker, 0xFF874D) ; Orange

$Lbl_DruckerName = GUICtrlCreateLabel("Drucker Name:", 70, 152, 135, 30, BitOR($SS_CENTER, $SS_SUNKEN), $WS_EX_CLIENTEDGE)
GUICtrlSetFont($Lbl_DruckerName, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_DruckerName, 0xFFFF00) ; Gelb

$Lbl_Linie_3 = GUICtrlCreateLabel("-----", 205, 153, 80, 30, $SS_CENTER)
GUICtrlSetFont($Lbl_Linie_3, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_Linie_3, 0xFF874D) ; Orange

$Inp_DruckerName = GUICtrlCreateInput("", 285, 145, 280, 43, BitOR($SS_CENTER, $WS_DLGFRAME, $ES_AUTOHSCROLL))
GUICtrlSetFont($Inp_DruckerName, 16, 800, 0, "Times New Roman")
GUICtrlSetData($Inp_DruckerName, $StandardWerte[2])

$Btn_StandardDrucker = GUICtrlCreateButton("Standard Drucker.", 200, 276, 240, 34)
GUICtrlSetFont($Btn_StandardDrucker, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Btn_StandardDrucker, 0x00AA55) ; Grün


; Das dritte Tab erstellen.
GUICtrlCreateTabItem("Drucker Treiber:")
GUICtrlSetFont(-1, 12, 400, 0, "Times New Roman")

$Lbl_Treiber = GUICtrlCreateLabel("Drucker Treiber:", 35, 70, 572, 412)
GUICtrlSetStyle($Lbl_Treiber, BitOR($SS_CENTER, $SS_SUNKEN, $WS_BORDER), $WS_EX_CLIENTEDGE)
GUICtrlSetFont($Lbl_Treiber, 14, 800, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_Treiber, 0xFF874D) ; Orange

$Lbl_AktuellerPfad = GUICtrlCreateLabel("Aktueller Pfad:", 228, 123, 180, 30, BitOR($SS_CENTER, $SS_SUNKEN), $WS_EX_CLIENTEDGE)
GUICtrlSetFont($Lbl_AktuellerPfad, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_AktuellerPfad, 0xFFFF00) ; Gelb

$Lbl_Linie_4 = GUICtrlCreateLabel(":", 302, 153, 30, 18, $SS_CENTER)
GUICtrlSetFont($Lbl_Linie_4, 12, 800, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_Linie_4, 0xFF874D) ; Orange

$Inp_TreiberPfad = GUICtrlCreateInput("", 55, 175, 530, 75, BitOR($ES_CENTER, $WS_DLGFRAME, $ES_MULTILINE, $ES_AUTOHSCROLL))
GUICtrlSetFont($Inp_TreiberPfad, 16, 800, 0, "Times New Roman")
GUICtrlSetBkColor($Inp_TreiberPfad, 0xFFFFFF) ; Weiß
GUICtrlSetData($Inp_TreiberPfad, $StandardWerte[3])

$Lbl_TreiberName = GUICtrlCreateLabel("Treiber Name:", 228, 272, 180, 30, BitOR($SS_CENTER, $SS_SUNKEN), $WS_EX_CLIENTEDGE)
GUICtrlSetFont($Lbl_TreiberName, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_TreiberName, 0xFFFF00) ; Gelb

$Lbl_Linie_5 = GUICtrlCreateLabel(":", 302, 302, 30, 18, $SS_CENTER)
GUICtrlSetFont($Lbl_Linie_5, 12, 800, 0, "Times New Roman")
GUICtrlSetBkColor($Lbl_Linie_5, 0xFF874D) ; Orange

$Inp_TreiberName = GUICtrlCreateInput("", 55, 325, 530, 43, BitOR($ES_CENTER, $WS_DLGFRAME, $ES_AUTOHSCROLL))
GUICtrlSetFont($Inp_TreiberName, 16, 800, 0, "Times New Roman")
GUICtrlSetBkColor($Inp_TreiberName, 0xFFFFFF) ; Weiß
GUICtrlSetData($Inp_TreiberName, $StandardWerte[4])

$Btn_PfadAendern = GUICtrlCreateButton(".inf-Datei suchen...", 80, 408, 210, 34)
GUICtrlSetFont($Btn_PfadAendern, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Btn_PfadAendern, 0x2FF130) ; Grün

$Btn_StandardTreiber = GUICtrlCreateButton("Standard Treiber.", 350, 408, 210, 34)
GUICtrlSetFont($Btn_StandardTreiber, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Btn_StandardTreiber, 0x00AA55) ; Grün


; Das Erstellen der Tabs beenden.
GUICtrlCreateTabItem("")

$Btn_Installieren = GUICtrlCreateButton("Drucker installieren.", 60, 532, 240, 40)
GUICtrlSetFont($Btn_Installieren, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Btn_Installieren, 0x2FF130) ; Grün

$Btn_Abbrechen = GUICtrlCreateButton("Installation abbrechen.", 340, 532, 240, 40)
GUICtrlSetFont($Btn_Abbrechen, 14, 400, 0, "Times New Roman")
GUICtrlSetBkColor($Btn_Abbrechen, 0xFF0000) ; Rot

; Die GUI anzeigen.
GUISetState(@SW_SHOW, $GUI_Main)

While 1
	; Das Eingabefeld für die IP-Adresse nur im ersten Tab anzeigen (ohne diese Zeilen wird das Eingabefeld in jedem Tab angezeigt).
	If GUICtrlRead($Tab) = 0 Then
		_GUICtrlIpAddress_ShowHide($IP_Adresse, @SW_SHOW)
	Else
		_GUICtrlIpAddress_ShowHide($IP_Adresse, @SW_HIDE)
	EndIf
	; Auswerten der Aktionen innerhalb der GUI.
	$GUI_Msg = GUIGetMsg()
	Select
		Case $GUI_Msg = $GUI_EVENT_CLOSE Or $GUI_Msg = $Btn_Abbrechen ; Button "GUI-Schließen" oder Button "Installation abbrechen".
			ExitLoop

		Case $GUI_Msg = $Btn_StandardPort ; Button "Standart TCP/IP-Port".
			_GUICtrlIpAddress_Set($IP_Adresse, $StandardWerte[0])
			GUICtrlSetData($Inp_PortName, $StandardWerte[1])

		Case $GUI_Msg = $Btn_StandardDrucker ; Button "Standart Drucker".
			GUICtrlSetData($Inp_DruckerName, $StandardWerte[2])

		Case $GUI_Msg = $Btn_PfadAendern ; Button ".inf Datei suchen...".
			$NeuerPfad = FileOpenDialog("Drucker-Treiber .inf-Datei auswählen.", @WindowsDir & "\", "Setup-Informationsdateien (*.inf)|*.* (Alle Dateien)", _
					BitOR($FD_FILEMUSTEXIST, $FD_MULTISELECT), ".inf")
			If @error Then
				$NeuerPfad = $StandardWerte[3]
			EndIf
			GUICtrlSetData($Inp_TreiberPfad, $NeuerPfad)

		Case $GUI_Msg = $Btn_StandardTreiber ; Button "Standart Pfad".
			GUICtrlSetData($Inp_TreiberPfad, $StandardWerte[3])
			GUICtrlSetData($Inp_TreiberName, $StandardWerte[4])

		Case $GUI_Msg = $Btn_Installieren ; Button "Drucker installieren.".
			; Die Funktion zum installieren des Druckers aufrufen.
			DruckerInstallieren($RegistrySchluesselPorts, $RegistrySchluesselDrucker, GUICtrlRead($Inp_PortName), GUICtrlRead($Inp_DruckerName), _
					_GUICtrlIpAddress_Get($IP_Adresse), GUICtrlRead($Inp_TreiberPfad), GUICtrlRead($Inp_TreiberName))
			ExitLoop

	EndSelect
WEnd

GUIDelete($GUI_Main)

; Sleep(), zur Sicherheit.
Sleep(1000)

Exit



; #FUNKTION# ==========================================================================================================================================
; Funktion zum Installieren und einrichten des Druckers.
; =====================================================================================================================================================
Func DruckerInstallieren($RegKeyPorts, $RegKeyPrinters, $PortName, $PrinterName, $IP_Address, $DriverPath, $DriverName)

	; Die übergebenen Registry Schlüssel vervollständigen.
	$RegKeyPorts = $RegKeyPorts & $PortName
	$RegKeyPrinters = $RegKeyPrinters & $PrinterName

	; Den Druckerspooler-Dienst anhalten, damit der Port ohne Neustart des Rechners erstellt werden kann.
	RunWait(@ComSpec & " /c " & 'net stop spooler', "", @SW_HIDE)

	; Die zum erstellen des TCP/IP-Ports notwendigen Einträge in die Registry schreiben.
	RegWrite($RegKeyPorts, "Protocol", "REG_DWORD", 1)
	RegWrite($RegKeyPorts, "Version", "REG_DWORD", 2)
	RegWrite($RegKeyPorts, "HostName", "REG_SZ", $IP_Address)
	RegWrite($RegKeyPorts, "IPAddress", "REG_SZ", "")
	RegWrite($RegKeyPorts, "HWAddress", "REG_SZ", "")
	RegWrite($RegKeyPorts, "PortNumber", "REG_DWORD", 9100)
	RegWrite($RegKeyPorts, "SNMP Community", "REG_SZ", "public")
	RegWrite($RegKeyPorts, "SNMP Enabled", "REG_DWORD", 0)
	RegWrite($RegKeyPorts, "SNMP Index", "REG_DWORD", 1)
	RegWrite($RegKeyPorts, "PortMonMibPortIndex", "REG_DWORD", 0)

	; Den Druckerspooler-Dienst wieder starten, damit der Port ohne Neustart des Rechners sofort verwendet werden kann.
	RunWait(@ComSpec & " /c " & 'net start spooler', "", @SW_HIDE)

	; Den Drucker mit Hilfe eines rundll32.exe-Befehls installieren
	RunWait('rundll32.exe printui.dll,PrintUIEntry /if /b "' & $PrinterName & '" /f "' & $DriverPath & '" /r "' & $PortName & '" /m "' & $DriverName & '" /z')

	; Den Drucker mit Hilfe eines rundll32.exe-Befehls als Standarddrucker einrichten:
	RunWait('rundll32 printui.dll,PrintUIEntry /y /n "' & $PrinterName & '"')
EndIf

EndFunc ; DruckerInstallieren()


; Aufrufen der Hilfe zu den rundll32.exe printui.dll,PrintUIEntry-Befehlen, mit: "rundll32.exe printui.dll,PrintUIEntry"

; In: "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices" stehen alle installierten Drucker drin.
; In: "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports" stehen die eingerichteten Ports für die Drucker.
