Проверка Powershell BitLocker

Привет, у меня есть трудности, чтобы заставить мой сценарий работать: он продолжает давать сбой при первом выводе записи, даже когда версия powershell выше, чем 4, Работает только когда убираю And $winver -eq $os1 -or $os2 -or $os3,

В противном случае он продолжает говорить мне, что мою версию PowerShell необходимо обновить. Я нахожусь на V5 в настоящее время и $PSVersionTable.PSVersion.Major говорит ли это 5 в самом деле. Что я делаю неправильно?

    $winver = (Get-WmiObject -class Win32_OperatingSystem).Caption
$powershellversion = $PSVersionTable.PSVersion.Major
$os1 = "Microsoft Windows 7 Professional"
$os2 = "Microsoft Windows 10 Pro"
$os3 = "Microsoft Windows 10 Enterprise"

if($winver -ne ($os1, $os2, $os3) -contains $winver){
    Write-Host "Bitlocker not supported on $winver"
    Exit 0
}

if($powershellversion -lt 4){
    Write-Host "Upgrade Powershell Version"
    Exit 1010
}
else
{

$bitlockerkey = (Get-BitLockerVolume -MountPoint C).KeyProtector.RecoveryPassword
$pcsystemtype = (Get-WmiObject -Class Win32_ComputerSystem).PCSystemType
if ($pcsystemtype -eq "2"){
$setsystemtype = "Laptop"
}
else {
$setsystemtype = "Desktop"
}

if ($setsystemtype -eq "laptop" -And $bitlockerkey -eq $null  -and ($os1, $os2, $os3) -contains $winver){
Write-Host "$setsystemtype without bitlocker"
Exit 1010
}

if ($setsystemtype -eq "desktop" -And $bitlockerkey -eq $null  -and ($os1, $os2, $os3) -contains $winver){
Write-Host "$setsystemtype without bitlocker"
Exit 0
}

if ($winver -eq ($os1, $os2, $os3) -contains $winver){
Write-Host "$bitlockerkey"
Exit 0
}
}

1 ответ

Решение

Давайте посмотрим, что это на самом деле делает:

if ($powershellversion -lt 4 -And $winver -eq $os1 -or $os2 -or $os3) { ... }
  • Если ваша версия powershell меньше 4, а версия Win равна os1, тогда продолжайте
  • Если os2 имеет значение, тогда продолжайте
  • Если у os3 есть значение, тогда продолжайте

Тема здесь - " Приоритет оператора", в частности, что происходит первым при оценке строки кода, что происходит вторым, третьим и так далее. Как и в математике алгебры, добавление слов вокруг части формулы меняет порядок, в котором вы ее читаете.

Таким образом, вы можете возиться с паренами, чтобы заставить вашу логику работать:

if($powershellversion -lt 4 -and ( ($winver -eq $os1) -or ($winver -eq $os2) -or ($winver -eq $os3) ))

Другими словами

  • оценить, если версия PS <4 ($powershellversion -lt 4), -and
  • оцените, является ли winver os1, os2 или os3: ( ($winver -eq $os1) -or ($winver -eq $os2) -or ($winver -eq $os3) ),

Или вы можете немного изменить свою логику, поместив переменные os в массив и посмотрев, $winver находится там:

if($powershellversion -lt 4 -and $winver -in ($os1, $os2, $os3)) { ... }

Редактор

if($powershellversion -lt 4 -and ($os1, $os2, $os3) -contains $winver) { ... }

для обратной совместимости с v2.0.

Другие вопросы по тегам