Проблема здесь в том, что для каждого отдельного пользователя вы добавляете его группы в FullList.txt.Таким образом, с каждым человеком, которого вы проверяете, также и против групп всех предыдущих людей.
Первая настройка, которую я сделаю, - это сохранить выходные данные net user в переменную, чтобы вам не пришлось ее запускатьнесколько раз, используя $Query = cmd /c net user 'asdf' /domain 2
> &1
.
Далее, мы проверим, нашел ли он действительного пользователя в операторе if:
if ( $Query | Select-String 'The user name could not be found.') {
"$_ is not a valid user" | Out-File -FilePath D:\Scripts\VPNGroup\ADGroups.txt -Append
}
в противном случае, еслиэто действительный пользователь, тогда мы можем продолжить работу с остальным сценарием и извлечь имя и группы.Я взял на себя смелость упростить часть кода и использовать регулярные выражения для захвата имени.
$Query | Where-Object { $_ -match 'Full\sName\s+(\w+\s\w+)' }
$name = $Matches[1]
$groups = $Query | select-string '\*' | Out-String |
ForEach-Object { $_.Substring(29).Trim() -split '\*' -split "`r`n" } |
Where-Object { -Not [String]::IsNullOrWhiteSpace($_) }
Я удалил шаг, на котором он выводится в файл, который затем снова читается сценарием, казался излишним,Но, наконец, мы проверяем, что одна из групп соответствует строке VPN:
foreach ($group in $groups) {
if ($group -like 'VPN-GRP*') { $name + $group | Out-File 'D:\Scripts\VPNGroup\ADGroups.txt' -Append }
И это должно быть сделано.Дайте мне знать, если я что-то напутал или все еще не работает.Вот как это выглядит все вместе:
Get-Content D:\Scripts\VPNGroup\List1.txt | Foreach-Object {
$Query = cmd /c net user $_ /domain 2`>`&1
if ( $Query | Select-String 'The user name could not be found.') {
"$_ is not a valid user" | Out-File -FilePath D:\Scripts\VPNGroup\ADGroups.txt -Append
}
else {
$Query | Where-Object { $_ -match 'Full\sName\s+(\w+\s\w+)' }
$name = $Matches[1]
$groups = $Query | select-string '\*' | Out-String |
ForEach-Object { $_.Substring(29).Trim() -split '\*' -split "`r`n" } |
Where-Object { -Not [String]::IsNullOrWhiteSpace($_) }
foreach ($group in $groups) {
if ($group -like 'VPN-GRP*') { $name + $group | Out-File 'D:\Scripts\VPNGroup\ADGroups.txt' -Append }
}
}
}