У меня есть код ниже, который возвращает последних пользователей, которые вошли в систему через определенное количество дней.Я хочу, чтобы имена входа, которые меня не волновали, не появлялись в списке, например, когда он показывает, что "LOCAL SERVICE" или "NETWORK SERVICE" вошли в систему. Я также разработал его так, чтобы повторы были исключены.
Пытаясь выяснить, почему Powershell никогда не думал, что $Matches.AccountName
равняется "LOCAL SERVICE" или любой другой проверке, я понял, что powershell отказывался печатать что-либо после этой строки
[void]($event.Message -match 'Account Name:\s{1,}(?<AccountName>.+)')
У меня три вопроса:
- Почему PowerShell ничего не печатает в этом месте?
- Что не так с моим сравнением, которое проверяет, не совпадает ли AccountName с учетной записью типа "LOCAL SERVICE"?Он всегда оценивается как ложный, что позволяет ему быть добавленным в список
- Это немного не по теме, но есть ли название для того, что я делаю со всем этим
$result = foreach($event in $events)
?Я не совсем понимаю, как это работает или как он знает, как установить каждый индекс $result
равным
{
$computer = $env:ComputerName
if ($Days -eq $null) {
$Days = Read-Host -prompt "Enter the number of days to go back"
}
$startDate = (Get-Date) - (New-TimeSpan -Day $Days)
$events = Get-WinEvent -Computer $computer -FilterHashtable @{Logname='Security';ID=4672;StartTime=$startDate}
[System.Collections.ArrayList]$arr = @()
$result = foreach ($event in $events) {
[void]($event.Message -match 'Account Name:\s{1,}(?<AccountName>.+)')
$Matches.AccountName.gettype()
$Matches.AccountName
"SYSTEM"
$h = Read-Host -prompt "Stop here to see if anything printed"
if ((-not ($arr.Contains($Matches.AccountName))) -and ($Matches.AccountName -ne "SYSTEM") -and ($Matches.AccountName -ne "LOCAL SERVICE") -and ($Matches.AccountName -ne "NETWORK SERVICE") -and ($Matches.AccountName -ne "Local Administrator")) {
$arr.Add($Matches.AccountName) > $null;
[PSCustomObject]@{
AccountName = $Matches.AccountName;
Time = $event.timeCreated
}
}
}