AutoIt:netdomJoin
Aus znilwiki
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...