Instal_edeiaLab.psm1

<#
.Synopsis
   Instalar e-DeiaLab em um terminal windows 7,8 ou 10
.DESCRIPTION
   Este modulo instalada o e-DeiaLab num terminal juntamente com todas as ferramentas necessárias, framework, crystal reports, e ficheiros do e-DeiaLab.
.EXAMPLE
   get-eDeiaLab -DrDestino c:\edeia -Servidor=192.168.1.1
.EXAMPLE
   get-eDeiaLab -DrDestino c:\edeia -Servidor=Servidor
.EXAMPLE
    get-eDeiaLab -DrDestino c:\edeia -Servidor=192.168.1.1 -SSL
.EXAMPLE
    get-eDeiaLab -DrDestino c:\edeia -Servidor=edeia.segilac.com -PathCertificado c:\temp\file.cer
#>

function get-eDeiaLab
{
    [CmdletBinding()]
    Param
    (
        # Diretorio local onde sera instalado e-DeiaLab c:\edeia
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [String]$DirDestino="c:\edeiax",
        # IP ou DNS do servidor onde está instalado o e-DeiaLab
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=1)]        
        [String]$Servidor="192.168.111.3",
        # Forçar HTTPS - SSL
        [Parameter(Position=2)]        
        [Switch]$SSL=$false,
        # Caminho para o certificado a importar
        [Parameter(Position=3)]
        [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
            # se não vem com ssl testamos sem e depois com ssl para ver se conseguimos
            if (-not $SSL)
            {
                $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
                }
            }
            else # forçado a SSL, nem testar sem pois o utilizador quer com SSL
            {
                $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
                    } 
                } 
            }

            # instalar o certificado quando é passado
            $flag_instaladoCertificado=$false
            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"
                    $flag_instaladoCertificado=$true
                }
                else
                {
                    Write-Warning "Fase 2 - Requisitos : Caminho certificado inválido $PathCertificado"
                }
            }
            #Se não sabemos o caminho, se é um endereço do datacenter e se não instalou antes um certificado
            if ((-not $caminhoservidor_ok) -and ($url_edeia -match "edeia.com") -and (-not $flag_instaladoCertificado))
            {
                # 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"
                    }
                }
                # Depois de importar o certificado do DataCenter, testar novamente o endereço do e-Deia
                $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"
            }

            #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 dependendo da versão do sistema operativo
            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"           
                    }                    
                    # deploy Crystal Reports
                    Write-Verbose "Fase 3 - Crystal Re :Instalar $DirDestino\$f"
                    Start-Process "$DirDestino\$f" /qn -Wait -Verbose
                    if ($f -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
            # se atalho existe não cria

            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")
            }

            #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 "Terminado Tempo Total: $((Get-Date).Subtract($start_timeT).Hours) horas, $((Get-Date).Subtract($start_timeT).Minutes) minutos $((Get-Date).Subtract($start_timeT).Seconds) segundos" 
    }
}

#

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
#>

}