Хотя использование -and -not
является правильным, я бы не сказал, что это не самый элегантный подход, поскольку существуют операторы, противоположные -like
и -eq
(которые были предложены @ Paxz в настоящее время удаленные комментарии). Ваш оператор where
может быть изменен на что-то вроде:
Where-Object { ($_.AccessRights -like "*FullAccess*") -and (-not $_.IsInherited) -and ($_.User -ne "NT AUTHORITY\SELF") -and ($_.User -notlike '*Discovery Management*') }
Изменения, которые я сделал:
# from
($_.AccessRights -eq "FullAccess")
# to
($_.AccessRights -like "*FullAccess*")
чтобы включить ситуацию, когда у пользователя есть одна или несколько записей доступа в AccessRight
(хотя я не уверен, нужна ли она в реальной жизни). Ваш код будет фильтровать {FullAccess, ReadPermission}
, так как он не равен FullAccess
.
# from
($_.IsInherited -eq $false)
# to
(-not $_.IsInherited)
Почему? Более элегантно. IsInherited
- это логическое значение, которое вы можете напрямую использовать -not
.
# from
-and -not ($_.User -like "NT AUTHORITY\SELF")
# to
-and ($_.User -ne "NT AUTHORITY\SELF")
Почему? like
/ notlike
здесь не требуется, вы можете использовать -ne
напрямую.
# from
-and -not ($_.User -like '*Discovery Management*')
# to
-and ($_.User -notlike '*Discovery Management*')
аналогично приведенному выше, но я не уверен, какие значения здесь возможны, поэтому я не изменился на -ne
.
Кроме того, в вашем Select-Object
вы используете PrimarySMTPAddress
, который не будет работать, поскольку запись разрешения не имеет такого параметра. Вам придется использовать тот же подход, который вы использовали для User Name
(также я не думаю, что в этом случае необходимо .ToString()
):
@{Name="PrimarySMTPAddress";expression={(Get-Recipient $_.user).PrimarySMTPAddress}}