PublicFunctions/Get-TimeZoneOnPipeline.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Function Get-TimeZoneOnPipeline
{
    <#
        .Synopsis
            Adds a TimeZone Column to an object
        .DESCRIPTION
            This typically takes an imported csv file with a ComputerName Column as an input object
            but just about any collection of objects that exposes .ComputerName should work. Alternately,
            A simple list of stings can be converted to the appropriate object with the
            Get-ServerObjectCollection cmdlet.

            The output is the same type of object as the input so that it can be piped to the next
            function to add another column. The output can also filtered and selected using Where-Object
            and Select-Object. Out-GridView also makes a very useful output.

            Uses PowerShell Remoting

            Requires Input object with Boolean Ping and PSRemote properties. Will only try to get value
            if both are true
        .EXAMPLE
            Get-ServerCollection | Test-ServerConnectionOnPipeline | Get-TimeZoneOnPipeline | ft
        .EXAMPLE
            Get-ServerCollection | Test-ServerConnectionOnPipeline | Get-TimeZoneOnPipeline | Select ComputerName,TimeZone | ft -AutoSize
        .EXAMPLE
            $env:COMPUTERNAME | Get-RCServerObjectCollection | Get-RCTimeZoneOnPipeline -NoErrorCheck

            Since it is checking the local server, there is no need to test the connection
    #>


    [CmdletBinding()]

    Param (
        [parameter(
        Mandatory=$true,
        ValueFromPipeline= $true)]
        $ComputerProperties,

        [switch]
        $NoErrorCheck
    )

    Process {
        $NoErrorCheck | Out-Null

        $ComputerProperties | Select-Object *, TimeZone | ForEach-Object {
            If ($PSItem.ComputerName -eq $Env:COMPUTERNAME)
            {
                # "Localhost!"
                $PSItem.TimeZone = (Get-ItemProperty -Path 'HKLM:\system\CurrentControlSet\control\TimeZoneInformation'`
                     -Name TimeZoneKeyName).TimeZoneKeyName
            }

            elseIf (($NoErrorCheck) -or (($PSItem.Ping) -and ($PSItem.PSRemote)))
                {
                $PSItem.TimeZone = $null

                $sb = {(Get-ItemProperty -Path 'HKLM:\system\CurrentControlSet\control\TimeZoneInformation'`
                     -Name TimeZoneKeyName).TimeZoneKeyName}
                $PSItem.TimeZone = Invoke-Command -ComputerName $PSItem.ComputerName -ScriptBlock $sb
                }
            else {$PSItem.TimeZone = 'No Try'}
            $PSItem
        }
    }
}