Смешайте найденные значения и сообщение об ошибке в CSV - Get-ADUser search - PullRequest
0 голосов
/ 27 февраля 2019

Я хотел бы взять csv адресов электронной почты и найти пользователей, которые соответствуют этим адресам.Выходными данными должны быть либо сведения о найденном пользователе, либо, если соответствующему пользователю не найдена строка, в которой указывается искомый адрес электронной почты, а затем «Не найдено»

$base_path = "C:\scripts\validate_users\"
$source_file = "input_emails.csv"
$out_file = "results.csv"

#read the file, look them up
$users = Import-csv -Path ($base_path + $source_file) -delimiter ";" | ForEach {

    try {
        Get-ADUser -Filter "EmailAddress -eq '$($_.email)'" -Properties EmailAddress
        }
    catch { 
        "No user for" + '$_.email' 
        }
    }

# Output the resultant collection to a csv file
$users | Export-csv -Path ($base_path + $out_file)

, что дает мне все найденные записи, и нетсообщения об ошибках.

Я бы не хотел превращать $ users в массив и добавлять туда значения.Есть ли способ добавить in-line "teredforuser@fakedomain.com NOT FOUND "в соответствии с результатами, которые я получаю сейчас.

Ввод по линиям

joesmith@ourdomain.com
janejones@ourdomain.com
freddielee@ourdomain.com
guywhoquit@ourdomain.com <== won't find this one
realuser@ourdomain.com

Прямо сейчасвывод - это просто результаты для четырех найденных пользователей без указания того, что "guywhoquit@ourdomain.com" когда-либо был в исходном списке

Извините, если это новый вопрос.Я ps newb, но я искал совсем немного, и мне не хватает, если на аналогичный вопрос уже был дан ответ.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Поскольку вы используете Get-AdUser с параметром -Filter , он просто вернет $null, если не найдено ни одного подходящего пользователя (при условии аргумента -Filterправильно сформирован) - он не сообщит об ошибке .

Следовательно, проверьте вывод Get-ADUser чтобы увидеть, если пользователь был найден.Общий параметр -ov (-OutVariable) позволяет записывать выходные данные командлета в переменную (независимо от поведения вывода), которую вы можете проверить позже:

$base_path = "C:\scripts\validate_users"
$source_file = "input_emails.csv"
$out_file = "results.csv"

Import-csv -Path (Join-Path $base_path $source_file) -delimiter ";" | ForEach {

  # Get and output the user for the email address at hand;
  # also store the output in variable $user, via `-ov user`    
  Get-ADUser -Filter "EmailAddress -eq '$($_.email)'" -Properties EmailAddress -ov user

  if ($user.Count -eq 0) { # User not found?
    # Emit a dummy object with an .EmailAddress property
    # whose value indicates that the user wasn't found.
    # This will show up in the CSV file as a row with all columns
    # except the "EmailAddress" one empty.
    [pscustomobject] @{ EmailAddress = "No user for $($_.email)" }
  }

} | Export-csv -Path (Join-Path $base_path $out_file)

Примечание. Причина, по которой просто не будет выдано string "No user for" + '$_.email' в выходной поток, заключается в том, что Export-Csv блокирует столбцы , которые выводит на основе 1-говходной объект .

Экземпляр [string] не имеет общих свойств с объектом пользователей AD, поэтому вы получите строку CSV без значений .

При создании фиктивного пользовательского объекта со свойством .EmailAddress ([pscustomobject] @{ EmailAddress = "..." }) это значение свойства будет отображаться в файле (хотя все остальные значения столбца будут пустыми).

0 голосов
/ 27 февраля 2019

Ваша проблема здесь в том, что Powershell только перехватывает «Завершающие исключения», чтобы решить эту проблему, вы можете попробовать одну из следующих 2 модификаций:

Get-ADUser -Filter "EmailAddress -eq '$($_.email)'" -Properties EmailAddress -ErrorAction Stop #This will only affect this cmdlet.

или

$ErrorActionPreference = 'Stop' #This affects every cmdlet execution you have after this line.
...