Instal_edeiaLab.psm1
|
<#
.Synopsis Instalar e-DeiaLab em um terminal .DESCRIPTION Este modulo instalada o e-DeiaLab num terminal juntamente com todas as ferramentas necessárias .EXAMPLE get-eDeiaLab -DrDestino c:\edeia -Servidor=192.168.1.1 .EXAMPLE get-eDeiaLab -DrDestino c:\edeia -Servidor=Servidor #> function get-eDeiaLab { [CmdletBinding()] Param ( # Diretorio local onde sera instalado e-DeiaLab c:\edeia [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] $DirDestino="c:\edeiax", [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)] # IP ou DNS do servidor onde está o e-DeiaLab $Servidor="192.168.111.3", [Parameter(Position=2)] # Forçar HTTPS [Switch]$SSL=$false, [Parameter(Position=3)] # Endereço certificado [String]$PathCertificado="indef" ) Begin { $start_timeT = Get-Date $start_time = Get-Date If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(` [Security.Principal.WindowsBuiltInRole] "Administrator")) { Write-Warning "You do not have Administrator rights to run this script!`nPlease re-run this script as an Administrator!" Break } $Caption = (Get-WmiObject "win32_operatingsystem" | Select caption).Caption If(-not ($Caption -match "Microsoft Windows 8" -OR $Caption -match "Microsoft Windows 7" -OR $Caption -match "Microsoft Windows 10") ) { Write-Warning "Please run this script in Windows 10, Windows 8/8.1 or Windows 7" break } } Process { #Fase 1 - Framework #region .Net Frameworks $start_time = Get-Date Write-host "Fase 1 - Frameworks : Inicio" $Caption = (Get-WmiObject "win32_operatingsystem" | Select caption).Caption If($Caption -match "Microsoft Windows 8" -OR $Caption -match "Microsoft Windows 7" -OR $Caption -match "Microsoft Windows 10") { $Result = Dism /online /get-featureinfo /featurename:NetFx3 If($Result -contains "State : Enabled") { Write-Warning "Fase 1 - Frameworks : .Net Framework 3.5 has been installed and enabled." } Else { Write-Verbose "Fase 1 - Frameworks : Installing .Net Framework 3.5, do not close this prompt..." | Dism /online /Enable-feature /featurename:NetFx3 | Out-Null $Result = Dism /online /Get-featureinfo /featurename:NetFx3 If($Result -contains "State : Enabled") { Write-verbose "Fase 1 - Frameworks : Install .Net Framework 3.5 successfully." } Else { Write-verbose "Fase 1 - Frameworks : Failed to install Install .Net Framework 3.5, you can use local source to try again." } Write-Host "Fase 1 - Framework 3: Tempo: $((Get-Date).Subtract($start_time).Hours) horas, $((Get-Date).Subtract($start_time).Minutes) minutos $((Get-Date).Subtract($start_time).Seconds) segundos" #DISM.exe /online /enable-feature /all /featurename:NetFx4 } #.net 4.0 $start_time = Get-Date $Result = Dism /online /get-featureinfo /featurename:NetFx4 If($Result -contains "State : Enabled") { Write-Warning "Fase 1 - Frameworks : .Net Framework 4 has been installed and enabled." } Else { Write-verbose "Fase 1 - Frameworks : Installing .Net Framework 4, do not close this prompt..." | Dism /online /Enable-feature /featurename:NetFx4 | Out-Null $Result = Dism /online /Get-featureinfo /featurename:NetFx4 If($Result -contains "State : Enabled") { Write-verbose "Fase 1 - Frameworks : Install .Net Framework 4 successfully." } Else { Write-verbose "Fase 1 - Frameworks : Failed to install Install .Net Framework 4, you can use local source to try again." } #DISM.exe /online /enable-feature /all /featurename:NetFx4 Write-Host "Fase 1 - Framework 4: Tempo: $((Get-Date).Subtract($start_time).Hours) horas, $((Get-Date).Subtract($start_time).Minutes) minutos $((Get-Date).Subtract($start_time).Seconds) segundos" } } Else { Write-Error "Fase 1 - Frameworks : Please run this script in Windows 10, Windows 8/8.1 or Windows 7" } #endregion #Fase 2 - caminho e requisitos #region Testar endereço servidor $start_time = Get-Date Write-Host "Fase 2 - Requisitos " # testar se existe o diretorio e se não criar if (-not(Test-Path -Path $DirDestino)) { Write-Verbose "Fase 2 - Requisitos : Criar diretório $DirDestino" New-Item -Path $DirDestino -ItemType Directory } # descarregar o necessário do servidor cliente ou remoto $filelocal="menulab.exe" # apagar menulab.exe para voltar a garantir o teste if (Test-Path -Path "$DirDestino\$filelocal") { try { Remove-Item -Path "$DirDestino\$filelocal" -Force } catch { Write-Error "Fase 2 - Requisitos : Erro ao apagar o ficheiro $DirDestino\$filelocal" break } } #testar endereço do servidor $caminhoservidor_ok=$true $url_edeia="http://$servidor/edeia/" if (-not(test-eDeiaSite -Url $url_edeia)) { $url_edeia="http://$servidor/" if (-not(test-eDeiaSite -Url $url_edeia)) { $url_edeia="https://$servidor/edeia/" if (-not(test-eDeiaSite -Url $url_edeia)) { $url_edeia="https://$servidor/" if (-not(test-eDeiaSite -Url $url_edeia)) { $caminhoservidor_ok=$false } } } } if ($url_edeia -match "https" -and $caminhoservidor_ok) { $SSL=$true } # testar certificados if ($PathCertificado -ne "indef" ) { if ((Test-Path -Path $PathCertificado) ) { #importar certificado $cer="$PathCertificado" Import-Certificate -FilePath $cer -CertStoreLocation Cert:\LocalMachine\Root Write-Verbose "Fase 2 - Requisitos : Certificado importado" } else { Write-Warning "Fase 2 - Requisitos : Caminho certificado inválido $PathCertificado" } } if ((-not $caminhoservidor_ok) -and ($url_edeia -match "edeia.com")) { # fazer uma verificação, se datacenter, edeia.com, e se falha SSL vamos sacar o certificado e instalar if (-not(test-eDeiaSSL -computerName $servidor)) { $filecert="certificado_datacenter.cer" Write-Verbose "Fase 2 - Requisitos : Download file http://segilac.no-ip.org/edeia/tools/InstalacaoLocal/$filecert para $DirDestino\$filecert" Start-BitsTransfer -Source "http://segilac.no-ip.org/edeia/tools/InstalacaoLocal/$filecert" -Destination "$DirDestino\$filecert" -ErrorAction SilentlyContinue if (Test-Path -Path "$DirDestino\$filecert") { #importar certificado $cer="$DirDestino\$filecert" Import-Certificate -FilePath $cer -CertStoreLocation Cert:\LocalMachine\Root Write-Verbose "Fase 2 - Requisitos : Certificado importado" } else { Write-Warning "Fase 2 - Requisitos : Download Certificado falhou" } } $caminhoservidor_ok=$true $url_edeia="https://$servidor/edeia/" if (-not(test-eDeiaSite -Url $url_edeia)) { $url_edeia="https://$servidor/" if (-not(test-eDeiaSite -Url $url_edeia)) { $caminhoservidor_ok=$false } } if ($url_edeia -match "https" -and $caminhoservidor_ok) { $SSL=$true } } Write-Verbose "Fase 2 - Requisitos : Download file $url_edeia$filelocal para $DirDestino\$filelocal" Start-BitsTransfer -Source "$url_edeia$filelocal" -Destination "$DirDestino\$filelocal" -ErrorAction SilentlyContinue if (Test-Path -Path "$DirDestino\$filelocal") { $caminhoservidor_ok=$true } $fileremoto="syncfusion.tools.dll", "Syncfusion.Grid.dll", "Syncfusion.Shared.dll", "Menulab.xml" foreach ($f in $fileremoto) { Write-Verbose "Fase 2 - Requisitos : Download file http://segilac.no-ip.org/edeia/tools/InstalacaoLocal/$f para $DirDestino\$f" Start-BitsTransfer -Source "http://segilac.no-ip.org/edeia/tools/InstalacaoLocal/$f" -Destination "$DirDestino\$f" #Write-Output "http://192.168.111.1/edeia/tools/InstalacaoLocal/$f" } #abrir o menulab.xml para definir o servidor if ($caminhoservidor_ok) { $fileMenulab_xml="$DirDestino\menulab.xml" if (Test-Path -Path $fileMenulab_xml) { Write-Verbose "Fase 2 - Requisitos : Editar menulab.xml" [xml]$XmlDocument = Get-Content -Path $fileMenulab_xml $XmlDocument.Configuracao.UrlServidor=$url_edeia $XmlDocument.Save($fileMenulab_xml) } } Write-Host "Fase 2 - Requisitos : Tempo: $((Get-Date).Subtract($start_time).Hours) horas, $((Get-Date).Subtract($start_time).Minutes) minutos $((Get-Date).Subtract($start_time).Seconds) segundos" #endregion #Fase 3 - Crystal Reports #region Crystal Reports #testar se 64 se 32 $32_ou_64=(Get-WmiObject Win32_OperatingSystem).OSArchitecture $f="" $start_time = Get-Date Write-Host "Fase 3 - Crystal Re " #instalar o crystal if ( $32_ou_64.StartsWith("64")) { #instalar 64 bits $start_time = Get-Date $fileremoto="CrystalReportsEngine200804x64.msi","CRRedist2008_x64.msi", "CRRuntime_64bit_13_0_8.msi" foreach ($f in $fileremoto) { if (-not (Test-Path -Path "$DirDestino\$f")) { Write-Verbose "Fase 3 - Crystal Re : Download http://segilac.no-ip.org/edeia/tools/InstalacaoLocal/$f para $DirDestino\$f" Start-BitsTransfer -Source "http://segilac.no-ip.org/edeia/tools/InstalacaoLocal/$f" -Destination "$DirDestino\$f" } #Write-Output "http://192.168.111.1/edeia/tools/InstalacaoLocal/$f" # deploy Crystal Reports Write-Verbose "Fase 3 - Crystal Re :Instalar $DirDestino\$f" Start-Process "$DirDestino\$f" /qn -Wait -Verbose if ($fileremoto -eq "CrystalReportsEngine200804x64.msi") { Write-Verbose "Fase 3 - Crystal Re :RE - Instalar $DirDestino\$f" Start-Process "$DirDestino\$f" /qn -Wait -Verbose } Write-Host "Fase 3 - Crystal Re : Tempo $DirDestino\$f : $((Get-Date).Subtract($start_time).Hours) horas, $((Get-Date).Subtract($start_time).Minutes) minutos $((Get-Date).Subtract($start_time).Seconds) segundos" } } else { #instalar 32 bits $fileremoto="Crystal.Net2.112007.msi","CRRedist2008_x86.msi", "CRRuntime_32bit_13_0_8.msi" $start_time = Get-Date foreach ($f in $fileremoto) { if (-not (Test-Path -Path "$DirDestino\$f")) { Write-Verbose "Fase 3 - Crystal Re : Download http://segilac.no-ip.org/edeia/tools/InstalacaoLocal/$f para $DirDestino\$f" Start-BitsTransfer -Source "http://segilac.no-ip.org/edeia/tools/InstalacaoLocal/$f" -Destination "$DirDestino\$f" } # deploy Crystal Reports Write-Verbose "Fase 3 - Crystal Re : Instalar $DirDestino\$f" Start-Process "$DirDestino\$f" /qn -Wait -Verbose Write-Host "Fase 3 - Crystal Re : Tempo $DirDestino\$f : $((Get-Date).Subtract($start_time).Hours) horas, $((Get-Date).Subtract($start_time).Minutes) minutos $((Get-Date).Subtract($start_time).Seconds) segundos" } } #endregion #Fase 4 fontes e atalho´ #region Fonts, atalho write-host "Fase 4 - Atalhos " #Criar atalho ambiente de trabalho $WshShell = New-Object -comObject WScript.Shell $Shortcut = $WshShell.CreateShortcut("$Home\Desktop\e-DeiaLab.lnk") $Shortcut.TargetPath = "$DirDestino\menulab.exe" $Shortcut.Save() #copiar fonte cod-39 $f="Code-39-20.ttf" if(-not (Test-Path -Path "$env:windir\fonts\$f")) { Write-Verbose "Fase 4 - Atalhos : Download Font e instalar $DirDestino\$f" Start-BitsTransfer -Source "http://segilac.no-ip.org/edeia/tools/InstalacaoLocal/$f" -Destination "$DirDestino\$f" $FONTS = 0x14 $objShell = New-Object -ComObject Shell.Application $objFolder = $objShell.Namespace($FONTS) $objFolder.CopyHere("$DirDestino\$f") } #$objFolder.CopyHere("$DirDestino\$f") #Arrancar com o e-DeiaLab if ($caminhoservidor_ok) { Start-Process "$DirDestino\menulab.exe" } else { Write-Error "Fase 4 - Atalhos : Caminho servidor e-DeiaLab falhou - $url_edeia" } #endregion Write-Host "Tempo Total: $((Get-Date).Subtract($start_timeT).Hours) horas, $((Get-Date).Subtract($start_timeT).Minutes) minutos $((Get-Date).Subtract($start_timeT).Seconds) segundos" Write-Verbose "Instalação terminada" } } # function test-eDeiaSite { [OutputType([bool])] Param ( # Param1 help description [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [string]$Url ) process { try { # First we create the request. $HTTP_Request = [System.Net.WebRequest]::Create("$($Url)servicos/servicoutilizadores.asmx") # We then get a response from the site. $HTTP_Response = $HTTP_Request.GetResponse() # We then get the HTTP code as an integer. $HTTP_Status = [int]$HTTP_Response.StatusCode # Finally, we clean up the http request by closing it. $HTTP_Response.Close() } catch { return $false } If ($HTTP_Status -eq 200) { Return $true } Else { Return $false #Write-Host "The Site may be down, please check!" } } } function test-eDeiaSSL { param([parameter(Mandatory=$true)][string]$computerName) $port=443 #Create a TCP Socket to the computer and a port number #test if the socket got connected try { $tcpsocket = New-Object Net.Sockets.TcpClient($computerName, $port) } catch { #Write-Error "Error Opening Connection: $port on $computername Unreachable" return $false } try { #Socket Got connected get the tcp stream ready to read the certificate write-host "Successfully Connected to $computername on $port" -ForegroundColor Green -BackgroundColor Black $tcpstream = $tcpsocket.GetStream() Write-host "Reading SSL Certificate...." -ForegroundColor Yellow -BackgroundColor Black #Create an SSL Connection $sslStream = New-Object System.Net.Security.SslStream($tcpstream,$false) #Force the SSL Connection to send us the certificate $sslStream.AuthenticateAsClient($computerName) #Read the certificate $certinfo = New-Object system.security.cryptography.x509certificates.x509certificate2($sslStream.RemoteCertificate) } catch { return $false } return $true <# $returnobj = new-object psobject $returnobj |Add-Member -MemberType NoteProperty -Name "FriendlyName" -Value $certinfo.FriendlyName $returnobj |Add-Member -MemberType NoteProperty -Name "SubjectName" -Value $certinfo.SubjectName $returnobj |Add-Member -MemberType NoteProperty -Name "HasPrivateKey" -Value $certinfo.HasPrivateKey $returnobj |Add-Member -MemberType NoteProperty -Name "EnhancedKeyUsageList" -Value $certinfo.EnhancedKeyUsageList $returnobj |Add-Member -MemberType NoteProperty -Name "DnsNameList" -Value $certinfo.DnsNameList $returnobj |Add-Member -MemberType NoteProperty -Name "SerialNumber" -Value $certinfo.SerialNumber $returnobj |Add-Member -MemberType NoteProperty -Name "Thumbprint" -Value $certinfo.Thumbprint $returnobj |Add-Member -MemberType NoteProperty -Name "NotAfter" -Value $certinfo.NotAfter $returnobj |Add-Member -MemberType NoteProperty -Name "NotBefore" -Value $certinfo.NotBefore $returnobj #> } |