Во-первых, вы говорите, что хотите сообщать только о пользователях, которые без какого-либо из указанных ниже атрибутов . В этом случае ваш фильтр неправильный и должен выглядеть примерно так:
$filter = "(Enabled -eq 'true') -and (mail -notlike '*') -and (company -notlike '*') -and "
$filter += "(l -notlike '*') -and (physicalDeliveryOfficeName -notlike '*') -and "
$filter += "(title -notlike '*') -and (telephoneNumber -notlike '*') -and (mobile -notlike '*')"
Я разбил это на несколько строк, чтобы сделать его более читабельным
Тогдаесть способ, которым вы создаете $excludeOUs
, который добавляет запятую после каждого DN OU.
Я бы предложил просто объявить это как строковый массив следующим образом:
$excludeOUs = 'OU=Disabled Users,DC=GlobalCorp,DC=com',
'OU=GlobalCorp Testing,DC=GlobalCorp,DC=com',
'OU=Admin Accounts,OU=GlobalCorp Global,DC=GlobalCorp,DC=com',
'OU=Service Accounts,OU=GlobalCorp Global,DC=GlobalCorp,DC=com',
'OU=Shared Mailboxes,OU=GlobalCorp Global,DC=GlobalCorp,DC=com'
и для целей тестирования позже, объедините их, чтобы создать регулярное выражение:
# create a regular expression string combining the OUs with the 'OR' pipe symbol and wrap that
# inside a non-capturing group. The $ means the match should end in any of the 'OR'-ed ou DNs
$reExcludeOUs = '(?:{0})$' -f ($excludeOUs -join '|')
Вооружившись этим, вы можете сделать
$properties = 'EmailAddress', 'Office', 'Company', 'DisplayName', 'Title', 'SamAccountName', 'DistinguishedName',
'CanonicalName', 'LastLogonDate', 'MobilePhone', 'OfficePhone','City','Created'
$domainDN = (Get-ADDomain).DistinguishedName
$report = Get-ADUser -Filter $filter -Properties $properties -SearchBase $domainDN |
Where-Object {
($_.DisplayName -notmatch 'Admin|Calendar|Room') -and
($_.SamAccountName -notmatch '^(SM_|HealthMailbox)|SVC|Test|admin|\$') -and
($_.DistinguishedName -notmatch $reExcludeOUs)
} |
Select-Object -Property DisplayName, Company, Title, OfficePhone, MobilePhone,
Office, SamAccountName, EmailAddress, City,
@{n = "OU"; e = { $_.CanonicalName.Remove($_.CanonicalName.LastIndexOf($_.Name) - 1) } },
@{n = 'CN'; e = { Split-Path $_.CanonicalName -Parent } },
@{n = 'ParentContainer'; e = { $_.DistinguishedName -replace '^CN=.*?(?=CN|OU)' } },
LastLogonDate, Created
После этого переменная $report
должна содержать всю информацию, необходимую для сохранения. как CSV, ConvertToHTML и т. д.
Внутри Where-Object{}
вы можете использовать совпадения с регулярными выражениями (-notmatch
в данном случае), поэтому одно регулярное выражение может сэкономить вам множество предложений -notlike
здесь.
PS для командлетов, таких как Send-MailMessage
с большим количеством параметров, я бы посоветовал использовать Splatting для обеспечения читабельности кода.
Надеюсь, это поможет