PSUtilities.psm1

Function Update-LocalModules {
  <#
.DESCRIPTION
   This Function updates local PowerShell modules with the last version online
   and deletes all the older local versions
   It registers all the activity in .\UpdateModules.log
.PARAMETER RemoveOld
   This switch parameter removes the outdated local modules from disk
.PARAMETER Scope
   Changes the Scope to the current user
 
#>

  [CmdletBinding(DefaultParameterSetName = 'Admin')]
  Param (
    [Parameter(ParameterSetName = 'Admin')]
    [switch]$RemoveOld,
    [Parameter(ParameterSetName = 'User')]
    [ValidateSet("CurrentUser")]
    [string]$Scope
  )

  #Checks Internet Conectivity
  if (-not(
      [Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]'{DCB00C01-570F-4A9B-8D69-199FDBA5723B}')).IsConnectedToInternet
    )) { Throw "The machine needs to be connected to the internet" }

  #Checks Administrative privileges
  $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
  if (-not($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) -and ($PSCmdlet.ParameterSetName -eq 'Admin')) {
    Write-Warning "You don't have administrative privileges. Run powershell.exe as an administrator, or run it into the scope of the current user:
    (-Remove parameter won't be available)
     
    `tUpdate-LocalModules -Scope CurrentUser"
 ; return
  }


  $Startscript = Get-Date
  Start-Transcript -Path .\UpdateModules$("{0:yyMMddHHmm}"-f (get-date)).log -Force

  if ($PSCmdlet.ParameterSetName -eq 'user') { Write-Host "Running in the user context..." -ForeGroundColor Yellow }
  Write-Host "Checking online modules..."
  $OnlineModules = Find-Module
  $CurrentFreespace = [math]::Round( (Get-Ciminstance -ClassName win32_logicaldisk | Where DeviceId -eq "C:").FreeSpace / 1mb, 2)

  #Gets current latest module version installed
  Write-Host "Looking for Installed Modules..." -Foregroundcolor Green
  $Latest = Get-InstalledModule 

  foreach ($module in $Latest) {
 
    #Local module is also online, shows the two versions
    if ($module.name -in ($OnlineModules).name) {
      $OnlineModule = $OnlineModules | where name -EQ $module.name
      Write-Host "`nOnline module: " -ForegroundColor Green -NoNewline
      Write-Host "$(($OnlineModule).Version) $($OnlineModule.name)" -ForegroundColor Green -NoNewline
      Write-Host " (Published on $("{0:dd/MM/yyyy}" -f $OnlineModule.PublishedDate) - $(((Get-Date) - $OnlineModule.PublishedDate).Days) Days ago)" -ForegroundColor Gray
      Write-Host "Local Module: " -ForegroundColor Gray -NoNewline
      write-host "$(($module).Version) $($module.name)" -ForegroundColor Gray -NoNewline
     
      if ([version]$module.Version -lt [version]$OnlineModule.Version) {
        Write-Host "`nLocal version outdated, installing new online version... " -ForegroundColor Yellow -NoNewline
        Write-Host "$(($OnlineModule).Version) $($OnlineModule.name)" -ForegroundColor Green

        if ($PSCmdlet.ParameterSetName -eq 'user') {
          $Parameters = @{Scope = ($PSBoundParameters["Scope"]) }
          Install-Module -Name $OnlineModule.name -Force -AllowClobber @Parameters
        }

        else { Install-Module -Name $OnlineModule.name -Force -AllowClobber }
        $module.version = $OnlineModule.Version
      }
      else { Write-Host " Ok" -ForegroundColor White }

    }
    #Removes the older versions if parameter -RemoveOld has been specified
    if ($RemoveOld) { 
      $Oldlocalmodules = Get-InstalledModule $module.Name -AllVersions | Where-Object { $_.Version -ne $module.Version }
      if ($Oldlocalmodules -ne $null) 
      { Write-Host "Old modules found. Unninstalling older modules..." -ForegroundColor Gray; $Oldlocalmodules | Uninstall-Module -Force -Verbose }
    }

  }

  if ($RemoveOld) {
    $CleanedFreespace = [math]::Round( (Get-Ciminstance -ClassName win32_logicaldisk | Where DeviceId -eq "C:").FreeSpace / 1mb, 2)
    $Freedspace = $CleanedFreespace - $CurrentFreespace
    Write-Host "`nFreed Space in C: $([math]::round($Freedspace,2)) MB" -ForegroundColor Green
    Write-Host "Current Space in C: $([math]::round($CleanedFreespace,2)) MB" -ForegroundColor Green
  }
  Write-Host "Time elapsed: $(((Get-Date) - $Startscript).Minutes) Minute(s)" -ForegroundColor Green
  Stop-Transcript
}
Function Create-RDGFilefromActiveAZSubscription {
  <#
.DESCRIPTION
   This function creates a RDG file in the local folder Than contains all the VMs in the current Azure Subscription
   grouped by ResorceGroup.
   This file can be oppened with Remote Desktop Connection Manager 2.7
   https://www.microsoft.com/en-us/download/details.aspx?id=44989
 
.PARAMETER RDGFilePath
   FilePath for the destination RDG file
.EXAMPLE
   This creates a RDG file in custom path:
   Create-RDGFilefromActiveAZSubscription -RDGFilePath C:\temp\test.rdg
#>

  Param([string]$RDGFilePath
  )

  if ((Get-AzContext).Subscription.Name) {
    Write-Host "Current Azure context:$(Get-AzContext | Out-String)" -ForegroundColor Yellow
  }
  else {
    Write-Host "No Azure context found, use 'Login-AzAccount' to connect or 'Select-AzSubscription' to select a Subscription" -ForegroundColor Red;
    break
  }


  Write-Host "Getting info from network interfaces..." -ForegroundColor Cyan
  $VMNetworkInterfaces = (Get-AzResourceGroup).ResourceGroupName | ForEach-Object -Process {
    Write-Host "Reading from ResourceGroup ... $_" -ForegroundColor Green
    Get-AzNetworkInterface -ResourceGroupName $_ | Where-Object -Property VirtualMachine -NE $null
  }
  Write-Host "Done." -ForegroundColor Green

  #Array of VMNetworkInterface information that contains Resource Group Name, PublicIPid, VMNetworkInterfaceid and VMid
  $VMNetworkInterfacedata = $VMNetworkInterfaces | Select-Object -Property `
  @{N = "ResourceGroupName"; E = { $_.ResourceGroupName } }, `
  @{N = "PublicIPid"; E = { $_.IpConfigurations.Publicipaddress.Id } }, `
  @{N = "LoadBalancerRule"; E = { $_.IpConfigurations.LoadBalancerBackendAddressPools.Id } }, `
  @{N = "VMNetworkInterfaceid"; E = { $_.id } }, @{N = "VMid"; E = { ($_.VirtualMachineText | ConvertFrom-Json).id } }

  Write-Host "Getting info from Public IPS..." -ForegroundColor Cyan
  $PublicIPs = Get-AzPublicIpAddress | Select-Object -Property @{Name = "PublicIPname"; Expression = { ($_[0].DnsSettingsText | ConvertFrom-Json).fqdn } }, @{Name = "PublicIPAdress"; Expression = { $_.IpAddress } }, @{Name = "PublicIPid"; Expression = { $_.id } }, @{Name = "Associatedto"; Expression = { ($_.IpConfigurationText | ConvertFrom-Json).id } }

  $PublicIPshash = $PublicIPs | Group-Object -Property PublicIPid -AsHashTable -AsString # hashtable with PublicIPid, PublicIPAdress and PublicIPName
  Write-Host "Done." -ForegroundColor Green

  # Wraping it all..
  Write-Host "Getting info from VMs..." -ForegroundColor Cyan

  $VMNetworkInterfacedata | Where-Object { $_.LoadBalancerRule } 
  $rgdata = @()
  foreach ($RGroupName in ($VMNetworkInterfacedata | Group-Object -Property ResourceGroupName)) {
    $obj = New-Object -TypeName PScustomobject
    Add-Member -InputObject $obj -MemberType NoteProperty -Name ResourceGroupName -Value $RGroupName.Name 
    $rgarray = @()

    $RGroupName.group | ForEach-Object -Process {
      $VMResource = Get-AzResource -ResourceId $_.vmid # Gets VM Azure Resource
      Write-Host "Reading VM... $($VMResource.Name) " -ForegroundColor Green -NoNewline
      if ($VMResource.Properties.storageProfile.osDisk.osType -eq "windows") {
        Write-Host "Windows:added"
        $rgarray += @{
          Computername   = $VMResource.Properties.osProfile.computerName
          adminuser      = $VMResource.Properties.osProfile.adminusername
          PublicIPAdress = $PublicIPshash["$($_.PublicIPid)"].PublicIPadress
          PublicIPName   = $PublicIPshash["$($_.PublicIPid)"].PublicIPName
        }
      }
      else { Write-Host "Linux:skipped" -ForegroundColor Red }

    }
    Add-Member -InputObject $obj -MemberType NoteProperty -Name Resources -Value $rgarray
    $rgdata += $obj
  }

  Write-Host "Done." -ForegroundColor Green

  $rgdata | Out-String



  #region RDG file Creation
  $RDGtext = ""

  #Writes Header

  $azureSubscription = (Get-AzContext).Subscription.Name
  $commonuser = "user"

  $main = @"
<?xml version="1.0" encoding="utf-8"?>
<RDCMan programVersion="2.7" schemaVersion="3">
  <file>
    <credentialsProfiles />
    <properties>
      <expanded>True</expanded>
      <name>$azureSubscription</name>
    </properties>
    <logonCredentials inherit="None">
      <profileName scope="Local">Custom</profileName>
      <userName>$commonuser</userName>
      <password />
      <domain>EUROPE</domain>
    </logonCredentials>
    <remoteDesktop inherit="None">
      <sameSizeAsClientArea>True</sameSizeAsClientArea>
      <fullScreen>False</fullScreen>
      <colorDepth>24</colorDepth>
    </remoteDesktop>
"@


  $RDGtext += $main


  #Writes Groups (one for each RG)
  foreach ($rg in $rgdata) {

    $RGroupName = $rg.ResourceGroupName


    $grupo = @"
 
    <group>
      <properties>
        <expanded>True</expanded>
        <name>$RGroupName</name>
      </properties>
"@


    $RDGtext += $grupo


    #Writes Servers for each RG
    foreach ($VM in $rg.Resources) {

      if ($VM["PublicIPName"] -ne $null) { $PublicIPAdress = $VM["PublicIPName"] }
      else { $PublicIPAdress = $VM["PublicIPAdress"] }

      $server = @"
 
      <server>
        <properties>
          <displayName>$($VM["Computername"])</displayName>
          <name>$PublicIPAdress</name>
        </properties>
"@

      $RDGtext += $server

      $logon = @"
 
        <logonCredentials inherit="None">
          <profileName scope="Local">Custom</profileName>
          <userName>$($VM["adminuser"])</userName>
          <password></password>
          <domain />
        </logonCredentials>
"@



      $RDGtext += $logon
      $endserver = @"
 
      </server>
"@

      $RDGtext += $endserver

    }


    $endgrupo = @"
 
    </group>
"@


    $RDGtext += $endgrupo

  }

  #Writes Footer

  $endmain = @"
 
  </file>
  <connected />
  <favorites />
  <recentlyUsed />
</RDCMan>
"@


  $RDGtext += $endmain


  #Outputs results to RDG file

  if ($PSBoundParameters.ContainsKey("RDGFilePath")) { $RDGtext | Out-File -FilePath $RDGFilePath -Encoding utf8; $script:drgfile = Get-Item $RDGFilePath }
  else { $RDGtext | Out-File -FilePath "$($azureSubscription).rdg" -Encoding utf8; $script:drgfile = Get-Item "$($azureSubscription).rdg" }


  Write-Host "RDG file generated:" -ForegroundColor Cyan
  Write-Host "$drgfile" -ForegroundColor White
  #endregion
  $option = "N"
  $option = Read-Host "Do you want to open it (Y/N)"
  if ($option -eq "y") { Invoke-Item $drgfile }

}

Function test {

  $ResourceGroupName = "grupode recursos"
  $containerid = (New-Guid).Guid
  $Parentid = (New-Guid).Guid

  $container = [ordered]@{
    Name                                     = $ResourceGroupName
    Id                                       = $containerid
    Parent                                   = $Parentid
    NodeType                                 = "Container"
    Description                              = ""
    Icon                                     = "mRemoteNG"
    Panel                                    = "General"
    Username                                 = ""
    Password                                 = ""
    Domain                                   = ""
    Hostname                                 = ""
    Protocol                                 = "RDP"
    PuttySession                             = "Default Settings"
    Port                                     = "3389"
    ConnectToConsole                         = 'False'
    UseCredSsp                               = "True"
    RenderingEngine                          = "IE"
    ICAEncryptionStrength                    = "EncrBasic"
    RDPAuthenticationLevel                   = "NoAuth"
    LoadBalanceInfo                          = ""
    Colors                                   = "Colors16Bit"
    Resolution                               = "FitToWindow"
    AutomaticResize                          = "True"
    DisplayWallpaper                         = 'False'
    DisplayThemes                            = 'False'
    EnableFontSmoothing                      = 'False'
    EnableDesktopComposition                 = 'False'
    CacheBitmaps                             = 'False'
    RedirectDiskDrives                       = 'False'
    RedirectPorts                            = 'False'
    RedirectPrinters                         = 'False'
    RedirectSmartCards                       = 'False'
    RedirectSound                            = "DoNotPlay"
    RedirectKeys                             = 'False'
    PreExtApp                                = ""
    PostExtApp                               = ""
    MacAddress                               = ""
    UserField                                = ""
    ExtApp                                   = ""
    VNCCompression                           = "CompNone"
    VNCEncoding                              = "EncHextile"
    VNCAuthMode                              = "AuthVNC"
    VNCProxyType                             = "ProxyNone"
    VNCProxyIP                               = ""
    VNCProxyPort                             = "0"
    VNCProxyUsername                         = ""
    VNCProxyPassword                         = ""
    VNCColors                                = "ColNormal"
    VNCSmartSizeMode                         = "SmartSAspect"
    VNCViewOnly                              = 'False'
    RDGatewayUsageMethod                     = "Never"
    RDGatewayHostname                        = ""
    RDGatewayUseConnectionCredentials        = "Yes"
    RDGatewayUsername                        = ""
    RDGatewayPassword                        = ""
    RDGatewayDomain                          = ""
    InheritCacheBitmaps                      = 'False'
    InheritColors                            = 'False'
    InheritDescription                       = 'False'
    InheritDisplayThemes                     = 'False'
    InheritDisplayWallpaper                  = 'False'
    InheritEnableFontSmoothing               = 'False'
    InheritEnableDesktopComposition          = 'False'
    InheritDomain                            = 'False'
    InheritIcon                              = 'False'
    InheritPanel                             = 'False'
    InheritPassword                          = 'False'
    InheritPort                              = 'False'
    InheritProtocol                          = 'False'
    InheritPuttySession                      = 'False'
    InheritRedirectDiskDrives                = 'False'
    InheritRedirectKeys                      = 'False'
    InheritRedirectPorts                     = 'False'
    InheritRedirectPrinters                  = 'False'
    InheritRedirectSmartCards                = 'False'
    InheritRedirectSound                     = 'False'
    InheritResolution                        = 'False'
    InheritAutomaticResize                   = 'False'
    InheritUseConsoleSession                 = 'False'
    InheritUseCredSsp                        = 'False'
    InheritRenderingEngine                   = 'False'
    InheritUsername                          = 'False'
    InheritICAEncryptionStrength             = 'False'
    InheritRDPAuthenticationLevel            = 'False'
    InheritLoadBalanceInfo                   = 'False'
    InheritPreExtApp                         = 'False'
    InheritPostExtApp                        = 'False'
    InheritMacAddress                        = 'False'
    InheritUserField                         = 'False'
    InheritExtApp                            = 'False'
    InheritVNCCompression                    = 'False'
    InheritVNCEncoding                       = 'False'
    InheritVNCAuthMode                       = 'False'
    InheritVNCProxyType                      = 'False'
    InheritVNCProxyIP                        = 'False'
    InheritVNCProxyPort                      = 'False'
    InheritVNCProxyUsername                  = 'False'
    InheritVNCProxyPassword                  = 'False'
    InheritVNCColors                         = 'False'
    InheritVNCSmartSizeMode                  = 'False'
    InheritVNCViewOnly                       = 'False'
    InheritRDGatewayUsageMethod              = 'False'
    InheritRDGatewayHostname                 = 'False'
    InheritRDGatewayUseConnectionCredentials = 'False'
    InheritRDGatewayUsername                 = 'False'
    InheritRDGatewayPassword                 = 'False'
    InheritRDGatewayDomain                   = 'False'
    InheritRDPAlertIdleTimeout               = 'False'
    InheritRDPMinutesToIdleTimeout           = 'False'
    InheritSoundQuality                      = 'False'
  }

  $serverid = (New-Guid).Guid
  $servertoconnectto = [ordered]@{
    Name                                     = "STH-LINUX01"
    Id                                       = $serverid
    Parent                                   = $containerid
    NodeType                                 = "Connection"
    Description                              = ""
    Icon                                     = "mRemoteNG"
    Panel                                    = "General"
    Username                                 = "aa-admin"
    Password                                 = ""
    Domain                                   = ""
    Hostname                                 = "104.215.182.203"
    Protocol                                 = "SSH2"
    PuttySession                             = "Default Settings"
    Port                                     = "22"
    ConnectToConsole                         = 'False'
    UseCredSsp                               = "True"
    RenderingEngine                          = "IE"
    ICAEncryptionStrength                    = "EncrBasic"
    RDPAuthenticationLevel                   = "NoAuth"
    LoadBalanceInfo                          = ""
    Colors                                   = "Colors16Bit"
    Resolution                               = "FitToWindow"
    AutomaticResize                          = "True"
    DisplayWallpaper                         = 'False'
    DisplayThemes                            = 'False'
    EnableFontSmoothing                      = 'False'
    EnableDesktopComposition                 = 'False'
    CacheBitmaps                             = 'False'
    RedirectDiskDrives                       = 'False'
    RedirectPorts                            = 'False'
    RedirectPrinters                         = 'False'
    RedirectSmartCards                       = 'False'
    RedirectSound                            = "DoNotPlay"
    RedirectKeys                             = 'False'
    PreExtApp                                = ""
    PostExtApp                               = ""
    MacAddress                               = ""
    UserField                                = ""
    ExtApp                                   = ""
    VNCCompression                           = "CompNone"
    VNCEncoding                              = "EncHextile"
    VNCAuthMode                              = "AuthVNC"
    VNCProxyType                             = "ProxyNone"
    VNCProxyIP                               = ""
    VNCProxyPort                             = "0"
    VNCProxyUsername                         = ""
    VNCProxyPassword                         = ""
    VNCColors                                = "ColNormal"
    VNCSmartSizeMode                         = "SmartSAspect"
    VNCViewOnly                              = 'False'
    RDGatewayUsageMethod                     = "Never"
    RDGatewayHostname                        = ""
    RDGatewayUseConnectionCredentials        = "Yes"
    RDGatewayUsername                        = ""
    RDGatewayPassword                        = ""
    RDGatewayDomain                          = ""
    InheritCacheBitmaps                      = 'False'
    InheritColors                            = 'False'
    InheritDescription                       = 'False'
    InheritDisplayThemes                     = 'False'
    InheritDisplayWallpaper                  = 'False'
    InheritEnableFontSmoothing               = 'False'
    InheritEnableDesktopComposition          = 'False'
    InheritDomain                            = 'False'
    InheritIcon                              = 'False'
    InheritPanel                             = 'False'
    InheritPassword                          = 'False'
    InheritPort                              = 'False'
    InheritProtocol                          = 'False'
    InheritPuttySession                      = 'False'
    InheritRedirectDiskDrives                = 'False'
    InheritRedirectKeys                      = 'False'
    InheritRedirectPorts                     = 'False'
    InheritRedirectPrinters                  = 'False'
    InheritRedirectSmartCards                = 'False'
    InheritRedirectSound                     = 'False'
    InheritResolution                        = 'False'
    InheritAutomaticResize                   = 'False'
    InheritUseConsoleSession                 = 'False'
    InheritUseCredSsp                        = 'False'
    InheritRenderingEngine                   = 'False'
    InheritUsername                          = 'False'
    InheritICAEncryptionStrength             = 'False'
    InheritRDPAuthenticationLevel            = 'False'
    InheritLoadBalanceInfo                   = 'False'
    InheritPreExtApp                         = 'False'
    InheritPostExtApp                        = 'False'
    InheritMacAddress                        = 'False'
    InheritUserField                         = 'False'
    InheritExtApp                            = 'False'
    InheritVNCCompression                    = 'False'
    InheritVNCEncoding                       = 'False'
    InheritVNCAuthMode                       = 'False'
    InheritVNCProxyType                      = 'False'
    InheritVNCProxyIP                        = 'False'
    InheritVNCProxyPort                      = 'False'
    InheritVNCProxyUsername                  = 'False'
    InheritVNCProxyPassword                  = 'False'
    InheritVNCColors                         = 'False'
    InheritVNCSmartSizeMode                  = 'False'
    InheritVNCViewOnly                       = 'False'
    InheritRDGatewayUsageMethod              = 'False'
    InheritRDGatewayHostname                 = 'False'
    InheritRDGatewayUseConnectionCredentials = 'False'
    InheritRDGatewayUsername                 = 'False'
    InheritRDGatewayPassword                 = 'False'
    InheritRDGatewayDomain                   = 'False'
    InheritRDPAlertIdleTimeout               = 'False'
    InheritRDPMinutesToIdleTimeout           = 'False'
    InheritSoundQuality                      = 'False'
  }

  $containerobject = [PSCustomobject]$container
  $serverobject = [PSCustomobject]$servertoconnectto
  $arrayservers = @()
  $arrayservers += $serverobject

  $containerobject | ConvertTo-Csv -NoTypeInformation -Delimiter ";" | ForEach-Object { $_.Replace('"', '') } | Out-File C:\tempRoche\TempRoche.csv -Append
  $arrayservers | ForEach-Object { ConvertTo-Csv -InputObject $_ -NoTypeInformation -Delimiter ";" } | ForEach-Object { $_.Replace('"', '') } | Select-Object -Skip 1 | Out-File C:\tempRoche\TempRoche.csv -Append

}


Export-ModuleMember -Function Update-LocalModules, Create-RDGFilefromActiveAZSubscription