Hallo Herr Dr. Oertel,
anbei die Skripte. Zunächst die Skripte der "normalen Version" (also ohne admin-template). Weiter unten die Skripte für die (De-)Installation im Kontext eines lokalen Admin.
setup.ins:
Code: Alles auswählen
; Copyright (c) uib gmbh (www.uib.de)
; This sourcecode is owned by uib
; and published under the Terms of the General Public License.
; credits: http://www.opsi.org/en/credits/
[Actions]
requiredWinstVersion >= "4.10.8.6"
DefVar $MsiId32$
DefVar $UninstallProgram32$
DefVar $MsiId64$
DefVar $UninstallProgram64$
DefVar $LogDir$
DefVar $ProductId$
DefVar $MinimumSpace$
DefVar $InstallDir$
DefVar $InstallDir32$
DefVar $InstallDir64$
DefVar $ExitCode$
DefVar $LicenseRequired$
DefVar $LicenseKey$
DefVar $LicensePool$
DefVar $INST_SystemType$
DefVar $INST_architecture$
DefVar $Path$
set $Path$ = EnvVar ("Path")
Set $INST_SystemType$ = GetSystemType
set $INST_architecture$ = GetProductProperty("install_architecture","system specific")
Set $LogDir$ = "%SystemDrive%\tmp"
; ----------------------------------------------------------------
; - Please edit the following values -
; ----------------------------------------------------------------
;$ProductId$ should be the name of the product in opsi
; therefore please: only lower letters, no umlauts,
; no white space use '-' as a seperator
Set $ProductId$ = "Lotus Notes"
Set $MinimumSpace$ = "1 MB"
; the path were we find the product after the installation
Set $InstallDir32$ = "%ProgramFiles32Dir%\IBM\Lotus\Notes"
Set $InstallDir64$ = "%ProgramFiles64Dir%\IBM\Lotus\Notes"
Set $LicenseRequired$ = "false"
Set $LicensePool$ = "p_" + $ProductId$
; ----------------------------------------------------------------
if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$))
LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$
isFatalError
; Stop process and set installation status to failed
else
comment "Show product picture"
ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$
; Deinstallation zur Zeit deaktiviert, wegen Problem bei Deinstallation unter Windows XP
;if FileExists("%ScriptPath%\delsub.ins")
; comment "Start uninstall sub section"
; Sub "%ScriptPath%\delsub.ins"
;endif
if $LicenseRequired$ = "true"
comment "Licensing required, reserve license and get license key"
Sub_get_licensekey
endif
comment "installing"
if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only")
Message "Installing " + $ProductId$ + " 32 Bit..."
comment "Start setup program"
Winbatch_install_32
Sub_check_exitcode
;comment "Patch Registry"
;Registry_install /32Bit
set $InstallDir$ = $InstallDir64$
Registry_PathPatch
comment "Copy files"
Files_install /32Bit
;comment "Create shortcuts"
;LinkFolder_install
endif
if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only"))
Message "Installing " + $ProductId$ + " 64 Bit..."
comment "Start setup program"
Winbatch_install_64
Sub_check_exitcode
;comment "Patch Registry"
;Registry_install /64Bit
set $InstallDir$ = $InstallDir32$
Registry_PathPatch
comment "Copy files"
Files_install /64Bit
;comment "Create shortcuts"
;LinkFolder_install
endif
endif
[Winbatch_install_32]
msiexec /qb! ALLUSERS=2 /i "%ScriptPath%\Lotus Notes 8.5.3.msi" TRANSFORMS="%ScriptPath%\LotusNotes8.5.3.mst" /L* "$LogDir$\NotesInstall.log"
[Files_install]
copy -s "%ScriptPath%\files\*.*" "%CommonAppdataDir%\Lotus\Notes\Data\Shared\mui\de"
[Winbatch_install_64]
msiexec /qb! ALLUSERS=2 /i "%ScriptPath%\Lotus Notes 8.5.3.msi" TRANSFORMS="%ScriptPath%\LotusNotes8.5.3.mst" /L* "$LogDir$\NotesInstall.log"
[Registry_PathPatch]
; Eintragen des Pfades zu Notes an den Anfang der Path-Variablen.
; Dies ist fuer die Nutzung des Octopus Desk 250 erforderlich
OpenKey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
set "Path" = "$InstallDir$;$Path$"
[LinkFolder_install]
; Creating a shortcut to the installed exe in AllUsers startmenu:
;
set_basefolder common_programs
set_subfolder $ProductId$
set_link
name: $ProductId$
target: "$InstallDir$\notes.exe"
parameters:
working_dir: $InstallDir$
icon_file: "$InstallDir$\notes.exe"
icon_index:
end_link
;
; Creating a shortcut to the installed exe on AllUsers desktop:
;
set_basefolder common_desktopdirectory
set_subfolder ""
;
set_link
name: $ProductId$
target: "$InstallDir$\notes.exe"
parameters:
working_dir: $InstallDir$
icon_file: "$InstallDir$\notes.exe"
icon_index:
end_link
[Sub_get_licensekey]
comment "License management is enabled and will be used"
comment "Trying to get a license key"
Set $LicenseKey$ = demandLicenseKey ($LicensePool$)
; If there is an assignment of exactly one licensepool to the product the following call is possible:
; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$)
;
; If there is an assignment of a license pool to a windows software id, it is possible to use:
; DefVar $WindowsSoftwareId$
; $WindowsSoftwareId$ = "..."
; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$)
DefVar $ServiceErrorClass$
set $ServiceErrorClass$ = getLastServiceErrorClass
comment "Error class: " + $ServiceErrorClass$
if $ServiceErrorClass$ = "None"
comment "Everything fine, we got the license key '" + $LicenseKey$ + "'"
else
if $ServiceErrorClass$ = "LicenseConfigurationError"
LogError "Fatal: license configuration must be corrected"
LogError getLastServiceErrorMessage
isFatalError
else
if $ServiceErrorClass$ = "LicenseMissingError"
LogError "Fatal: required license is not supplied"
isFatalError
endif
endif
endif
[Sub_check_exitcode]
comment "Test for installation success via exit code"
set $ExitCode$ = getLastExitCode
; informations to exit codes see
; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx
; http://msdn.microsoft.com/en-us/library/aa368542.aspx
if ($ExitCode$ = "0")
comment "Looks good: setup program gives exitcode zero"
else
comment "Setup program gives a exitcode unequal zero: " + $ExitCode$
if ($ExitCode$ = "1605")
comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed."
comment "Uninstall of a not installed product failed - no problem"
else
if ($ExitCode$ = "1641")
comment "looks good: setup program gives exitcode 1641"
comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success."
else
if ($ExitCode$ = "3010")
comment "looks good: setup program gives exitcode 3010"
comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success."
else
logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$
isFatalError
endif
endif
endif
endif
uninstall.ins:
Code: Alles auswählen
; Copyright (c) uib gmbh (www.uib.de)
; This sourcecode is owned by uib gmbh
; and published under the Terms of the General Public License.
; credits: http://www.opsi.org/en/credits/
[Actions]
requiredWinstVersion >= "4.10.8.6"
DefVar $MsiId32$
DefVar $UninstallProgram32$
DefVar $MsiId64$
DefVar $UninstallProgram64$
DefVar $LogDir$
DefVar $ExitCode$
DefVar $ProductId$
DefVar $InstallDir32$
DefVar $InstallDir64$
DefVar $LicenseRequired$
DefVar $LicensePool$
DefVar $INST_SystemType$
DefVar $INST_architecture$
DefVar $Path$
set $Path$ = EnvVar ("Path")
Set $INST_SystemType$ = GetSystemType
set $INST_architecture$ = GetProductProperty("install_architecture","system specific")
Set $LogDir$ = "%SystemDrive%\tmp"
; ----------------------------------------------------------------
; - Please edit the following values -
; ----------------------------------------------------------------
Set $ProductId$ = "Lotus Notes"
Set $InstallDir32$ = "%ProgramFiles32Dir%\IBM\Lotus\Notes"
Set $InstallDir64$ = "%ProgramFiles64Dir%\IBM\Lotus\Notes"
Set $LicenseRequired$ = "false"
Set $LicensePool$ = "p_" + $ProductId$
; ----------------------------------------------------------------
comment "Show product picture"
ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$
Message "Uninstalling " + $ProductId$ + " ..."
if FileExists("%ScriptPath%\delsub.ins")
comment "Start uninstall sub section"
Sub "%ScriptPath%\delsub.ins"
endif
if $LicenseRequired$ = "true"
comment "Licensing required, free license used"
Sub_free_license
endif
[Sub_free_license]
comment "License management is enabled and will be used"
comment "Trying to free license used for the product"
DefVar $result$
Set $result$ = FreeLicense($LicensePool$)
; If there is an assignment of a license pool to the product, it is possible to use
; Set $result$ = FreeLicense("", $ProductId$)
;
; If there is an assignment of a license pool to a windows software id, it is possible to use
; DefVar $WindowsSoftwareId$
; $WindowsSoftwareId$ = "..."
; set $result$ = FreeLicense("", "", $WindowsSoftwareId$)
delsup.ins:
Code: Alles auswählen
; Copyright (c) uib gmbh (www.uib.de)
; This sourcecode is owned by uib gmbh
; and published under the Terms of the General Public License.
; credits: http://www.opsi.org/en/credits/
DefStringList $Pfad$
DefVar $line$
DefVar $InstallDir$
Set $MsiId32$ = '{122A716C-63AD-4F73-BDCD-309F0A799C91}'
Set $UninstallProgram32$ = $InstallDir32$ + "\uninstall.exe"
Set $MsiId64$ = '{122A716C-63AD-4F73-BDCD-309F0A799C91}'
Set $UninstallProgram64$ = $InstallDir64$ + "\uninstall.exe"
if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only")
Message "Uninstalling " + $ProductId$ + " 32 Bit..."
if FileExists($UninstallProgram32$)
comment "Uninstall program found, starting uninstall"
Winbatch_uninstall_32
sub_check_exitcode
set $InstallDir$ = $InstallDir32$
comment "Pfadanpassung von der Installation wieder rueckgaengig machen"
DefVar $split$
set $Pfad$ = splitString ($Path$, ";")
for %s% in $Pfad$ do Sub_String_modifizieren
set $Path$ = $line$
comment "korrigierten Pfad wieder in Registry eintragen. Geaenderter Pfad wird nach Neustart des PC wirksam."
Registry_uninstall /32Bit
endif
if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId32$ + "] DisplayName") = "")
comment "MSI id " + $MsiId32$ + " found in registry, starting msiexec to uninstall"
Winbatch_uninstall_msi_32
sub_check_exitcode
set $InstallDir$ = $InstallDir32$
comment "Pfadanpassung von der Installation wieder rueckgaengig machen"
DefVar $split$
set $Pfad$ = splitString ($Path$, ";")
for %s% in $Pfad$ do Sub_String_modifizieren
set $Path$ = $line$
comment "korrigierten Pfad wieder in Registry eintragen. Geaenderter Pfad wird nach Neustart des PC wirksam."
Registry_uninstall /32Bit
endif
endif
if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only"))
Message "Uninstalling " + $ProductId$ + " 64 Bit..."
if FileExists($UninstallProgram64$)
comment "Uninstall program found, starting uninstall"
Winbatch_uninstall_64
sub_check_exitcode
set $InstallDir$ = $InstallDir64$
comment "Pfadanpassung von der Installation wieder rueckgaengig machen"
DefVar $split$
set $Pfad$ = splitString ($Path$, ";")
for %s% in $Pfad$ do Sub_String_modifizieren
set $Path$ = $line$
comment "korrigierten Pfad wieder in Registry eintragen. Geaenderter Pfad wird nach Neustart des PC wirksam."
Registry_uninstall /64Bit
endif
if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId64$ + "] DisplayName") = "")
comment "MSI id " + $MsiId64$ + " found in registry, starting msiexec to uninstall"
Winbatch_uninstall_msi_64
sub_check_exitcode
set $InstallDir$ = $InstallDir32$
comment "Pfadanpassung von der Installation wieder rueckgaengig machen"
DefVar $split$
set $Pfad$ = splitString ($Path$, ";")
for %s% in $Pfad$ do Sub_String_modifizieren
set $Path$ = $line$
comment "korrigierten Pfad wieder in Registry eintragen. Geaenderter Pfad wird nach Neustart des PC wirksam."
Registry_uninstall /64Bit
endif
endif
comment "Delete program shortcuts"
LinkFolder_uninstall
[Winbatch_uninstall_32]
[Winbatch_uninstall_msi_32]
msiexec /x $MsiId32$ /qb! ALLUSERS=2 REBOOT=ReallySuppress
[Winbatch_uninstall_64]
[Winbatch_uninstall_msi_64]
msiexec /x $MsiId64$ /qb! ALLUSERS=2 REBOOT=ReallySuppress
[Sub_String_modifizieren]
set $split$ = "%s%"
if not ($split$ = "$InstallDir$")
set $line$ = $line$ + $split$ + ";"
if $line$ = ";"
set $line$ = ""
endif
comment $line$
endif
[Registry_uninstall]
; Korrigierten Path wieder in Registry schreiben
OpenKey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
set "Path" = REG_EXPAND_SZ:'$Path$'
[LinkFolder_uninstall]
; Example of deleting a folder from AllUsers startmenu:
;
set_basefolder common_programs
delete_subfolder $ProductId$
;
; Example of deleting a shortcut from AllUsers desktop:
;
set_basefolder common_desktopdirectory
set_subfolder ""
delete_element $ProductId$
[Sub_check_exitcode]
comment "Test for installation success via exit code"
set $ExitCode$ = getLastExitCode
; informations to exit codes see
; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx
; http://msdn.microsoft.com/en-us/library/aa368542.aspx
if ($ExitCode$ = "0")
comment "Looks good: setup program gives exitcode zero"
else
comment "Setup program gives a exitcode unequal zero: " + $ExitCode$
if ($ExitCode$ = "1605")
comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed."
comment "Uninstall of a not installed product failed - no problem"
else
if ($ExitCode$ = "1641")
comment "looks good: setup program gives exitcode 1641"
comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success."
else
if ($ExitCode$ = "3010")
comment "looks good: setup program gives exitcode 3010"
comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success."
else
logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$
isFatalError
endif
endif
endif
endif
---------------------------------------------------
Und nun die Skripte für die (De-)Installation im Kontext eines lokalen Adminaccounts.
setup.ins:
Code: Alles auswählen
; Copyright (c) uib gmbh (www.uib.de)
; This sourcecode is owned by uib
; and published under the Terms of the General Public License.
; TEMPLATE for
; Skript fuer Installationen im Kontext eines temporaeren lokalen Administrators
; installations as temporary local admin
; see winst_manual.pdf / winst_handbuch.pdf
; !!! requires winst32.exe version 4.2.x !!!
;
; !!! Das lokale Installations-Skript, das durch den temporaeren lokalen Admin ausgefuehrt wird
; !!! (sein Name steht in $LocalSetupScript$), muss mit dem Befehl
; !!! exitWindows /Reboot
; !!! enden
;
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; Vorarbeiten/Voraussetzungen/Doku pruefen wie in Winsthandbuch
; 8.3 Skript fuer Installationen im Kontext eines lokalen Administrators
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[Actions]
requiredWinstVersion >= 4.10.6
setLogLevel=7
DefVar $ProductName$
DefVar $ProductSizeMB$
DefVar $LocalSetupScript$
DefVar $LockKeyboard$
DefVar $OpsiAdminPass$
DefVar $OS$
DefVar $MinorOS$
DefVar $MsVersion$
DefVar $RebootFlag$
DefVar $ShutdownRequested$
DefVar $WinstRegKey$
DefVar $RebootRegVar$
DefVar $AutoName$
DefVar $AutoPass$
DefVar $AutoDom$
DefVar $AutoLogon$
DefVar $AutoBackupKey$
DefVar $LocalFilesPath$
DefVar $LocalWinst$
DefVar $SystemType$
DefVar $platform_cmdexe$
DefVar $DefaultLoglevel$
DefVar $PasswdLogLevel$
DefVar $AdminGroup$
DefVar $SearchResult$
DefVar $LocalDomain$
DefStringlist $ResultList$
DefStringlist $ResultList2$
DefStringlist $ResultList3$
comment "set $LockKeyboard$ to true to prevent user hacks while admin is logged in"
Set $LockKeyboard$="true"
Set $LockKeyboard$="false"
Set $ProductName$ = "Lotus Notes"
Set $ProductSizeMB$ = "1500"
Set $LocalSetupScript$ = "local_setup.ins"
set $OS$ = GetOS
set $MinorOS$ = GetNTVersion
Set $SystemType$ = GetSystemType
Set $MsVersion$ = GetMsVersionInfo
set $DefaultLoglevel$ = "7"
comment " set $PasswdLogLevel$ to 0 for production"
Set $PasswdLogLevel$="7"
SetLogLevel=$DefaultLoglevel$
if not (fileExists ("%Scriptpath%\psgetsid.exe"))
LogError "psgetsid.exe is missing. Please install it from http://download.sysinternals.com/Files/PsTools.zip to %Scriptpath%"
isFatalError
endif
if not(($SystemType$ = "64 Bit System") or ($SystemType$ = "x86 System"))
LogError "Unknown Systemtype: "+$SystemType$+" - aborting"
isFatalError
endif
if $SystemType$ = "64 Bit System"
set $platform_cmdexe$ = "%SystemRoot%\cmd64.exe"
else
set $platform_cmdexe$ = "%System%\cmd.exe"
endif
Set $LocalDomain$ = "%PCNAME%"
;if ($MsVersion$ >= "6")
; Set $LocalDomain$ = "."
;endif
comment "handle Rebootflag"
Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst"
Set $RebootFlag$ = GetRegistryStringValue("["+$WinstRegKey$+"] "+"RebootFlag")
Set $ShutdownRequested$ = GetRegistryStringValue("["+$WinstRegKey$+"] "+"ShutdownRequested")
sub_test_autologon_data
comment "some paths required"
Set $AutoBackupKey$ = $WinstRegKey$+"\AutoLogonBackup"
Set $LocalFilesPath$ = "C:\opsi_local_inst"
Set $LocalWinst$ = "c:\opsi\utils\winst32.exe"
if not( FileExists($LocalWinst$) )
Set $LocalWinst$ = "%ProgramFilesDir%\opsi.org\preloginloader\utils\winst32.exe"
endif
if not( FileExists($LocalWinst$) )
Set $LocalWinst$ = "%ProgramFilesDir%\opsi.org\preloginloader\opsi-winst\winst32.exe"
endif
if not( FileExists($LocalWinst$) )
Set $LocalWinst$ = "%ProgramFilesDir%\opsi.org\opsi-client-agent\opsi-winst\winst32.exe"
endif
if not( FileExists($LocalWinst$) )
LogError "No opsi-winst found. Abborting."
isFatalError
endif
comment "show product picture"
ShowBitmap /3 "%scriptpath%\localsetup\"+$ProductName$+".png" $ProductName$
if not (($RebootFlag$ = "1") or ($RebootFlag$ = "2") or ($RebootFlag$ = "3"))
comment "Part before first Reboot"
comment "just reboot - this must be done if this is the first product after OS installation"
comment "handle Rebootflag"
Set $RebootFlag$ = "1"
Registry_SaveRebootFlag
ExitWindows /ImmediateReboot
endif ; Rebootflag = not (1 or 2 or 3)
if $RebootFlag$ = "1"
comment "Part before second Reboot"
if not(HasMinimumSpace ("%SYSTEMDRIVE%", ""+$ProductSizeMB$+" MB"))
LogError "Not enough space on drive C: . "+$ProductSizeMB$+" MB on C: required for "+$ProductName$
isFatalError
endif
comment "Lets work..."
Message "Preparing "+$ProductName$+" install step 1..."
sub_Prepare_AutoLogon
comment "we need to reboot now to be sure that the autologon work"
comment "handle Rebootflag"
Set $RebootFlag$ = "2"
Registry_SaveRebootFlag
sub_test_autologon_data
ExitWindows /ImmediateReboot
endif ; Rebootflag = not (1 or 2)
if ($RebootFlag$ = "2")
comment "Part after first Reboot"
comment "handle Rebootflag"
Set $RebootFlag$ = "3"
Registry_SaveRebootFlag
comment "Lets work..."
Message "Preparing "+$ProductName$+" install step 2..."
Registry_enable_keyboard /64bit
comment "now let the autologon work"
comment "it will stop with a reboot"
ExitWindows /ImmediateLogout
endif ; Rebootflag = 2
if ($RebootFlag$ = "3")
comment "Part after second Reboot"
comment "handle Rebootflag"
Set $RebootFlag$ = "0"
Registry_SaveRebootFlag
comment "Lets work..."
Message "Cleanup "+$ProductName$+" install (step 3)..."
sub_Restore_AutoLogon
set $SearchResult$ = GetRegistryStringValue64("[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce] opsi_autologon_setup")
if $SearchResult$ = $LocalWinst$+" "+$LocalFilesPath$+"\"+$LocalSetupScript$+" /batch"
LogError "Localscript did not run. We remove the RunOnce entry and abort"
Registry_del_runonce /64Bit
isFatalError
endif
comment "This is the clean end of the installation"
endif ; Rebootflag = 3
ExitWindows /Reboot
[sub_Prepare_AutoLogon]
comment "copy the setup script and files"
Files_copy_Setup_files_local
comment "read actual Autologon values for backup"
set $AutoName$ = GetRegistryStringValue64("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] DefaultUserName")
comment "if AutoLogonName is our setup admin user, something bad happend"
comment "then let us cleanup"
if ($AutoName$="opsiSetupAdmin")
set $AutoName$=""
set $AutoPass$=""
set $AutoDom$=""
set $AutoLogon$="0"
else
set $AutoPass$ = GetRegistryStringValue64("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] DefaultPassword")
set $AutoDom$ = GetRegistryStringValue64("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] DefaultDomainName")
set $AutoLogon$ = GetRegistryStringValue64("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] AutoAdminLogon")
endif
comment "backup AutoLogon values"
Registry_save_autologon
comment "prepare the admin AutoLogon"
SetLogLevel=$PasswdLogLevel$
set $OpsiAdminPass$= randomstr
Registry_autologon /64Bit
comment "get the name of the admin group"
comment "using psgetsid from sysinernals pstools"
set $ResultList$ = getOutStreamFromSection("DosInAnIcon_get_admin_group")
set $AdminGroup$ = takeString(6,$ResultList$)
set $AdminGroup$ = takeString(1,splitstring($AdminGroup$,"\"))
comment "create our setup admin user"
DosInAnIcon_makeadmin
SetLogLevel=$DefaultLoglevel$
comment "remove c:\tmp\winst.bat with password"
Files_remove_winst_bat
comment "store our setup script as run once"
Registry_runOnce /64Bit
comment "disable keyboard and mouse while the autologin admin works"
if ($LockKeyboard$="true")
Registry_disable_keyboard /64Bit
endif
[sub_test_autologon_data]
set $AutoPass$ = GetRegistryStringValue64("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] DefaultPassword")
set $AutoDom$ = GetRegistryStringValue64("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] DefaultDomainName")
set $AutoLogon$ = GetRegistryStringValue64("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] AutoAdminLogon")
[sub_Restore_AutoLogon]
comment "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")
comment "restore the values"
SetLogLevel = $PasswdLogLevel$
Registry_restore_autologon /64Bit
SetLogLevel = $DefaultLoglevel$
comment "delete our setup admin user"
DosInAnIcon_deleteadmin
comment "cleanup setup script, files and profiledir"
Files_delete_Setup_files_local
comment "delete profiledir"
DosInAnIcon_deleteprofile
[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_get_admin_group]
@echo off
"%ScriptPath%\psgetsid.exe" /accepteula S-1-5-32-544
[DosInAnIcon_makeadmin]
NET USER opsiSetupAdmin $OpsiAdminPass$ /ADD
NET LOCALGROUP $AdminGroup$ /ADD opsiSetupAdmin
[Registry_autologon]
openkey [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
set "DefaultUserName"="opsiSetupAdmin"
set "DefaultPassword"="$OpsiAdminPass$"
set "DefaultDomainName"="$LocalDomain$"
set "AutoAdminLogon"="1"
[Registry_runonce]
openkey [HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce]
set "opsi_autologon_setup"='"$LocalWinst$" "$LocalFilesPath$\$LocalSetupScript$" /batch'
[Registry_del_runonce]
openkey [HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce]
DeleteVar "opsi_autologon_setup"
[Registry_disable_keyboard]
openkey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kbdclass]
set "Start"=REG_DWORD:0x4
openkey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Mouclass]
set "Start"=REG_DWORD:0x4
[Registry_enable_keyboard]
openkey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kbdclass]
set "Start"=REG_DWORD:0x1
openkey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Mouclass]
set "Start"=REG_DWORD:0x1
[Files_remove_winst_bat]
delete -f c:\tmp\_winst.bat
local_setup.ins:
Code: Alles auswählen
; Copyright (c) uib gmbh (www.uib.de)
; This sourcecode is owned by uib
; and published under the Terms of the General Public License.
; credits: http://www.opsi.org/en/credits/
[Actions]
Registry_del_autologin
;....
requiredWinstVersion >= "4.10.8.6"
DefVar $MsiId32$
DefVar $UninstallProgram32$
DefVar $MsiId64$
DefVar $UninstallProgram64$
DefVar $LogDir$
DefVar $ProductId$
DefVar $MinimumSpace$
DefVar $InstallDir$
DefVar $InstallDir32$
DefVar $InstallDir64$
DefVar $ExitCode$
DefVar $LicenseRequired$
DefVar $LicenseKey$
DefVar $LicensePool$
DefVar $INST_SystemType$
DefVar $INST_architecture$
DefVar $Path$
set $Path$ = EnvVar ("Path")
Set $INST_SystemType$ = GetSystemType
set $INST_architecture$ = GetProductProperty("install_architecture","system specific")
Set $LogDir$ = "%SystemDrive%\tmp"
; ----------------------------------------------------------------
; - Please edit the following values -
; ----------------------------------------------------------------
;$ProductId$ should be the name of the product in opsi
; therefore please: only lower letters, no umlauts,
; no white space use '-' as a seperator
Set $ProductId$ = "Lotus Notes"
Set $MinimumSpace$ = "1500 MB"
; the path were we find the product after the installation
Set $InstallDir32$ = "%ProgramFiles32Dir%\IBM\Lotus\Notes"
Set $InstallDir64$ = "%ProgramFiles64Dir%\IBM\Lotus\Notes"
Set $LicenseRequired$ = "false"
Set $LicensePool$ = "p_" + $ProductId$
; ----------------------------------------------------------------
if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$))
LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$
isFatalError
; Stop process and set installation status to failed
else
comment "Show product picture"
ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$
; Deinstallation zur Zeit deaktiviert, wegen Problem bei Deinstallation unter Windows XP
;if FileExists("%ScriptPath%\delsub.ins")
; comment "Start uninstall sub section"
; Sub "%ScriptPath%\delsub.ins"
;endif
if $LicenseRequired$ = "true"
comment "Licensing required, reserve license and get license key"
Sub_get_licensekey
endif
comment "installing"
if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only")
Message "Installing " + $ProductId$ + " 32 Bit..."
comment "Start setup program"
Winbatch_install_32
Sub_check_exitcode
set $InstallDir$ = $InstallDir64$
Registry_PathPatch
comment "Copy files"
Files_install /32Bit
endif
if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only"))
Message "Installing " + $ProductId$ + " 64 Bit..."
comment "Start setup program"
Winbatch_install_64
Sub_check_exitcode
set $InstallDir$ = $InstallDir32$
Registry_PathPatch
comment "Copy files"
Files_install /64Bit
endif
ExitWindows /Reboot
endif
[Registry_del_autologin]
openkey [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
set "DefaultUserName"=""
set "DefaultPassword"=""
[Winbatch_install_32]
msiexec /qb! ALLUSERS=2 /i "%ScriptPath%\Lotus Notes 8.5.3.msi" TRANSFORMS="%ScriptPath%\LotusNotes8.5.3.mst" /L* "$LogDir$\NotesInstall.log"
[Files_install]
copy -s "%ScriptPath%\files\*.*" "%CommonAppdataDir%\Lotus\Notes\Data\Shared\mui\de"
[Winbatch_install_64]
msiexec /qb! ALLUSERS=2 /i "%ScriptPath%\Lotus Notes 8.5.3.msi" TRANSFORMS="%ScriptPath%\LotusNotes8.5.3.mst" /L* "$LogDir$\NotesInstall.log"
[Files_install_64]
[Registry_install]
[Registry_PathPatch]
; Eintragen des Pfades zu Notes an den Anfang der Path-Variablen.
; Dies ist fuer die Nutzung des Octopus Desk 250 erforderlich
OpenKey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
set "Path" = "$InstallDir$;$Path$"
[LinkFolder_install]
; Creating a shortcut to the installed exe in AllUsers startmenu:
;
set_basefolder common_programs
set_subfolder $ProductId$
set_link
name: $ProductId$
target: "$InstallDir$\notes.exe"
parameters:
working_dir: $InstallDir$
icon_file: "$InstallDir$\notes.exe"
icon_index:
end_link
;
; Creating a shortcut to the installed exe on AllUsers desktop:
;
set_basefolder common_desktopdirectory
set_subfolder ""
;
set_link
name: $ProductId$
target: "$InstallDir$\notes.exe"
parameters:
working_dir: $InstallDir$
icon_file: "$InstallDir$\notes.exe"
icon_index:
end_link
[Sub_get_licensekey]
comment "License management is enabled and will be used"
comment "Trying to get a license key"
Set $LicenseKey$ = demandLicenseKey ($LicensePool$)
; If there is an assignment of exactly one licensepool to the product the following call is possible:
; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$)
;
; If there is an assignment of a license pool to a windows software id, it is possible to use:
; DefVar $WindowsSoftwareId$
; $WindowsSoftwareId$ = "..."
; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$)
DefVar $ServiceErrorClass$
set $ServiceErrorClass$ = getLastServiceErrorClass
comment "Error class: " + $ServiceErrorClass$
if $ServiceErrorClass$ = "None"
comment "Everything fine, we got the license key '" + $LicenseKey$ + "'"
else
if $ServiceErrorClass$ = "LicenseConfigurationError"
LogError "Fatal: license configuration must be corrected"
LogError getLastServiceErrorMessage
isFatalError
else
if $ServiceErrorClass$ = "LicenseMissingError"
LogError "Fatal: required license is not supplied"
isFatalError
endif
endif
endif
[Sub_check_exitcode]
comment "Test for installation success via exit code"
set $ExitCode$ = getLastExitCode
; informations to exit codes see
; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx
; http://msdn.microsoft.com/en-us/library/aa368542.aspx
if ($ExitCode$ = "0")
comment "Looks good: setup program gives exitcode zero"
else
comment "Setup program gives a exitcode unequal zero: " + $ExitCode$
if ($ExitCode$ = "1605")
comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed."
comment "Uninstall of a not installed product failed - no problem"
else
if ($ExitCode$ = "1641")
comment "looks good: setup program gives exitcode 1641"
comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success."
else
if ($ExitCode$ = "3010")
comment "looks good: setup program gives exitcode 3010"
comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success."
else
logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$
isFatalError
endif
endif
endif
endif
uninstall.ins:
Code: Alles auswählen
; Copyright (c) uib gmbh (www.uib.de)
; This sourcecode is owned by uib gmbh
; and published under the Terms of the General Public License.
; credits: http://www.opsi.org/en/credits/
[Actions]
requiredWinstVersion >= "4.10.8.6"
DefVar $MsiId32$
DefVar $UninstallProgram32$
DefVar $MsiId64$
DefVar $UninstallProgram64$
DefVar $LogDir$
DefVar $ExitCode$
DefVar $ProductId$
DefVar $InstallDir32$
DefVar $InstallDir64$
DefVar $LicenseRequired$
DefVar $LicensePool$
DefVar $INST_SystemType$
DefVar $INST_architecture$
DefVar $Path$
set $Path$ = EnvVar ("Path")
Set $INST_SystemType$ = GetSystemType
set $INST_architecture$ = GetProductProperty("install_architecture","system specific")
Set $LogDir$ = "%SystemDrive%\tmp"
; ----------------------------------------------------------------
; - Please edit the following values -
; ----------------------------------------------------------------
Set $ProductId$ = "Lotus Notes"
Set $InstallDir32$ = "%ProgramFiles32Dir%\IBM\Lotus\Notes"
Set $InstallDir64$ = "%ProgramFiles64Dir%\IBM\Lotus\Notes"
Set $LicenseRequired$ = "false"
Set $LicensePool$ = "p_" + $ProductId$
; ----------------------------------------------------------------
comment "Show product picture"
ShowBitmap "%ScriptPath%\localsetup\" + $ProductId$ + ".png" $ProductId$
Message "Uninstalling " + $ProductId$ + " ..."
if FileExists("%ScriptPath%\delsub.ins")
comment "Start uninstall sub section"
Sub "%ScriptPath%\delsub.ins"
endif
if $LicenseRequired$ = "true"
comment "Licensing required, free license used"
Sub_free_license
endif
[Sub_free_license]
comment "License management is enabled and will be used"
comment "Trying to free license used for the product"
DefVar $result$
Set $result$ = FreeLicense($LicensePool$)
; If there is an assignment of a license pool to the product, it is possible to use
; Set $result$ = FreeLicense("", $ProductId$)
;
; If there is an assignment of a license pool to a windows software id, it is possible to use
; DefVar $WindowsSoftwareId$
; $WindowsSoftwareId$ = "..."
; set $result$ = FreeLicense("", "", $WindowsSoftwareId$)
delsub.ins:
Code: Alles auswählen
; Copyright (c) uib gmbh (www.uib.de)
; This sourcecode is owned by uib gmbh
; and published under the Terms of the General Public License.
; credits: http://www.opsi.org/en/credits/
DefStringList $Pfad$
DefVar $line$
DefVar $InstallDir$
Set $MsiId32$ = '{122A716C-63AD-4F73-BDCD-309F0A799C91}'
Set $UninstallProgram32$ = $InstallDir32$ + "\uninstall.exe"
Set $MsiId64$ = '{122A716C-63AD-4F73-BDCD-309F0A799C91}'
Set $UninstallProgram64$ = $InstallDir64$ + "\uninstall.exe"
if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only")
Message "Uninstalling " + $ProductId$ + " 32 Bit..."
if FileExists($UninstallProgram32$)
comment "Uninstall program found, starting uninstall"
Winbatch_uninstall_32
sub_check_exitcode
set $InstallDir$ = $InstallDir32$
comment "Pfadanpassung von der Installation wieder rueckgaengig machen"
DefVar $split$
set $Pfad$ = splitString ($Path$, ";")
for %s% in $Pfad$ do Sub_String_modifizieren
set $Path$ = $line$
comment "korrigierten Pfad wieder in Registry eintragen. Geaenderter Pfad wird nach Neustart des PC wirksam."
Registry_uninstall /32Bit
endif
if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId32$ + "] DisplayName") = "")
comment "MSI id " + $MsiId32$ + " found in registry, starting msiexec to uninstall"
Winbatch_uninstall_msi_32
sub_check_exitcode
set $InstallDir$ = $InstallDir32$
comment "Pfadanpassung von der Installation wieder rueckgaengig machen"
DefVar $split$
set $Pfad$ = splitString ($Path$, ";")
for %s% in $Pfad$ do Sub_String_modifizieren
set $Path$ = $line$
comment "korrigierten Pfad wieder in Registry eintragen. Geaenderter Pfad wird nach Neustart des PC wirksam."
Registry_uninstall /32Bit
endif
comment "Delete files"
Files_uninstall_32 /32Bit
endif
if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only"))
Message "Uninstalling " + $ProductId$ + " 64 Bit..."
if FileExists($UninstallProgram64$)
comment "Uninstall program found, starting uninstall"
Winbatch_uninstall_64
sub_check_exitcode
set $InstallDir$ = $InstallDir64$
comment "Pfadanpassung von der Installation wieder rueckgaengig machen"
DefVar $split$
set $Pfad$ = splitString ($Path$, ";")
for %s% in $Pfad$ do Sub_String_modifizieren
set $Path$ = $line$
comment "korrigierten Pfad wieder in Registry eintragen. Geaenderter Pfad wird nach Neustart des PC wirksam."
Registry_uninstall /64Bit
endif
if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId64$ + "] DisplayName") = "")
comment "MSI id " + $MsiId64$ + " found in registry, starting msiexec to uninstall"
Winbatch_uninstall_msi_64
sub_check_exitcode
set $InstallDir$ = $InstallDir32$
comment "Pfadanpassung von der Installation wieder rueckgaengig machen"
DefVar $split$
set $Pfad$ = splitString ($Path$, ";")
for %s% in $Pfad$ do Sub_String_modifizieren
set $Path$ = $line$
comment "korrigierten Pfad wieder in Registry eintragen. Geaenderter Pfad wird nach Neustart des PC wirksam."
Registry_uninstall /64Bit
endif
comment "Delete files"
Files_uninstall_64 /64Bit
endif
comment "Delete program shortcuts"
LinkFolder_uninstall
[Winbatch_uninstall_32]
[Winbatch_uninstall_msi_32]
msiexec /x $MsiId32$ /qb! ALLUSERS=2 REBOOT=ReallySuppress
[Files_uninstall_32]
delete -sf "$InstallDir32$\"
[Winbatch_uninstall_64]
[Winbatch_uninstall_msi_64]
msiexec /x $MsiId64$ /qb! ALLUSERS=2 REBOOT=ReallySuppress
[Files_uninstall_64]
delete -sf "$InstallDir64$\"
[Sub_String_modifizieren]
set $split$ = "%s%"
if not ($split$ = "$InstallDir$")
set $line$ = $line$ + $split$ + ";"
if $line$ = ";"
set $line$ = ""
endif
comment $line$
endif
[Registry_uninstall]
; Korrigierten Path wieder in Registry schreiben
OpenKey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
set "Path" = REG_EXPAND_SZ:'$Path$'
[LinkFolder_uninstall]
; Example of deleting a folder from AllUsers startmenu:
;
set_basefolder common_programs
delete_subfolder $ProductId$
;
; Example of deleting a shortcut from AllUsers desktop:
;
set_basefolder common_desktopdirectory
set_subfolder ""
delete_element $ProductId$
[Sub_check_exitcode]
comment "Test for installation success via exit code"
set $ExitCode$ = getLastExitCode
; informations to exit codes see
; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx
; http://msdn.microsoft.com/en-us/library/aa368542.aspx
if ($ExitCode$ = "0")
comment "Looks good: setup program gives exitcode zero"
else
comment "Setup program gives a exitcode unequal zero: " + $ExitCode$
if ($ExitCode$ = "1605")
comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed."
comment "Uninstall of a not installed product failed - no problem"
else
if ($ExitCode$ = "1641")
comment "looks good: setup program gives exitcode 1641"
comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success."
else
if ($ExitCode$ = "3010")
comment "looks good: setup program gives exitcode 3010"
comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success."
else
logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$
isFatalError
endif
endif
endif
endif
Bei der Installation mit diesen Skripten erscheint unter Windows XP (32 Bit) im Log folgendes:
[5] [23.7.2012 11:45:42] Execution of DosInAnIcon_makeadmin
[6] [23.7.2012 11:45:42] c:\opsi.org\tmp\_winstbat_2.bat saved back
[6] [23.7.2012 11:45:42] Executing "cmd.exe" /C "c:\opsi.org\tmp\_winstbat_2.bat"
[6] [23.7.2012 11:45:42]
[6] [23.7.2012 11:45:42] output:
[6] [23.7.2012 11:45:42] --------------
[6] [23.7.2012 11:45:42]
[6] [23.7.2012 11:45:42] C:\WINDOWS\system32>NET USER opsiSetupAdmin I?u77S/i14 /ADD
[6] [23.7.2012 11:45:42] Zugriff verweigert
[6] [23.7.2012 11:45:42]
[6] [23.7.2012 11:45:42] C:\WINDOWS\system32>NET LOCALGROUP Administratoren /ADD opsiSetupAdmin
[6] [23.7.2012 11:45:42] Zugriff verweigert
[6] [23.7.2012 11:45:42]
[6] [23.7.2012 11:45:42] Delete "c:\opsi.org\tmp\_winstbat_*"
[6] [23.7.2012 11:45:42] Search "c:\opsi.org\tmp\"
[6] [23.7.2012 11:45:42] File "c:\opsi.org\tmp\_winstbat_2.bat"
[6] [23.7.2012 11:45:42] The file has been deleted
[1] [23.7.2012 11:45:42] LogLevel was 7
[1] [23.7.2012 11:45:42] LogLevel set to 7
Vielen herzlichen Dank für Ihre Bemühungen und Ihre Hilfe!

Viele Grüße und einen schönen Tag.
Nils