- IBM TSM Client Install Folders - The name matters and is used in the scripts.
- TSM Client Install Script.ps1 - Its given below. Just save to txt file.
- dsm.opt - set with your normal server settings, values can be set that the script will replace. Example given below.
- tsmjbbd.ini - the jornal service file. Must use or alter the one used below.
TSM Client Install Script Share |
TSM Client Install Script.ps1
########################### # TSM Client Install Script # Writen by Chris Towles - http://www.christowles.com # # ver 1.0 on 2010.10.25 # ########################### Clear-Host #Set Paramters based on OS Type $os=Get-WMIObject win32_operatingsystem if ($os.OSArchitecture -eq "64-bit") { #64 $OSVersion = 64 $api = "Api32" } else { #32 $OSVersion = 32 $api = "Api" } ######## Configuration Parameters ########## $NodePassword = "Password" $NodeSchedule="DAILY_SCH" $NodeDomain="DOMAIN" $NodeClientOptSet="WINDOWS" $TSMServerUser="USERNAME" $TSMServerPassword="PASSWORD" $CollocGroup="Colloc" $ClientVersion="6.2.1.0" $InstallerFolder = "\\SERVER\SHARE" $InstallerVerFolder="IBM Tivoli Storage Manager Client V$ClientVersion - Windows x$OSVersion" $ClientOptFile="c:\Program Files\Tivoli\TSM\baclient\dsm.opt" $ClientDir="C:\Program Files\Tivoli\TSM\baclient" $OptFile="dsm.opt" $printCommands = $True #$false####################################### Functions ################# function StartProcess ($FileToExecute,$Arguments,$ClientDir , $printCommandtoConsole) { $Tempfile = "$Env:TEMP\tempfile.txt" $var = New-Item $Tempfile -ItemType file -Force Write-Output "#######################################################################" if($printCommandtoConsole) { Write-Output "$FileToExecute" $Arguments } Write-Output "#---------------------------------------------------------------------#" Start-Process "$FileToExecute" -ArgumentList $Arguments -Wait -WorkingDirectory $ClientDir -RedirectStandardOutput $Tempfile -NoNewWindow Get-Content $Tempfile Remove-Item $Tempfile -Force } function InstallTSMClient{ Write-Host "Installing TSM Client $InstallerVerFolder. " $Arguments = @() $Arguments += " /i `"$InstallerFolder\$InstallerVerFolder\IBM Tivoli Storage Manager Client.msi`"" $Arguments += " RebootYesNo=`"No`"" $Arguments += " REBOOT=`"Suppress`" " $Arguments += " ALLUSERS=`"1`"" #$Arguments += ' INSTALLDIR=`"C:\Program Files\Tivoli\TSM\ `" ' $Arguments += " ADDLOCAL=`"BackupArchiveGUI,BackupArchiveWeb," + $api + "Runtime,AdministrativeCmd`" " #$Arguments += " TRANSFORMS=`"1033.mst`"" $Arguments += " /passive" StartProcess "msiexec.exe" $Arguments "$InstallerFolder\$InstallerVerFolder" $printCommands } function UninstallTSMClient { Write-Host "Unstalling TSM Client." $UninstallString = Get-UninstallCommand "IBM Tivoli Storage Manager Client" if($UninstallString -ne $null ) { $Command = $UninstallString.Split()[0] $Arguments = @() $Arguments += $UninstallString.Split()[1].Replace("/I", "/X") $Arguments += " /passive" if($Command -ne $null) { StartProcess $Command -Arguments $Arguments -ClientDir "$InstallerFolder\$InstallerVerFolder" $printCommands } } else { Write-Host "TSM Client wasn't installed." } } Function Get-TSMClientInstallVersion { $value = "PtfLevel" $key = "hklm:\\SOFTWARE\IBM\ADSM\CurrentVersion\BackupClient" $TSMVersion = (Get-ItemProperty $key $value).$value if($TSMVersion -eq $null){ Write-Host "TSM Client is not installed." } else{ Write-Host "TSM Client Version $TSMVersion is installed." } $TSMVersion } Function Get-UninstallCommand ($DisplayName) { $key = "hklm:\\SOFTWARE\Microsoft\Windows\CurrentVersion\uninstall" $value = "UninstallString" $UninstallString = $null #Search for Key $TSMKey = (Get-ChildItem $key | % { if((get-itemproperty -Path $_.PsPath) -match $DisplayName) { $_.Name} }) if( $TSMKey -ne $null) { $TSMKey = $TSMKey.Replace("HKEY_LOCAL_MACHINE\","hklm:\\") if($TSMKey -ne $null){ $UninstallString = (Get-ItemProperty $TSMKey $value).$value } } $UninstallString } function InstallTSMScheduler { Write-Host "Installing TSM Scheduler." $Arguments = @() $Arguments += "install" $Arguments += "scheduler" $Arguments += "/name:`"TSM Scheduler`"" $Arguments += "/node:" + [Environment]::MachineName $Arguments += "/password:`"$NodePassword`"" $Arguments += "/clientdir:`"$ClientDir`"" $Arguments += "/optfile:`"$ClientDir\$OptFile`"" $Arguments += "/autostart:no" $Arguments += "/startnow:no" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands } function UninstallTSMScheduler { Write-Host "UnInstalling TSM Scheduler." #dsmcutil.exe remove /name:"TSM Scheduler" $Arguments = @() $Arguments += "remove" $Arguments += "/name:`"TSM Scheduler`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands } function InstallTSMClientAcceptor{ Write-Host "Installing TSM Client Acceptor." $Arguments = @() $Arguments += "install" $Arguments += "cad" $Arguments += "/name:`"TSM Client Acceptor`"" $Arguments += "/node:" + [Environment]::MachineName $Arguments += "/password:`"$NodePassword`"" $Arguments += "/CADSCHEDNAME:`"TSM Scheduler`"" $Arguments += "/autostart:yes" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands } function UninstallTSMClientAcceptor{ Write-Host "Uninstalling TSM Remote Client Agent." #dsmcutil.exe remove /name:"TSM Client Acceptor" $Arguments = @() $Arguments += "remove" $Arguments += "/name:`"TSM Client Acceptor`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands } function InstallTSMRemoteAgent { Write-Host "Installing TSM Remote Client Agent." $Arguments = @() $Arguments += "install" $Arguments += "remoteagent" $Arguments += "/name:`"TSM Remote Client Agent`"" $Arguments += "/node:" + [Environment]::MachineName $Arguments += "/password:`"$NodePassword`"" $Arguments += "/partnername:`"TSM Client Acceptor`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands } function UninstallTSMRemoteAgent{ Write-Host "Uninstalling TSM Remote Client Agen." #dsmcutil.exe remove /name:"TSM Client Acceptor" $Arguments = @() $Arguments += "remove" $Arguments += "/name:`"TSM Remote Client Agent`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands } function InstallTSMJournal { Write-Host "Installing TSM Journal Service." $Arguments = @() $Arguments += "install" $Arguments += "journal" $Arguments += "/name:`"TSM Journal Service`"" $Arguments += "/optfile:`"$ClientDir\$OptFile`"" $Arguments += "/autostart:yes" $Arguments += "/startnow:no" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands } function UninstallTSMJournal{ Write-Host "Uninstalling TSM Journal Service." #dsmcutil.exe remove /name:"TSM Journal Service" $Arguments = @() $Arguments += "remove" $Arguments += "/name:`"TSM Journal Service`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands } function StartTSMServices { Write-Host "Restarting TSM Services on this Box." $Arguments = @() $Arguments += "stop" $Arguments += "/name:`"TSM Client Acceptor`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands $Arguments = @() $Arguments += "start" $Arguments += "/name:`"TSM Client Acceptor`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands $Arguments = @() $Arguments += "stop" $Arguments += "/name:`"TSM Journal Service`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands $Arguments = @() $Arguments += "start" $Arguments += "/name:`"TSM Journal Service`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands } function StopTSMServices { Write-Host "Stoping TSM Services on this Box." $Arguments = @() $Arguments += "stop" $Arguments += "/name:`"TSM Client Acceptor`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands $Arguments = @() $Arguments += "stop" $Arguments += "/name:`"TSM Journal Service`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands $Arguments = @() $Arguments += "stop" $Arguments += "/name:`"TSM Scheduler`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands $Arguments = @() $Arguments += "stop" $Arguments += "/name:`"TSM Remote Client Agent`"" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands } function ReplaceTSMOptFileTags ( $line ) { $line = $line.Replace("" , [Environment]::MachineName ) $line = $line.Replace(" " , [Environment]::UserName ) $line = $line.Replace(" " , ( Get-Date ) ) $line = $line.Replace(" ", ( Get-Date ) ) $line = $line.Replace(" ", "This Tivoli install was done by a Powershell script to handle the TSM Client Install and Client setup. " + "The installer location was from $InstallerFolder" ) $line } function InstallDSMOptFile { #copy dsm.opt file Write-Host "Copying dsm.opt File to host from $InstallerFolder" Copy-Item "$InstallerFolder\$OptFile" "$ClientDir\$OptFile" #Edit the Dsm.opt File with notes $OptFileContent = Get-Content $ClientDir\$OptFile $OptFileContent | Foreach-Object { ReplaceTSMOptFileTags $_ } | Set-Content $ClientDir\$OptFile Start-Process notepad $ClientDir\$OptFile -Wait } function Get-TSMServices { $Arguments = @() $Arguments += "list" StartProcess "$ClientDir\dsmcutil.exe" $Arguments $ClientDir $printCommands } function CreateTSMNode { Write-Host "Create TSM Node " + ([Environment]::MachineName) $Arguments = @() $Arguments += "-id=$TSMServerUser" $Arguments += "-password=`"$TSMServerPassword`"" $Arguments += "register" $Arguments += "node" $Arguments += [Environment]::MachineName $Arguments += $NodePassword $Arguments += "domain=$NodeDomain" StartProcess "$ClientDir\dsmadmc.exe" $Arguments $ClientDir $printCommands } function InstallJournalOptFile { #copy tsmjbbd.ini file Write-Host "Copying tsmjbbd.ini File to host from $InstallerFolder" $JornalOptFile = "tsmjbbd.ini" Copy-Item "$InstallerFolder\$JornalOptFile" "$ClientDir\$JornalOptFile" #Edit the File $JornalOptFileContent = Get-Content $ClientDir\$JornalOptFile $LocalDriveLetters = Get-WmiObject win32_logicaldisk -computername . | where {$_.description -contains "Local Fixed Disk"} | ForEach-Object { $_.deviceID } Write-Host "The following are the Local Drives: $LocalDriveLetters" #find the section of file we need for each local drive and copy it $DriveSection = @() $NewDriveSection = @() $copyline = $false foreach($line in $JornalOptFileContent){ if($line -match " "){ $copyline = $true } elseif($line -match " "){ $copyline = $false } elseif( $copyline ) { $DriveSection += $line.TrimStart(";") } } #create the section for Local drives Foreach($drive in $LocalDriveLetters){ Foreach($line in $DriveSection){ $NewDriveSection += $line.Replace(" " , $drive ) } } #Create the new File $NewJornalOptFile = @() foreach($line in $JornalOptFileContent){ if($line -match " "){ $NewJornalOptFile += $line.Replace(" " , $LocalDriveLetters ) $NewJornalOptFile += $NewDriveSection } else { $NewJornalOptFile += $line } } Write-Host "$JornalOptFile Configured and Installed." Set-Content $ClientDir\$JornalOptFile ($NewJornalOptFile) #Start-Process notepad $ClientDir\$JornalOptFile -Wait } function Run-DSMCIncremental { Write-Host "Starting Tivoli Incrmental Backup." $Arguments = @() $Arguments += "incr" Start-Process "$ClientDir\dsmc.exe" -WorkingDirectory $ClientDir -ArgumentList $Arguments } function AssociateTSMNodeWithClientOptSet { Write-Host "Associating TSM Node with ClientOpt $NodeClientOptSet." $Arguments = @() $Arguments += "-id=$TSMServerUser" $Arguments += "-password=`"$TSMServerPassword`"" $Arguments += "update" $Arguments += "node" $Arguments += [Environment]::MachineName $Arguments += $NodePassword $Arguments += "domain=$NodeDomain" $Arguments += "cloptset=`"$NodeClientOptSet`"" StartProcess "$ClientDir\dsmadmc.exe" $Arguments $ClientDir $printCommands } function AssociateTSMNodeWithSchedule { Write-Host "Associating TSM Node with Schedule $NodeSchedule." $Arguments = @() $Arguments += "-id=$TSMServerUser" $Arguments += "-password=`"$TSMServerPassword`"" $Arguments += "define" $Arguments += "association" $Arguments += $NodeDomain $Arguments += $NodeSchedule $Arguments += [Environment]::MachineName StartProcess "$ClientDir\dsmadmc.exe" $Arguments $ClientDir $printCommands } function AssociateTSMNodeWithCollocationGroup { Write-Host "Associating TSM Node With CollocationGroup $CollocGroup." $Arguments = @() $Arguments += "-id=$TSMServerUser" $Arguments += "-password=`"$TSMServerPassword`"" $Arguments += "define" $Arguments += "COLLOCMember" $Arguments += $CollocGroup $Arguments += [Environment]::MachineName StartProcess "$ClientDir\dsmadmc.exe" $Arguments $ClientDir $printCommands } ########## Type of Installs ###################### function InstallTSMNode { $CommandOuput = @() ########## Tivoli Client Side Commands ############## $CommandOuput += InstallTSMClient $CommandOuput += InstallDSMOptFile ########## Tivoli Server Side Commands ############## $CommandOuput += CreateTSMNode $CommandOuput += AssociateTSMNodeWithClientOptSet $CommandOuput += AssociateTSMNodeWithCollocationGroup $CommandOuput += AssociateTSMNodeWithSchedule ########## Tivoli Client Side Commands ############## $CommandOuput += InstallTSMClientAcceptor $CommandOuput += InstallTSMRemoteAgent $CommandOuput += InstallTSMScheduler $CommandOuput += InstallTSMJournal $CommandOuput += InstallJournalOptFile $CommandOuput += Get-TSMServices ########## Tivoli Start Local Services ############## $CommandOuput += StartTSMServices ########## Run the first backup ##################### $CommandOuput += Run-DSMCIncremental $CommandOuput } function UninstallTSMNode { $CommandOuput = @() $CommandOuput += StopTSMServices $CommandOuput += UninstallTSMJournal $CommandOuput += UninstallTSMRemoteAgent $CommandOuput += UninstallTSMScheduler $CommandOuput += UninstallTSMClientAcceptor $CommandOuput += UninstallTSMClient #Send Email that Uninstall was done } ######################################### #create Log file $logfile = "$Env:TEMP\TsmScriptInstall.txt" $var = New-Item $logfile -ItemType file -Force $CommandResults = @() $CommandResults += "TSM Install Log: " + (Get-Date ) $CommandResults += UninstallTSMNode $CommandResults += InstallTSMNode #Get-TSMClientInstallVersion $CommandResults ########## Log ############## Add-Content $logfile ( $CommandResults ) Start-Process notepad $logfile -Wait Remove-Item $logfile #Delete the log; it has passwords stored in it.
TSM Client Dsm.opt File
******************************************************* * NKU TSM Windows Option File * * Server name:* Setup By: * Setup When: * Last Modified: * * Notes: * ******************************************************* PASSWORDACCESS GENERATE MANAGEDSERVICES WEBCLIENT SCHEDULE TCPSERVERADDRESS TSM1.NKU.EDU SNAPSHOTPROVIDERFS VSS QUERYSCHEDPERIOD 6 SCHEDMODE POLLING SCHEDLOGNAME "c:\program files\tivoli\tsm\baclient\dsmsched.log" * Wraps Logs to stop their size in mb ERRORLOGMAX 90 SCHEDLOGMAX 90 EXCLUDE.BACKUP "c:\program files\tivoli\tsm\baclient\dsmsched.*" EXCLUDE.BACKUP "*:\microsoft uam volume\...\*" EXCLUDE.BACKUP "*:\microsoft uam volume\...\*.*" EXCLUDE.BACKUP "*:\...\EA DATA. SF" EXCLUDE.BACKUP "*:\IBMBIO.COM" EXCLUDE.BACKUP "*:\IBMDOS.COM" EXCLUDE.BACKUP "*:\IO.SYS" EXCLUDE.BACKUP "*:\...\system32\config\...\*" EXCLUDE.BACKUP "*:\...\system32\Perflib*.dat" EXCLUDE.BACKUP "*:\...\system32\dhcp\...\*" INCLUDE.BACKUP "*:\...\system32\dhcp\backup\...\*" EXCLUDE.BACKUP "*:\...\system32\dns\...\*" INCLUDE.BACKUP "*:\...\system32\dns\backup\...\*" EXCLUDE.ARCHIVE "*:\microsoft uam volume\...\*" EXCLUDE.ARCHIVE "*:\microsoft uam volume\...\*.*" EXCLUDE.ARCHIVE "*:\...\EA DATA. SF" EXCLUDE.ARCHIVE "*:\IBMBIO.COM" EXCLUDE.ARCHIVE "*:\IBMDOS.COM" EXCLUDE.ARCHIVE "*:\IO.SYS" EXCLUDE.ARCHIVE "*:\...\system32\config\...\*" EXCLUDE.ARCHIVE "*:\...\system32\Perflib*.dat" EXCLUDE.ARCHIVE "*:\...\system32\dhcp\...\*" INCLUDE.ARCHIVE "*:\...\system32\dhcp\backup\...\*" EXCLUDE.ARCHIVE "*:\...\system32\dns\...\*" INCLUDE.ARCHIVE "*:\...\system32\dns\backup\...\*" EXCLUDE.DIR "*:\System Volume Information" EXCLUDE.DIR "*:\...\Temporary Internet Files" EXCLUDE.DIR "*:\Recycled" EXCLUDE.DIR "*:\Recycler" EXCLUDE.DIR "*:\$Recycle.Bin"
TSM Journal Service INI - tsmjbbd.ini
[JournaledFileSystemSettings]
JournalDBSize=0x00100000
; Default journal db size - Allows journal to grow, limited only by space available
NotifyFilter=0x00000117
; What events to monitor ; File & Dir Name, Size, Attrib, Last Write, Security
NotifyBufferSize=0x00008000
DirNotifyBufferSize=0x00004000
JournaledFileSystems=
;
;[JournaledFileSystemSettings.
;JournalDBSize=0x00000000
;JournalDir=C:\Program Files\Tivoli\TSM\baclient\Journal
;NotifyFilter=0x00000117
;
[JournalSettings]
Errorlog=jbberror.log
JournalDir=C:\Program Files\Tivoli\TSM\baclient\Journal
[JournalExcludeList]
%SystemRoot%\System32\Config\*
%SystemDrive%\Adsm.Sys\*
%TEMP%\*
%TMP%\*
%USERPROFILE\*\index.dat
*\System Volume Information\*
*\Recycle*\*
*\*.jbbdb
*\*\obi.tsm
*\*\obh.tsm
*\*\obd.tsm
*\tsmlvsacache
*\tsmlvsacache\*
*\pagefile.sys
*\*.crmlog
*\hiberfil.sys
%SystemRoot%\csc\*
%SystemRoot%\System32\DTCLog\MSDTC.LOG
%SystemRoot%\netlogon.chg
%SystemRoot%\schedlgu.txt
%SystemRoot%\registration\*.clb
%WINDIR%\debug\*
%WINDIR%\system32\config\*
%TEMP%\*
%TMP%\*
%SystemDrive%\Documents and Settings\NetShowServices\ntuser.dat
%SystemDrive%\Documents and Settings\NetShowServices\Local Settings\Application Data\Microsoft\Windows\UsrClass.dat
%USERPROFILE%\ntuser.dat
%USERPROFILE%\Local Settings\Application Data\Microsoft\Windows\UsrClass.dat
*\microsoft uam volume\*
*\microsoft uam volume\*
*\IBMBIO.COM*
*\IBMDOS.COM*
*\MSDOS.SYS
*\IO.SYS
%WINDIR%\system32\Perflib*.dat
%WINDIR%\system32\dhcp\*
%WINDIR%\system32\dhcp\backup*\*
%WINDIR%\system32\dns*\*
%WINDIR%\system32\dns\backup\*
*\System Volume Information*
*\*Temporary Internet Files*
*\Recycled*
*\Recycler*
Hello
ReplyDeleteThank you for the script.
I have a question tho. From where are you getting this:
$UninstallString = Get-UninstallCommand "IBM Tivoli Storage Manager Client"
and
Function Get-TSMClientInstallVersion
Specifically the Gets.
The script always return
Write-Host "TSM Client wasn't installed."
Because it doesn't know what Get-UninstallCommand is.
Atleast i cant see it.
Thank you.