Aktionen

AutoIt:netdomJoin

Aus znilwiki

Die druckbare Version wird nicht mehr unterstützt und kann Darstellungsfehler aufweisen. Bitte aktualisiere deine Browser-Lesezeichen und verwende stattdessen die Standard-Druckfunktion des Browsers.


Ersatz für das Microsoft Tool netdom /join welches sich unter Windows Vista / 7 nicht mehr so einfach kopieren lässt /aus Freigabe ausführen lässt.
Download der fertigen EXE: netdomJoin.exe

Quellcode:

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=znil.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Comment=2011/2012 Bernhard Linz
#AutoIt3Wrapper_Res_Description=http://znil.net
#AutoIt3Wrapper_Res_Fileversion=1.0.0.45
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=Freeware
#AutoIt3Wrapper_Res_SaveSource=y
#AutoIt3Wrapper_Res_Language=1031
#AutoIt3Wrapper_AU3Check_Stop_OnWarning=Y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

; #INDEX# =======================================================================================================================
; Title .........: netdomJoin
; AutoIt Version : 3.6.6.1
; Language ......: Deutsch
; Description ...: Nachbau des "Netdom join" Befehls von Windows XP / 2003 für Windows XP bis 2008R2
;				   Hintergrund ist das der Befehl unter Windows Vista / 7 / 2008 / 2008R2 nur durch Nachinstallation vorhanden ist
;				   und sich nicht einfach auf einen anderen Rechner kopieren lässt.
;				   Nutzt WMI Funktion, wurde erweitert um das schreiben einer LOG Datei und das Einlesen einer Text Datei mit den
;				   Computernamen die umziehen sollen
; Author(s) .....: Bernhard Linz im November 2011
;				   Bernhard@znil.net / http://znil.net
; ===============================================================================================================================


;Änderungslog:
;-------------
;02.11.2011 - 21:07		_ANSI2OEM Konvertierung bei _LOGMeldung_schreiben entfernt - sonst sehen Umlaut im Logfile falsch aus,
;						Logfile wird normalerweise unter Windows geöffnet, nicht in der DOS-Box


; ###################################################################################
; V A R I A B L E N    D E K L A R I E R E N
; ###################################################################################


;Konstanten für JoinDomainOrWorkgroup Methode
Global Const $cJOIN_DOMAIN 				= 1 			;(0x1) Default. Joins a computer to a domain. If this value is not specified, the join is a computer to a workgroup.
Global Const $cCREATE_ACCOUNT 			= 2 			;(0x2) Creates an account on a domain.
Global Const $cDELETE_ACCOUNT 			= 4				;(0x4) Deletes an account when a domain exists.
Global Const $cJOIN_UPGRADE 			= 16 			;(0x10) The join operation is part of an upgrade from Windows 98 or Windows 95 to Windows 2000 or Windows NT.
Global Const $cJOIN_ACCOUNT_REGARDLESS 	= 32 			;(0x20) Allows a join to a new domain, even if the computer is already joined to a domain.
Global Const $cUNSECURED_JOIN			= 64 			;(0x40) Performs an unsecured join.
Global Const $cMACHINE_PASSWORD			= 128			;(0x80) The machine, not the user, password passed. This option is only valid for unsecure joins.
Global Const $cDEFER_WRITING			= 256			;(0x100) Writing SPN and DnsHostName attributes on the computer object should be deferred until the rename that follows the join.
Global Const $cINVOKE_API				= 262144		;(0x40000) The APIs were invoked during install.

;Variablen
Global $sComputername
Global $sDomain
Global $sOU = ""
Global $bDomainlogin = False
Global $sUserD, $sPasswordD
Global $bComputerlogin = False
Global $sUserO, $sPasswordO
Global $bReboot = False
Global $iReboottime = 30
Global $bLogging = False
Global $sLoggingFile
Global $hLoggingFile
Global $oComputer, $iJoinDomainResultNumber, $sJoinDomainResultText
Global $g_eventerror = 0 ; Dies ist notwendig, damit Com-Fehler entdeckt werden können. Dies muss später wieder zurückgesetzt werden.
Global $oMyError
Global $sCOM_Fehlermeldung
Global $sTEMP
Global $oWMIService, $objItems, $objItem


;                          10        20        30        40        50        60        70        80
;                 12345678901234567890123456789012345678901234567890123456789012345678901234567890
Global $sHeader = "+------------------------------------------------------------------------------" & @CRLF & _
		"| netdomJoin.exe - Version " & FileGetVersion(@ScriptName) & @CRLF & _
		"+------------------------------------------------------------------------------" & @CRLF & _
		"| 2011/2012 von Bernhard Linz, http://znil.net" & @CRLF & _
		"| Firma:  Bernhard.Linz@datagroup.de" & @CRLF & _
		"| Privat; Bernhard@znil.de" & @CRLF & _
		"+------------------------------------------------------------------------------" & @CRLF & _
		@CRLF

;                             10        20        30        40        50        60        70        80
;                 	 12345678901234567890123456789012345678901234567890123456789012345678901234567890
Global $sHilfeText = "netdomJOIN.exe fügt den aktuellen Computer einer Domäne hinzu. Auch ein" & @CRLF & _
		"Domänenwechsel ist möglich (aus einer Domäne direkt in eine andere." & @CRLF & _
		"Es ist auch möglich, Remote einen Computer im Netzwerk in die Domäne auf zu" & @CRLF & _
		"nehmen." & @CRLF & _
		"Das Programm ist kompatibel zu Windows XP / 2003 / Vista / 7 / 2008 / 2008R2" & @CRLF & _
		"-------------------------------------------------------------------------------" & @CRLF & _
		@CRLF & _
		"netdomJOIN.exe Computer /Domain:Domäne [/OU:OU-Pfad] [/UserD:BenutzerDomäne]" & @CRLF & _
		"              [/PasswordD:PasswortDomäne] [/UserO:BenutzerComputer]" & @CRLF & _
		"              [/PasswordO:PasswortComputer] [/REBoot[:Sekunden]" & @CRLF & _
		"              [/LOG:Pfad_zur_Logdatei]" & @CRLF & _
		@CRLF & _
		" Computer     Name des Computers der in die Zieldomäne aufgenommen werden soll" & @CRLF & _
		"              DNS oder NetBIOS Name, LOCALHOST ist ebenfalls erlaubt" & @CRLF & _
		@CRLF & _
		" /Domain:     Name der Zieldomäne, folgende Schreibweisen sind möglich: " & @CRLF & _
		"              DOMAIN -> NetBIOS Name der Domäne" & @CRLF & _
		"              domain.suffix -> DNS-Name der Domäne, empfohlen!" & @CRLF & _
		"              domain.suffic\DC.domain.suffix  -> bestimmten Domänencontroller" & @CRLF & _
		"                                                 verwenden" & @CRLF & _
		@CRLF & _
		" /OU:         Optional: die OU in der das Computerkonto erstellt werden soll," & @CRLF & _
		"              Beispiel: OU=Test,DC=domain,DC=suffix" & @CRLF & _
		@CRLF & _
		" /UserD:      Optional: Benutzername für die Verbindung zur neuen Domäne, z.B." & @CRLF & _
		"              DOMAIN\Administrator oder Administrator@domain.suffix" & @CRLF & _
		@CRLF & _
		" /PasswordD:  Optional: Passwort des Benutzers für Domänenverbindung" & @CRLF & _
		@CRLF & _
		" /UserO:      Optional: Benutzername für die Verbindung zum Computer" & @CRLF & _
		@CRLF & _
		" /PasswordO:  Optional: Passwort des Benutzers für Computerverbindung" & @CRLF & _
		@CRLF & _
		" /REBoot      Optional: Computer nach erfolgreichen hinzufügen neu starten, z.B." & @CRLF & _
		"              /REBoot    -> nach 30 Sekunden neu starten" & @CRLF & _
		"              /REBoot:77 -> nach 77 Sekunden neu starten" & @CRLF & _
		@CRLF & _
		" /LOG:        Optional: Pfad zu einer Logdatei. Die Logeinträge werden angehängt." & @CRLF & _
		"              /LOG:D:\Logdateien\netdom.txt" & @CRLF & _
		"              /LOG:\\SERVER\LOGS\migration.log" & @CRLF & _
		@CRLF & _
		"-------------------------------------------------------------------------------" & @CRLF & _
		"netdomJOIN.exe gibt folgende Fehlercodes zurück die sich in Batchdateien über" & @CRLF & _
		"die Umgebungsvariable %ERRORLEVEL% abfragen lassen:" & @CRLF & _
		" 0 : Der Befehl wurde erfolgreich ausgeführt" & @CRLF & _
		" 1 : Es ist ein Fehler aufgetreten" & @CRLF & _
		@CRLF



; ###################################################################################
; F U N C T I O N E N / S U B R O U T I N E N
; ###################################################################################


; ###################################################################################
; _ANSI2OEM löst das Problem mit dem Umlauten und anderen Sonderzeichen. Es wandelt Text so um das er korrekt in der DOS-Box dargestellt wird
; So können hier im Quellcode auch Umlaute verwendet werden (in den Textausgaben) und diese werden dann korrekt dargestellt
; Dank an Xenobiologist von AutoIt.de für diese Lösung: http://www.autoit.de/index.php?page=Thread&threadID=9461&highlight=ANSI2OEM
; #FUNCTION# ======================================================================================
; Name ..........: _ANSI2OEM($stext)
; Description ...: Wandelt Text mit Sonderzeichen so um das er in der DOS-Box richtig erscheint,
;                  z.B. Umlaute etc.
; Syntax ........: _ANSI2OEM($stext)
; Parameters ....:
; Return values .: Der Text im OEM Format
; Author ........: Xenobiologist
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: http://www.autoit.de/index.php?page=Thread&threadID=9461&highlight=ANSI2OEM
; Example .......:
; =================================================================================================
Func _ANSI2OEM($stext)
	$stext = DllCall('user32.dll', 'Int', 'CharToOem', 'str', $stext, 'str', '')
	Return $stext[2]
EndFunc   ;==>_ANSI2OEM

; #FUNCTION# ======================================================================================
; Name ..........: _HilfeAusgeben()
; Description ...: Gibt den Hilfetext aus
; Syntax ........: _HilfeAusgeben()
; Parameters ....:
; Return values .:
; Author ........: Bernhard Linz / Bernhard@znil.net
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: http://znil.net
; Example .......:
; =================================================================================================
Func _HilfeAusgeben()
	ConsoleWrite(_ANSI2OEM($sHeader))
	ConsoleWrite(_ANSI2OEM($sHilfeText))
EndFunc   ;==>_HilfeAusgeben

; #FUNCTION# ======================================================================================
; Name ..........: _MeldungAusgebenConsole
; Description ...: Schreibt eine Zeile in die Console - inklusive Umwandlung mit _ANSI2OEM und @CRLF
; Syntax ........: _MeldungAusgebenConsole($sMeldungstext)
; Parameters ....: $sMeldungstext	- Der Text ausgegeben werden soll
; Return values .:
; Author ........: Bernhard Linz / Bernhard@znil.net
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: http://znil.net
; Example .......:
; =================================================================================================
Func _MeldungAusgebenConsole($sMeldungstext)
	ConsoleWrite(_ANSI2OEM($sMeldungstext) & @CRLF)
EndFunc   ;==>_MeldungAusgebenConsole

; #FUNCTION# ======================================================================================
; Name ..........: _LOGMeldung_schreiben()
; Description ...: Schreibt eine Zeile in die LOG-Datei (wenn $bLogging = True)
;				   Vor die Zeile wird das Datum und die Uhrzeit eingefügt im Stil von
;				   2011-11-02 21:05:33 :::: TextTextTextTextTextTextTextTextTextTextTextTextTextText
; Syntax ........: _LOGMeldung_schreiben($sLogMeldung)
; Parameters ....: $sLogMeldung 	- Der Text der nach Datum+Uhrzeit erscheinen soll
; Return values .:
; Author ........: Bernhard Linz / Bernhard@znil.net
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: http://znil.net
; Example .......:
; =================================================================================================
Func _LOGMeldung_schreiben($sLogMeldung)
	If $bLogging = True Then
		FileWriteLine($sLoggingFile,@YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " ::netdomJoin:: " & $sLogMeldung)
		;_MeldungAusgebenConsole(_ANSI2OEM(@YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " :::: " & $sLogMeldung) & " Datei:" & $sLoggingFile)
	EndIf
EndFunc   ;==>_MeldungAusgebenConsole

; #FUNCTION# ======================================================================================
; Name ..........: _FehlerAusgeben()
; Description ...: Gibt eine auffällige Fehlermeldung aus mit Überschrift und Fehlertext
; Syntax ........: _FehlerAusgeben($sFehlerUeberschrift, $sFehlertext)
; Parameters ....: $sFehlerUeberschrift	-	Die Überschrift zum Fehlertext
;				   $sFehlertext			-	Die eigentliche Fehlermeldung
; Return values .:
; Author ........: Bernhard Linz / Bernhard@znil.net
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: http://znil.net
; Example .......:
; =================================================================================================
Func _FehlerAusgeben($sFehlerUeberschrift, $sFehlertext)
	ConsoleWrite("+----------------------------------------------------------------------------" & @CRLF)
	ConsoleWrite("| " & _ANSI2OEM($sFehlerUeberschrift) & @CRLF)
	ConsoleWrite("+------------------------------------------------------------------------------" & @CRLF)
	ConsoleWrite("| " & _ANSI2OEM($sFehlertext) & @CRLF)
	ConsoleWrite("+------------------------------------------------------------------------------" & @CRLF)
EndFunc   ;==>_FehlerAusgeben


; #FUNCTION# ======================================================================================
; Name ..........: MyErrFunc()
; Description ...: Fängt AutIt Skriptfehler wie z.B. bei Zugriff auf nicht vorhandene COM Objekte ab
; Syntax ........: MyErrFunc()
; Parameters ....:
; Return values .: Meldungstext des Fehlers wie er von Windows übergeben wird
; Author ........: diverse
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: http://www.autoit.de
; Example .......:
; =================================================================================================
; COM Fehler abfangen (bei Zugriff auf WMI Schnittstelle)
Func MyErrFunc()
	Local $err = $oMyError.number
	If $err = 0 Then $err = -1
	$g_eventerror = $err ; Zum Abfragen, nachdem die Funktion beendet ist
	$sCOM_Fehlermeldung = $oMyError.windescription
	_FehlerAusgeben("WMI/COM-Fehler aufgetreten!",$sCOM_Fehlermeldung)
	_LOGMeldung_schreiben("FEHLER - WMI/COM Fehler aufgetreten, breche ab: " & $CmdLineRaw)
	Exit 1
EndFunc   ;==>MyErrFunc


; ######################################################################################################################################################################
; ######################################################################################################################################################################
; ######################################################################################################################################################################
; H A U P T P R O G R A M M
; ######################################################################################################################################################################
; ######################################################################################################################################################################
; ######################################################################################################################################################################


$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc") ; COM-Fehlerbehandlung initialisieren

; ###################################################################################
; H I L F E
; ###################################################################################

;testen ob wir überhaupt mit einem Parameter gestartet wurden - sonst Hilfe ausgeben
If $CmdLine[0] = 0 Then
	_HilfeAusgeben()
	Exit
EndIf
;testen ob der Parameter 1 ist auf "/?" testen und ebenfalls Hilfe ausgeben
If $CmdLine[1] = "/?" Then
	_HilfeAusgeben()
	Exit
EndIf


; ###################################################################################
; / L O G :
; ###################################################################################
If StringInStr($CmdLineRaw, "/LOG:") > 0 Then
	;_MeldungAusgebenConsole("/log gefunden")
	For $i = 1 To $CmdLine[0] Step 1
		If StringLeft($CmdLine[$i],5) = "/LOG:" Then
			$sLoggingFile = StringMid($CmdLine[$i],6)
			$hLoggingFile = FileOpen($sLoggingFile,1)
			If $hLoggingFile = (-1) Then
				_FehlerAusgeben("Fehler Paramter /LOG:","Die Logdatei konnte nicht geöffnet / erstellt werden." & @CRLF & "| Dateipfad: " & $sLoggingFile)
				Exit 1
			Else
				FileClose($hLoggingFile)
				$bLogging = True
				;_MeldungAusgebenConsole("schreibe testmeldung")
				;_LOGMeldung_schreiben("Test")
			EndIf
		EndIf
	Next
Else
	$bLogging = False
EndIf


; ###################################################################################
; C O M P U T E R
; ###################################################################################

If $CmdLine[1] = "localhost" Then
	$sComputername = @ComputerName
ElseIf StringLeft($CmdLine[1],1) = "/" Then ;an erster Stelle steht ein Parameter - damit können wir nicht um
	_FehlerAusgeben("Fehlender Parameter", "Es wurde kein Computername angegeben")
	_LOGMeldung_schreiben("FEHLER - Es wurde kein Computername angegeben, breche ab: " & $CmdLineRaw)
	Exit 1
Else
	If Ping($CmdLine[1],5000) > 0 Then
		$sComputername = $CmdLine[1]
		_LOGMeldung_schreiben("STATUS - Vorgang gestartet für den Computer -=> " & $sComputername & " <=-")
	Else
		_FehlerAusgeben("Ping fehlgeschlagen!","Der Name kann nicht im Netzwerk erreicht werden:" & @CRLF & "| " & $CmdLine[1])
		_LOGMeldung_schreiben("FEHLER - Computer -=> " & $CmdLine[1] & " <=- kann nicht angepingt werden, breche ab: " & $CmdLineRaw)
		Exit 1
	EndIf
EndIf


; ###################################################################################
; / D O M A I N :
; ###################################################################################

If StringInStr($CmdLineRaw, "/domain:") > 0 Then
	For $i = 1 To $CmdLine[0] Step 1
		If StringLeft($CmdLine[$i],8) = "/domain:" Then
			$sDomain = StringMid($CmdLine[$i],9)
			;_MeldungAusgebenConsole("sDomain=" & $sDomain & @CRLF & "StringMid($CmdLine[" & $i & "],9)=" & StringMid($CmdLine[$i],9) & @CRLF & "$CmdLine[" & $i & "]:" & $CmdLine[$i])
		EndIf
	Next
Else
	_FehlerAusgeben("Fehler bei Parametern","Es wurde kein '/domain:' angegeben")
	_LOGMeldung_schreiben("FEHLER - Parameter /domain: fehlt, breche ab: " & $CmdLineRaw)
	Exit 1
EndIf
If $sDomain = "" Then
	_FehlerAusgeben("Fehler bei Parametern","Es wurde nichts hinter '/domain:' angegeben")
	_LOGMeldung_schreiben("FEHLER - Parameter /domain: Kein Domänenname hinter dem Parameter " & $CmdLineRaw)
	Exit 1
EndIf

; ###################################################################################
; / O U :
; ###################################################################################

If StringInStr($CmdLineRaw, "/OU:") > 0 Then
	For $i = 1 To $CmdLine[0] Step 1
		If StringLeft($CmdLine[$i],4) = "/OU:" Then
			$sOU = StringMid($CmdLine[$i],5)
		EndIf
	Next
	If StringInStr($sOU,"DC=") = 0 Then
		_FehlerAusgeben("Fehler bei '/OU:' gefunden!","Die OU Angabe enthält keinen 'DC=' Eintrag:" & @CRLF & "| " & $sOU)
		_LOGMeldung_schreiben("FEHLER - Parameter /OU: enthält keinen 'DC=' Eintrag, breche ab: /OU:" & $sOU)
		Exit 1
	EndIf
	If StringInStr($sOU,"OU=") = 0 Then
		_FehlerAusgeben("Fehler bei '/OU:' gefunden!","Die OU Angabe enthält keinen 'OU=' Eintrag:" & @CRLF & "| " & $sOU)
		_LOGMeldung_schreiben("FEHLER - Parameter /OU: enthält keinen 'OU=' Eintrag, breche ab: /OU:" & $sOU)
		Exit 1
	EndIf
Else
	$sOU = ""
EndIf

; ###################################################################################
; / U S E R D :   -   / P A S S W O R D D : (Domainlogin)
; ###################################################################################

If StringInStr($CmdLineRaw, "/UserD:") > 0 Then
	For $i = 1 To $CmdLine[0] Step 1
		If StringLeft($CmdLine[$i],7) = "/UserD:" Then
			$sUserD = StringMid($CmdLine[$i],8)
		EndIf
	Next
	If StringInStr($CmdLineRaw, "/PasswordD:") > 0 Then
		For $i = 1 To $CmdLine[0] Step 1
			If StringLeft($CmdLine[$i],11) = "/PasswordD:" Then
				$sPasswordD = StringMid($CmdLine[$i],12)
			EndIf
		Next
		$bDomainlogin = True
	Else
		_FehlerAusgeben("Fehler bei /UserD: - Parameter fehlt!","Es wurde ein Benutzer, aber kein Passwort angegeben." & @CRLF & "| UserD: " & $sUserD)
		_LOGMeldung_schreiben("FEHLER - Parameter /UserD: Es wurde ein Benutzer aber kein Passwort (Parameter /PasswordD:) angegeben, breche ab:" & $CmdLineRaw)
		Exit 1
	EndIf
Else
	$bDomainlogin = False
	$sUserD = ""
	$sPasswordD = ""
EndIf

; ###################################################################################
; / U S E R O :   -   / P A S S W O R D O : (Computerlogin)
; ###################################################################################

If StringInStr($CmdLineRaw, "/UserO:") > 0 Then
	For $i = 1 To $CmdLine[0] Step 1
		If StringLeft($CmdLine[$i],7) = "/UserO:" Then
			$sUserO = StringMid($CmdLine[$i],8)
		EndIf
	Next
	If StringInStr($CmdLineRaw, "/PasswordO:") > 0 Then
		For $i = 1 To $CmdLine[0] Step 1
			If StringLeft($CmdLine[$i],11) = "/PasswordO:" Then
				$sPasswordO = StringMid($CmdLine[$i],12)
			EndIf
		Next
		$bComputerlogin = True
	Else
		_FehlerAusgeben("Fehler bei /UserO: - Parameter fehlt!","Es wurde ein Benutzer, aber kein Passwort angegeben." & @CRLF & "| UserO: " & $sUserO)
		_LOGMeldung_schreiben("FEHLER - Parameter /UserO: Es wurde ein Benutzer aber kein Passwort (Parameter /PasswordO:) angegeben, breche ab: " & $CmdLineRaw)
		Exit 1
	EndIf
Else
	$bComputerlogin = False
EndIf


; ###################################################################################
; / R E B O O T
; ###################################################################################

If StringInStr($CmdLineRaw, "/REBoot") > 0 Then
	If StringInStr($CmdLineRaw, "/REBoot:") > 0 Then
		For $i = 1 To $CmdLine[0] Step 1
			If StringLeft($CmdLine[$i],8) = "/REBoot:" Then
				$iReboottime = Int(StringMid($CmdLine[$i],9))
				If $iReboottime > 0 Then
					$bReboot = True
				Else
					_FehlerAusgeben("Fehler bei /REBoot:","Die Zeit hinter /REBoot: wurde nicht erkannt oder ist 0")
					_LOGMeldung_schreiben("FEHLER - Parameter /REBoot: Die Zeit hinter /REBoot: wurde nicht erkannt oder ist 0: " & $CmdLineRaw)
					Exit 1
				EndIf
			EndIf
		Next
	Else
		$iReboottime = 30
		$bReboot = True
	EndIf
EndIf

; ###################################################################################
; D O M Ä N E N B E I T R I T T
; ###################################################################################
; wenn wir bis hierher gekommen sind haben wir alles um der Domäne beizutreten!

;~ _MeldungAusgebenConsole("Bereit für Domänenwechsel!")
;~ _MeldungAusgebenConsole("Computername: " & $sComputername)
;~ _MeldungAusgebenConsole("Zieldomäne  : " & $sDomain)
;~ _MeldungAusgebenConsole("Ziel OU     : " & $sOU)
;~ _MeldungAusgebenConsole("UserD       : " & $sUserD)
;~ _MeldungAusgebenConsole("PasswordD   : " & $sPasswordD)
;~ _MeldungAusgebenConsole("UserO       : " & $sUserO)
;~ _MeldungAusgebenConsole("PasswordO   : " & $sPasswordO)
;~ _MeldungAusgebenConsole("Reboot?     : " & $bReboot)
;~ _MeldungAusgebenConsole("Reboottime  : " & $iReboottime)


_LOGMeldung_schreiben("STATUS - Beginne mit der Aufnahme von -=> " & $sComputername & " <=- in die Domäne -=> " & $sDomain & " <=-")

If $bComputerlogin = True Then
	$objSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")
	If IsObj($objSWbemLocator) = 0 Then
		_FehlerAusgeben("WMI/COM-Fehler aufgetreten!","Keine Verbindung zum lokalen WbemScripting.SWbemLocator")
		_LOGMeldung_schreiben("FEHLER - Keine Verbindung zum lokalen WbemScripting.SWbemLocator, breche ab" & $CmdLineRaw)
		Exit 1
	EndIf
	$objSWbemLocator.Security_.AuthenticationLevel = 6
	$oWMIService = $objSWbemLocator.ConnectServer ($sComputername, "root\CIMV2", $sUserO, $sPasswordO, "", "", 128)
	$objItems = $oWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem")
	If IsObj($objItems) then
		For $objItem In $objItems
			$oComputer = $objItem
		Next
	EndIf
Else
	$oComputer = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\\" & $sComputername & "\root\cimv2:Win32_ComputerSystem.Name='" & $sComputername & "'")
EndIf
If IsObj($oComputer) = 0 Then
	_FehlerAusgeben("WMI/COM-Fehler aufgetreten!","Konnte nicht mit WMI am (Remote)Computer verbinden")
	_LOGMeldung_schreiben("FEHLER - Konnte nicht mit WMI am (Remote)Computer verbinden, breche ab")
	Exit 1
EndIf
; die 35 ist $cJOIN_DOMAIN + $cCREATE_ACCOUNT + $cJOIN_ACCOUNT_REGARDLESS
_MeldungAusgebenConsole("Nehme " & $sComputername & " in die Domäne " & $sDomain & " auf ....")
_LOGMeldung_schreiben("STATUS - Verbindung zu WMI Schnittstelle von -=> " & $sComputername & " <=- hergestellt, starte den Beitritt zur Domäne")
$iJoinDomainResultNumber = $oComputer.JoinDomainOrWorkGroup($sDomain, $sPasswordD, $sUserD, $sOU, 35)
$sJoinDomainResultText = ""
Switch $iJoinDomainResultNumber
	Case 0
		;$sJoinDomainResultText = "The domain join completed successfully."
		$sJoinDomainResultText = "ERFOLG - Beitritt von -=> " & $sComputername & " <=- zur Domäne -=> " & $sDomain & " <=- erfolgreich abgeschlossen"
	Case 5
		;$sJoinDomainResultText = "The " & $sUserD & " account does not have permissions. " & _
		;						 "Most likely this computer was originally joined to the domain with " & _
		;						 "a Account operator account. The account you are using does not have " & _
		;						 "permissions to overwrite the workstation object"
		$sJoinDomainResultText = "FEHLER - Der Benutzer -=> " & $sUserD & " <=- hat nicht genügend Berechtigungen für die Aufnahme des Computers in die Domäne."
	Case 86
		;$sJoinDomainResultText = "The username or password you specified is incorrect. " & _
		;						 "Check the username and password as they appear below. " & _
		;						 "If these values are incorrect the image will have to be updated with the current values"
		$sJoinDomainResultText = "FEHLER - Der Benutzername oder das Passwort stimmen nicht (Benutzer -=> " & $sUserD & " <=-)"
	Case 87
		;$sJoinDomainResultText = "The parameter is incorrect"
		$sJoinDomainResultText = "FEHLER - JoinDomainOrWorkGroup wurde mit falschen Parametern aufgerufen. Prüfen Sie Ihre Angaben"
	Case 110
		;$sJoinDomainResultText = "The system cannot open the specified object"
		$sJoinDomainResultText = "FEHLER - Das System konnte nicht auf die JoinDomainOrWorkGroup Funktion zugreifen"
	Case 1323
		;$sJoinDomainResultText = "Unable to update the password"
		$sJoinDomainResultText = "FEHLER - Konnte Passwort für Computerkonto nicht setzen"
	Case 1326
		;$sJoinDomainResultText = "Logon failure: unknown username or bad password"
		$sJoinDomainResultText = "FEHLER - Anmeldung gescheitert: Unbekannter Benutzername oder Kennwort"
	Case 1355
		;$sJoinDomainResultText = "The specified domain either does not exist or could not be contacted"
		$sJoinDomainResultText = "FEHLER - Die angegebene Domäne existiert nicht oder kann nicht erreicht werden."
	Case 1722
		;$sJoinDomainResultText = "The RPC server is unavailable"
		$sJoinDomainResultText = "FEHLER - Der RPC Serverdienst konnte nicht erreicht werden"
	Case 1909
		;$sJoinDomainResultText = "The " & $sUserD & " account is locked out. " & _
		;						 "Most likely someone has tried the password incorrectly too many times. " & _
		;						 "The system sometimes will lock the account out if too many simultaneous connection attempts are occuring."
		$sJoinDomainResultText = "FEHLER - Das Benutzerkonto -=> " & $sUserD & " <=- ist gesperrt in der Zieldomäne."
	Case 2224
		;$sJoinDomainResultText = "The computer account already exists on the domain and could not be overwritten. " & _
		;						 "A workstation object with the same name exists in another OU. " & _
		;						 "You will have to have the existing workstation object deleted."
		$sJoinDomainResultText = "FEHLER - Es gibt in der Zieldomäne bereits ein Computerkonto mit dem NetBIOS-Namen des Rechners, eventuell in einer anderen OU. Die müssen dieses Konto zuerst löschen."
	Case 2453
		;$sJoinDomainResultText = "Could not find a domain controller. " & _
		;						 "Please make sure all domain controllers are online and that your network access is functional."
		$sJoinDomainResultText = "FEHLER - Konnte mich mit keinen Domänenkontroller verbinden. Prüfen Sie die Netzwerkverbindungen."
	Case 2102
		;$sJoinDomainResultText = "The workstation service is not started. Please start this service and try again."
		$sJoinDomainResultText = "FEHLER - Der Arbeitstationsdienst ist nicht gestartet - bitte starten und noch einmal versuchen"
	Case 2691
		;$sJoinDomainResultText = "This machine is already joined to a domain. " & _
		;						 "If you wish to join this system to another domain or this domain " & _
		;						 "again you will first have to unjoin your existing domain."
		$sJoinDomainResultText = "FEHLER - Dieser Computer ist bereits Mitglied einer Domäne."
	Case 2692
		;$sJoinDomainResultText = "The machine is not currently joined to a domain."
		$sJoinDomainResultText = "FEHLER - Dieser Computer ist nicht Mitglied einer Domäne."
	Case Else
		$sJoinDomainResultText = "FEHLER - Unbekannter Rückgabewert: " & $iJoinDomainResultNumber
EndSwitch

_MeldungAusgebenConsole("Abgeschlossen mit folgendem Ergebnis:" & @CRLF & "Ergebnis: " & $sJoinDomainResultText)
_LOGMeldung_schreiben($sJoinDomainResultText)

If $iJoinDomainResultNumber = 0 Then
	If $bReboot = True Then
		_MeldungAusgebenConsole("Leite Neustart des Rechners nach " & $iReboottime & " Sekunden ein ...")
		_LOGMeldung_schreiben("STATUS - Computer -=> " & $sComputername & " <=- wird nach " & $iReboottime & " Sekunden neu gestartet.")
		If $bComputerlogin = True Then
			$sTEMP = DriveMapAdd("","\\" & $sComputername & "\ADMIN$", 0, $sUserD, $sPasswordD)
			If @error > 0 Then
				_MeldungAusgebenConsole("Anmeldung am Zielrechner -=> " & $sComputername & " <=- für Neustart gescheitert.")
				_LOGMeldung_schreiben("FEHLER - Anmeldung am Zielrechner -=> " & $sComputername & " <=- für Neustart gescheitert.")
				Exit 2
			EndIf
		EndIf
		$sTEMP = RunWait(@ComSpec & " /c " & "shutdown.exe /r /m \\" & $sComputername & ' /t ' & $iReboottime & ' /c "Reboot nach Aufnahme in die Domäne ' & $sDomain & '" /f',"",@SW_HIDE)
		If $sTEMP > 0 Then
			_MeldungAusgebenConsole("shutdown.exe meldet Fehler bei Neustart von -=> " & $sComputername & " <=-")
			_LOGMeldung_schreiben("FEHLER - shutdown.exe meldet Fehler bei Neustart von -=> " & $sComputername & " <=-")
			Exit 2
		Else
			_MeldungAusgebenConsole("Neustart von -=> " & $sComputername & " <=- erfolgreich eingeleitet.")
			_LOGMeldung_schreiben("ERFOLG - Neustart von -=>" & $sComputername & " <=- eingeleitet.")
		EndIf
		;DriveMapDel($sTEMP)
		Exit 0
	EndIf
Else
	Exit 1
EndIf



--Bernhard Linz (Diskussion) 10:24, 15. Jun. 2012 (CEST)


Loading comments...