считывает значение из реестра, а не жесткий код в инструкции if

#powershell #if-statement

#powershell #if-statement

Вопрос:

у меня есть строка powershell ниже. Он вернет 1, если в группе администраторов найдена учетная запись, отличная от встроенного администратора, group1, group2, group3.

 If ((Get-LocalGroupMember -Group Administrators | Where-Object {($_.ObjectClass -eq 'User' -or $_.ObjectClass -eq 'Group') -and (($_.Name -notlike "$env:computernameadministrator") -and ($_.Name -notlike 'group1')  -and ($_.Name -notlike 'group2')  -and ($_.Name -notlike 'group3') )}).Count -gt 0) {
echo 1
}else{
echo 0
}
  

как мне изменить приведенную выше инструкцию if для чтения в строковом значении (с запятыми) в реестре, чтобы мне не нужно было жестко кодировать group1, group2, group3 в инструкции if?? Спасибо

пример, который я установил в hklm:system test , с именем adm и строковым значением group1, group2, group3

я могу извлечь значение, которое я установил в реестре, используя эту строку.

 $listofadm = (Get-ItemProperty -Path "HKLM:systemtest" -ErrorAction Stop -Name adm).adm
  

Комментарии:

1. $listofadm[0] shuold предоставит вам первый элемент в этом списке.

Ответ №1:

Не уверен, почему вы проверяете пользователя или группу, если вы можете опустить это, это упростит вашу проверку. Чтобы упростить это, я бы создал шаблон регулярных выражений для всех групп, включая учетную запись computer adminsitrator. Если в группах действительно нет пробела, вы можете просто заменить запятые символом канала | .

 $listofadm = "$env:computernameadministrator|"  
    (Get-ItemProperty -Path "HKLM:systemtest" -ErrorAction Stop -Name adm).adm -replace ',','|'
  

Это заставит $listofadm содержать что-то вроде

 DESKTOP-NEKK74Jadministrator|group1|group2|group3
  

Теперь, если вы просто хотите найти любой объект, имя которого не является ни одним из этих 4

 Get-LocalGroupMember -Group Administrators | where name -NotMatch $listofadm
  

Проверки отдельных элементов в предложении Where могут не содержать { } фигурных скобок. Если вам нужно убедиться, что это объект пользователя или группы, то это будет выглядеть так.

 Get-LocalGroupMember -Group Administrators |
    Where-Object {($_.ObjectClass -eq 'User' -or $_.ObjectClass -eq 'Group') -and $_.name -NotMatch $listofadm}