application-workloads/sccm/sccm-currentbranch/DSC/InstallPSForHierarchy.ps1 (110 lines of code) (raw):
Param($DomainFullName,$CM,$CMUser,$Role,$ProvisionToolPath,$CSName,$CSRole,$LogFolder)
$SMSInstallDir="C:\Program Files\Microsoft Configuration Manager"
$logpath = $ProvisionToolPath+"\InstallSCCMlog.txt"
$ConfigurationFile = Join-Path -Path $ProvisionToolPath -ChildPath "$Role.json"
$Configuration = Get-Content -Path $ConfigurationFile | ConvertFrom-Json
$Configuration.WaitingForCASFinsihedInstall.Status = 'Running'
$Configuration.WaitingForCASFinsihedInstall.StartTime = Get-Date -format "yyyy-MM-dd HH:mm:ss"
$Configuration | ConvertTo-Json | Out-File -FilePath $ConfigurationFile -Force
$_Role = $CSRole
$_FilePath = "\\$CSName\$LogFolder"
$CSConfigurationFile = Join-Path -Path $_FilePath -ChildPath "$_Role.json"
while(!(Test-Path $CSConfigurationFile))
{
"[$(Get-Date -format "MM/dd/yyyy HH:mm:ss")] Wait for configuration file exist on $CSName, will try 60 seconds later..." | Out-File -Append $logpath
Start-Sleep -Seconds 60
$CSConfigurationFile = Join-Path -Path $_FilePath -ChildPath "$_Role.json"
}
$CSConfiguration = Get-Content -Path $CSConfigurationFile -ErrorAction Ignore | ConvertFrom-Json
while($CSConfiguration.$("UpgradeSCCM").Status -ne "Completed")
{
"[$(Get-Date -format "MM/dd/yyyy HH:mm:ss")] Wait for step : [UpgradeSCCM] finished running on $CSName, will try 60 seconds later..." | Out-File -Append $logpath
Start-Sleep -Seconds 60
$CSConfiguration = Get-Content -Path $CSConfigurationFile | ConvertFrom-Json
}
$Configuration.WaitingForCASFinsihedInstall.Status = 'Completed'
$Configuration.WaitingForCASFinsihedInstall.EndTime = Get-Date -format "yyyy-MM-dd HH:mm:ss"
$Configuration | ConvertTo-Json | Out-File -FilePath $ConfigurationFile -Force
$cmsourcepath = "\\$CSName\SMS_$CSRole\cd.latest"
$CMINIPath = "c:\HierarchyPS.ini"
"[$(Get-Date -format "MM/dd/yyyy HH:mm:ss")] Check ini file." | Out-File -Append $logpath
$cmini = @'
[Identification]
Action=InstallPrimarySite
CDLatest=1
[Options]
ProductID=EVAL
SiteCode=%Role%
SiteName=%Role%
SMSInstallDir=%InstallDir%
SDKServer=%MachineFQDN%
RoleCommunicationProtocol=HTTPorHTTPS
ClientsUsePKICertificate=0
PrerequisiteComp=1
PrerequisitePath=%REdistPath%
MobileDeviceLanguage=0
AdminConsole=1
JoinCEIP=0
[SQLConfigOptions]
SQLServerName=%SQLMachineFQDN%
DatabaseName=%SQLInstance%CM_%Role%
SQLSSBPort=4022
SQLDataFilePath=%SQLDataFilePath%
SQLLogFilePath=%SQLLogFilePath%
[CloudConnectorOptions]
CloudConnector=0
CloudConnectorServer=
UseProxy=0
ProxyName=
ProxyPort=
[SystemCenterOptions]
SysCenterId=
[HierarchyExpansionOption]
CCARSiteServer=%CASMachineFQDN%
'@
$inst = (get-itemproperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server').InstalledInstances[0]
$p = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$inst
$sqlinfo = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\$inst"
"[$(Get-Date -format "MM/dd/yyyy HH:mm:ss")] ini file exist." | Out-File -Append $logpath
$cmini = $cmini.Replace('%InstallDir%',$SMSInstallDir)
$cmini = $cmini.Replace('%MachineFQDN%',"$env:computername.$DomainFullName")
$cmini = $cmini.Replace('%SQLMachineFQDN%',"$env:computername.$DomainFullName")
$cmini = $cmini.Replace('%Role%',$Role)
$cmini = $cmini.Replace('%SQLDataFilePath%',$sqlinfo.DefaultData)
$cmini = $cmini.Replace('%SQLLogFilePath%',$sqlinfo.DefaultLog)
$cmini = $cmini.Replace('%CM%',$CM)
$cmini = $cmini.Replace('%CASMachineFQDN%',"$CSName.$DomainFullName")
$cmini = $cmini.Replace('%REdistPath%',"$cmsourcepath\REdist")
if(!(Test-Path C:\$CM\Redist))
{
New-Item C:\$CM\Redist -ItemType directory | Out-Null
}
if($inst.ToUpper() -eq "MSSQLSERVER")
{
$cmini = $cmini.Replace('%SQLInstance%',"")
}
else
{
$tinstance = $inst.ToUpper() + "\"
$cmini = $cmini.Replace('%SQLInstance%',$tinstance)
}
$CMInstallationFile = "$cmsourcepath\SMSSETUP\BIN\X64\Setup.exe"
$cmini > $CMINIPath
$Configuration.InstallSCCM.Status = 'Running'
$Configuration.InstallSCCM.StartTime = Get-Date -format "yyyy-MM-dd HH:mm:ss"
$Configuration | ConvertTo-Json | Out-File -FilePath $ConfigurationFile -Force
"[$(Get-Date -format "MM/dd/yyyy HH:mm:ss")] Installing.." | Out-File -Append $logpath
Start-Process -Filepath ($CMInstallationFile) -ArgumentList ('/NOUSERINPUT /script "' + $CMINIPath + '"') -wait
"[$(Get-Date -format "MM/dd/yyyy HH:mm:ss")] Finished installing CM." | Out-File -Append $logpath
Remove-Item $CMINIPath
#Waiting for Site ready
$CSConfiguration = Get-Content -Path $CSConfigurationFile -ErrorAction Ignore | ConvertFrom-Json
while($CSConfiguration.$("PSReadytoUse").Status -ne "Completed")
{
"[$(Get-Date -format "MM/dd/yyyy HH:mm:ss")] Wait for step : [PSReadytoUse] finished running on $CSName, will try 60 seconds later..." | Out-File -Append $logpath
Start-Sleep -Seconds 60
$CSConfiguration = Get-Content -Path $CSConfigurationFile | ConvertFrom-Json
}
$Configuration.InstallSCCM.Status = 'Completed'
$Configuration.InstallSCCM.EndTime = Get-Date -format "yyyy-MM-dd HH:mm:ss"
$Configuration | ConvertTo-Json | Out-File -FilePath $ConfigurationFile -Force