Как мне выполнить логический If..then в powershell для данных JSON? - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь пройтись по массиву JSON желаемых значений реестра, а затем проверить правильность установки значения реестра.

У меня проблема в том, что я неправильно определяю логический тест if .. () в моем цикле. Код проблемы находится в строке: if($protocols[$i][$tempdisabledKVString] -eq "true")

У меня есть следующий объект:

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

Что не соответствует приведенному ниже вложенному выражению if (нежелательное поведение)

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

, который производит следующий вывод

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]

Как мне отредактировать оператор IF, чтобы я мог проверить истинное / ложное состояние $protocols[$i][$tempdisabledKVString]?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Ваша проблема, скорее всего, в том, что JSON не анализируется. Попробуйте включить цитаты вокруг ваших значений. т.е. заменить: "Server-Enabled": True, на "Server-Enabled": "True",.

Кроме того, если $tempdisabledKVString - это имя свойства, вам нужно обращаться к нему как к свойству, а не как к индексу. то есть заменить $protocols[$i][$tempdisabledKVString] на $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 {
    ":("
}

Теоретически эти проблемы должны были вызвать исключения. По какой-то причине вы их не видите, или это побудило бы вас найти причину. Пожалуйста, проверьте значение $ErrorActionPreference; по умолчанию он должен быть установлен на Continue; но, похоже, он был обновлен до SilentlyContinue для вашего сеанса. Это нормально, чтобы иметь эту настройку в некоторых сценариях; но, как правило, лучше, чтобы ошибки возникали при их возникновении, чтобы вы могли видеть, что происходит не так.

0 голосов
/ 08 ноября 2018

Проблема в том, что вы пытаетесь получить доступ к свойству, как если бы оно было вложенным массивом.

Попробуйте это:

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

$protocols = $protocolsJSON  | ConvertFrom-Json

$property = "Server-Enabled"

Write-Host "RESULT: $($protocols[0].$property)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...