Ran Dom
Ran Dom

Reputation: 355

How do I perform a logical If..then in powershell against JSON data?

I'm trying to loop through a JSON array of desired registry values, and then inspect the registry value for the correct setting.

The issue I have is that I'm not correctly defining the 'if..()' logic test in my loop. The problem code is located in the line: if($protocols[$i][$tempdisabledKVString] -eq "true")

I have the following object:

$protocolsJSON = @"
[  
   {
    "Name": "TLS 1.2",
    "Server-Enabled": True,
    "Client-Enabled": True
   }
] 
"@
$protocols = $protocolsJSON  | ConvertFrom-Json

Which fails the nested if statement below (undesired behavior)

elseif ($isDefaultDisabled -eq 0) # Protocol is manually enabled in registry (part 1.A)
{
    if($protocols[$i][$tempdisabledKVString] -eq "True")  # Protocol should be manually enabled in registry (part 1.B)
    {
        # For TLS 1.2 to be enabled and negotiated on servers that run Windows Server 2008 R2,
        # you MUST create the DisabledByDefault entry in the appropriate subkey (Client, Server) 
        # and set it to "0". The entry will not be seen in the registry and it is set to "1" by default.
        $errorString = "Warning: Protocol is only partially enabled."
        $TLSProtocolResult.Errors = $errorString
    }
    else
    {
        write-host "DEBUG " $protocols[$i][$tempdisabledKVString]
        write-host "DEBUG " $protocols[$i] 
        write-host "DEBUG " [$tempdisabledKVString]
        $errorString = "Error: Protocol should be disabled."
        $TLSProtocolResult.Errors = $errorString
    }         
}

Which produces the following output

DEBUG
DEBUG  @{Name=TLS 1.2; Server-Enabled=True; Client-Enabled=True}
DEBUG  [Server-Disabled]
DEBUG
DEBUG  @{Name=TLS 1.2; Server-Enabled=True; Client-Enabled=True}
DEBUG  [Client-Disabled]

How do I edit the IF statement so that I can test the true/false status of $protocols[$i][$tempdisabledKVString]?

Upvotes: 0

Views: 638

Answers (2)

JohnLBevan
JohnLBevan

Reputation: 24430

Your issue is most likely the JSON not being parsed. Try including quotes around your values. i.e. replace: "Server-Enabled": True, with "Server-Enabled": "True",.

Also, when if $tempdisabledKVString is the name of a property, you need to access it as a property rather than an index. i.e. replace $protocols[$i][$tempdisabledKVString] with $protocols[$i]."$tempdisabledKVString".

Clear-Host
$protocolsJSON = @"
[  
   {
    "Name": "TLS 1.2",
    "Server-Enabled": "True",
    "Client-Enabled": "True"
   }
] 
"@
$protocols = $protocolsJSON  | ConvertFrom-Json
$i = 0
$tempdisabledKVString = 'Server-Enabled'
if ($protocols[$i]."$tempdisabledKVString" -eq 'True') {
    ":)"
} else {
    ":("
}

In theory these issues should have caused exceptions to be thrown. For some reason you're not seeing those, or that would have prompted you to find the cause. Please check the value of $ErrorActionPreference; by default it should be set to Continue; but it looks like it may have been updated to SilentlyContinue for your session. It's OK to have this setting in some scenarios; but generally better to have errors be thrown when they occur so that you can see what's going wrong.

Upvotes: 0

gvee
gvee

Reputation: 17161

The problem is you're trying to access a property as if it were a nested array.

Try this:

$protocolsJSON = @"
[  
   {
    "Name": "TLS 1.2",
    "Server-Enabled": true,
    "Client-Enabled": true
   }
] 
"@

$protocols = $protocolsJSON  | ConvertFrom-Json

$property = "Server-Enabled"

Write-Host "RESULT: $($protocols[0].$property)"

Upvotes: 2

Related Questions