Skip to content

opsi.orgheader image

opsi.org
Views
WinstScripts >>

domchange

Document Actions
last edited 1 year ago by doertel
This useses the 'setup with logged in user' technology.
Therefor it consist of two parts.

The Script was written for opsi 1.x/2.x 
so some things may be outdatetet (e.g. Winst Path).

In the core it uses a netdom.exe to do the work 
which do the job under XP. 
Under win2k it have to be done by e.g. autoit.

Part 1:

domchange.ins
#######################################################################
; Copyright (c) uib umwelt informatik büro gmbh (www.uib.de)
; This sourcecode is owned by uib
; and published under the Terms of the General Public License.
; (edited 20.03.2006 by P.Ohler) 

[Initial]
LogLevel=2
ExitOnError=false
ScriptErrorMessages=on
TraceMode=off


[Aktionen]
DefVar $NewHost$
DefVar $configurl$
DefVar $depoturl$
DefVar $utilsurl$
DefVar $WinsServer$
DefVar $InterfaceName$
set $NewHost$ = ""
set $WinsServer$ = ""

;-------------------------------
; hier die Daten eintragen
;-------------------------------

; hier bitte den Namen des neuen Host-Rechners angeben, an dem sich der pcpatch anmelden soll
; ist die Variable leer, wird er nicht geändert (nur für den Fall, dass zwei Domänen bereitgestellt werden,
; aber der Hostrechner gleichbleibt)
set $NewHost$ = "HOST"
set $configurl$ = "\\" + $NewHost$ + "\opt_pcbin\pcpatch"
set $depoturl$  = "\\" + $NewHost$ + "\opt_pcbin\install"
set $utilsurl$  = "\\" + $NewHost$ + "\opt_pcbin\utils"

; hier den neuen WINS-Server eintragen. Soll dieser nicht geändert werden, muss das Feld leer bleiben
; bitte nur IP des Servers eintragen!
set $WinsServer$ = "192.168.0.1"

; Sollte der Name des Netzwerk-Interface unter Windows anders lauten als "LAN-Verbindung" muss dies geändert werden
; die Angabe wird nur zur Änderung des WINS-Servers benötigt...
set $InterfaceName$ = "LAN-Verbindung"

;-------------------------------
; ab hier nicht mehr editieren!
; bitte auch die Daten in .\localsetup\local_domchange.ins ändern!
;-------------------------------

DefVar $ProductName$
Set $ProductName$ = "domchange"
DefVar $ProductSizeMB$
Set $ProductSizeMB$ = "2"
DefVar $LocalSetupScript$
Set $LocalSetupScript$ = "local_"+$ProductName$+".ins /batch"

;Variable für temporäres Verzeichnis
DefVar $Temp$
set $Temp$ = EnvVar("TEMP")
DefVar $Tmp$
set $Tmp$ = EnvVar("TMP")
;Variablen für BetriebssystemsVersion (OS)-Test
DefVar $OS$
DefVar $MinorOS$
set $OS$ = GetOS
set $MinorOS$ = GetNTVersion

DefVar $RebootFlag$
DefVar $WinstRegKey$
DefVar $RebootRegVar$
DefVar $AutoName$
DefVar $AutoPass$
DefVar $AutoDom$
DefVar $AutoLogon$
DefVar $AutoBackupKey$
DefVar $LocalFilesPath$
DefVar $LocalWinst$
DefVar $IniVar_action$

Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst"
Set $RebootFlag$ = GetRegistryStringValue("["+$WinstRegKey$+"] "+"RebootFlag")
Set $AutoBackupKey$ = $WinstRegKey$+"\AutoLogonBackup"
Set $LocalFilesPath$ = "C:\opsi_local_inst"
Set $LocalWinst$ = "c:\opsi\utils\winst32.exe"
;Set $LocalWinst$ = "c:\programme\opsi.org\utils\winst32.exe"
Set $IniVar_action$ = IniVar("action")

if ($OS$ = "Windows_NT" AND not ($MinorOS$="NT4"))

 if not (($RebootFlag$ = "1") or ($RebootFlag$ = "2"))
 ;=========================
 ; Anweisungen vor Reboot


  if not(HasMinimumSpace ("%SYSTEMDRIVE%", ""+$ProductSizeMB$+" MB"))
   LogError "Nicht genügend Platz auf C: . "+$ProductSizeMB$+" MB auf C: für "+$ProductName$+" erforderlich."
  else
 
   ; show product picture
   ShowBitmap /3 "%scriptpath%\localsetup\"+$ProductName$+".bmp" "$ProductName$"

   Message "Preparing "+$ProductName$+" install ..."
   sub_Prepare_AutoLogon
   Registry_SaveIniVar
   if (($IniVar_action$ = "join") or ($IniVar_action$ = "move"))
     if not($WinsServer$ = "")
       dosInAnIcon_changeWinsServer
     endif
   endif
   
   ; steht der Rechner auf move, so wird jetzt die Host-Variable neu gesetzt und nach dem Reboot meldet
   ; sich der Rechner beim neuen Server an. Dort muss dann auch domchange=setup und action=move stehen!!!
   ; leider wird der alte Server dann im Zustand domchange=setup verlassen...
   if ($IniVar_action$ = "move")
     if not($NewHost$ = "")
       Registry_patch_shareinfo
     endif
   endif

   ; we need to reboot now to be shure that the autologon work

   ; Reboot initialisieren ...
   Set $RebootFlag$ = "1"
   Registry_SaveRebootFlag
   ExitWindows /ImmediateReboot

  endif ; genuegend platz 
 endif ; Rebootflag = not (1 or 2)
 if ($RebootFlag$ = "1") 
  ;=========================
  ; Anweisungen nach Reboot
  ; Rebootflag weitersetzen
  Set $RebootFlag$ = "2"
  Registry_SaveRebootFlag
  ; die eigentlichen Anweisungen

  Message "Preparing "+$ProductName$+" install ..."
  ExitWindows /ImmediateLogout
  ; now let the autologon work
  ; it will stop with a reboot
 endif ; Rebootflag = 1
 if ($RebootFlag$ = "2")
  ;=========================
  ; statements after second reboot
  Set $RebootFlag$ = "0"
  Registry_SaveRebootFlag
  ; This part must be here even if nothing is done
  ; possibly we do some cleanup
  Message "Cleanup "+$ProductName$+" install ..."
  sub_Restore_AutoLogon
  Registry_killIniVar
  if (($IniVar_action$ = "remove") or ($IniVar_action$ = "move"))
    if not($NewHost$ = "")
      Registry_patch_shareinfo
    endif
  endif
  ; This is the clean end of the installation 
 endif ; Rebootflag = 2
endif

[sub_Prepare_AutoLogon]
; read actual Autologon values for backup
set $AutoName$ = GetRegistryStringValue ("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] DefaultUserName")
; if AutoLogonName is our setup admin user, something bad happend
; then let us cleanup
if ($AutoName$="opsiSetupAdmin") 
 set $AutoName$=""
 set $AutoPass$=""
 set $AutoDom$=""
 set $AutoLogon$="0"
else
 set $AutoPass$ = GetRegistryStringValue ("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] DefaultPassword")
 set $AutoDom$ = GetRegistryStringValue ("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] DefaultDomainName")
 set $AutoLogon$ = GetRegistryStringValue ("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] AutoAdminLogon")
endif
; backup AutoLogon values
Registry_save_autologon
; prepare the admin AutoLogon
Registry_autologon
; create our setup admin user
DosInAnIcon_makeadmin
; store our setup script as run once
Registry_runOnce
; copy the setup script and files
Files_copy_Setup_files_local

[sub_Restore_AutoLogon]
; read AutoLogon values from backup
set $AutoName$ = GetRegistryStringValue("["+$AutoBackupKey$+"] DefaultUserName")
set $AutoPass$ = GetRegistryStringValue("["+$AutoBackupKey$+"] DefaultPassword")
set $AutoDom$= GetRegistryStringValue("["+$AutoBackupKey$+"] DefaultDomainName")
set $AutoLogon$= GetRegistryStringValue("["+$AutoBackupKey$+"] AutoAdminLogon")
; restore the values
Registry_restore_autologon
; delete our setup admin user
DosInAnIcon_deleteadmin
; cleanup setup script, files and profiledir
Files_delete_Setup_files_local
; delete profiledir
DosInAnIcon_deleteprofile

;in dieser Sektion wird er Eintrag für den WINS-Server geändert, dazu wird die IP des WINS-Servers benötigt
[dosInAnIcon_changeWinsServer]
netsh inter ip delete wins "$InterfaceName$" all
netsh inter ip add wins "$InterfaceName$" $WinsServer$

[Registry_save_autologon]
openkey [$AutoBackupKey$]
set "DefaultUserName"="$AutoName$"
set "DefaultPassword"="$AutoPass$"
set "DefaultDomainName"="$AutoDom$"
set "AutoAdminLogon"="$AutoLogon$"

[Registry_restore_autologon]
openkey [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
set "DefaultUserName"="$AutoName$"
set "DefaultPassword"="$AutoPass$"
;set "DefaultDomainName"="$AutoDom$"
set "AutoAdminLogon"="$AutoLogon$"

[DosInAnIcon_deleteadmin]
NET USER opsiSetupAdmin  /DELETE

[Registry_SaveRebootFlag]
openKey [$WinstRegKey$]
set "RebootFlag" = "$RebootFlag$"


[Files_copy_Setup_files_local]
copy -s %ScriptPath%\localsetup\*.* $LocalFilesPath$

[Files_delete_Setup_files_local]
delete -sf $LocalFilesPath$
; folgender Befehl funktioniert nicht vollständig, deshalb ist er zur Zeit auskommentier
; der Befehl wird durch die Sektion "DosInAnIcon_deleteprofile" ersetzt (P.Ohler)
;delete -sf "%ProfileDir%\opsiSetupAdmin"

[DosInAnIcon_deleteprofile]
rmdir /S /Q "%ProfileDir%\opsiSetupAdmin"


[DosInAnIcon_makeadmin]
NET USER opsiSetupAdmin opsiAZ9356y /ADD
NET LOCALGROUP Administratoren /ADD opsiSetupAdmin

[Registry_autologon]
openkey [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
set "DefaultUserName"="opsiSetupAdmin"
set "DefaultPassword"="opsiAZ9356y"
set "DefaultDomainName"="localhost"
set "AutoAdminLogon"="1"

[Registry_runonce]
openkey [HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce]
set "opsi_autologon_setup"="$LocalWinst$ $LocalFilesPath$\$LocalSetupScript$"

[Registry_saveIniVar]
openKey [$WinstRegKey$]
set "IniVar_action" = "$IniVar_action$"

[Registry_killIniVar]
openKey [$WinstRegKey$]
deleteVar "IniVar_action"

[Registry_patch_shareinfo]
openkey [HKEY_LOCAL_MACHINE\SOFTWARE\opsi.org\shareinfo]
set "configurl" = "$configurl$"
set "depoturl"  = "$depoturl$"
set "utilsurl"  = "$utilsurl$"
openkey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
set "HOST" = "$NewHost$"
#####################################################################

Part 2

localsetup/local_domchange.ins

#####################################################################
[Initial]
Message=ändere die Domäne...
;Erstellt am 14.03.2006 von Patrick Ohler
LogLevel=2
ExitOnError=false
ScriptErrorMessages=on
TraceMode=off


[Aktionen]
DefVar $NewDomain$
DefVar $NewDomainAdmin$
DefVar $NewDomainAdminPass$
DefVar $Server$
DefVar $configurl$
DefVar $depoturl$
DefVar $utilsurl$

;-------------------------------
; hier die Daten eintragen
;-------------------------------

set $NewDomain$          = "DOMAIN"
set $NewDomainAdmin$     = "ADMIN"
set $NewDomainAdminPass$ = "PASSWORD"

;-------------------------------
; ab hier nicht mehr editieren!
;-------------------------------


;Variablen für BetriebssystemsVersion (OS)-Test
DefVar $OS$
set $OS$ = GetOS
DefVar $NTVersion$
set $NTVersion$ = GetNTVersion

DefVar $WinstRegKey$
Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst"
DefVar $IniVar_action$
set $IniVar_action$ = GetRegistryStringValue("["+$WinstRegKey$+"] IniVar_action")

if ($OS$ = "Windows_NT" OR $OS$="Windows_95")
  if ($NTVersion$ = "WinXP")
    Files_copy_netdom
    ;zur Sicherheit alle Netzwerkverbindungen trennen, kann sonst zu Problemen führen
    DosInAnIcon_unmount_all

    if ($IniVar_action$ = "remove")
      DosInAnIcon_remove
    else
      if ($IniVar_action$ = "join")
        DosInAnIcon_join
        Registry_patch_default_domain
      else
        if ($IniVar_action$ = "move")
          DosInAnIcon_move
          Registry_patch_default_domain
        endif        
      endif
    endif

    Files_delete_netdom
    ExitWindows /Reboot
  endif
endif

[Files_copy_netdom]
;netdom.exe muss in ein Verzeichnis im PATH kopiert werden, da es ansonsten nicht
;korrekt ausgeführt werden kann
copy %ScriptPath%\netdom.exe %System%

[DosInAnIcon_unmount_all]
net use /DELETE * /yes

[DosInAnIcon_move]
netdom move %PCName% /Domain:$NewDomain$ /UserD:$NewDomainAdmin$ /PasswordD:$NewDomainAdminPass$

[DosInAnIcon_remove]
netdom remove %PCName%

[DosInAnIcon_join]
netdom join %PCName% /Domain:$NewDomain$ /UserD:$NewDomainAdmin$ /PasswordD:$NewDomainAdminPass$

[Registry_patch_default_domain]
openkey [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
set "DefaultDomainName" = "$NewDomain$"
set "AltDefaultDomainName" = "$NewDomain$"
set "CachePrimaryDomain" = "$NewDomain$"

[Files_delete_netdom]
delete %System%\netdom.exe