Импорт CSV Найдите учетную запись AD по атрибуту EmployeeID и экспортируйте в CSV

Доброе утро,

Мне нужен сценарий Powershell для импорта CSV, поиска пользователей по атрибуту EmployeeID в AD и экспорта CSV, подтверждающего, что учетная запись отключена. Мне нужно только отображаемое имя, идентификатор сотрудника и включить/отключить в экспорте.

Я все еще очень новичок в Powershell, и я обычно могу вырезать/вставлять и манипулировать существующими сценариями, чтобы делать то, что мне нужно, но я не могу заставить это работать, и теперь мой код выглядит как швейцарский сыр после того, как мыши добрались до него. Вот что у меня есть, но я не уверен, что я даже близко к тому, что нужно.

#Script Starts
$Users = Import-Csv "\folder\Test.csv"

Import-Module ActiveDirectory
$path = Split-Path -parent ".\folder\*.*"

#Create log date
$logdate = Get-Date -Format yyyy-MM-dd-THH.mm.ss
$logfile = $path + "\logs\$logdate.logfile.txt"

ForEach ($User In $Users)
{
   # Retrieve values from the csv by header name.
   $FirstName = $User.FirstName
   $LastName = $User.LastName
   $ID = $User.Employee 

   #Search AD for Attributes
   $UserSN = (Get-ADUser -LDAPFilter "(employeeID=$ID)").sAMAccountName
   $UserDN = (Get-ADUser -Identity $UserSN -Properties DisplayName).DisplayName
   $Enabled = (Get-ADUser -Identity $UserSN -Properties Enabled).Enabled
   Export-Csv -Path $logdate.ADEnabled-Disabled.csv -Append
} 
#Finish

person Strive for Awesomeness    schedule 10.08.2018    source источник


Ответы (2)


Со всеми этими комментариями и уже данным неполным ответом я боюсь, что ОП еще больше запутается...

Чтобы ОП лучше понял, я максимально придерживался его исходного кода.

Первый:

Я предполагаю, что, глядя на код, входной CSV-файл выглядит примерно так

"FirstName","LastName","Employee"
"Elvis","Presley","12345"
"Axl","Rose","987654"
"Janis","Joplin","654283"

Основная проблема, которую я здесь вижу, заключается в том, что код ищет пользователя AD, используя свойство EmployeeID (строка). При использовании фильтра как eq строка, найденная в AD, должна быть точно такой же, как в csv (хотя и без учета регистра). Если это не так, код не найдет пользователя с помощью -eq, но, возможно, сравнив то, что есть в CSV и в AD, можно использовать другой оператор, например -like. Это для ОП, чтобы выяснить.

Следующий код:

#Script Starts
$Users = Import-Csv "\folder\Test.csv"

Import-Module ActiveDirectory
$path = Split-Path -parent ".\folder\*.*"

# Create log date
$logdate = Get-Date -Format yyyy-MM-dd-THH.mm.ss
$logfile = $path + "\logs\$logdate.logfile.txt"
# while you're at it, create the full path and filename for the output csv
$outFile = Join-Path $path $($logdate + ".ADEnabled-Disabled.csv")

# create an array for the output file
# You CAN do without by letting PowerShell do the aggregating of objects for you
# but in this case I think it will make things more readable to collect ourselves.
$result = @()
ForEach ($User In $Users) {
    # Find the user by the 'Employee' field in the csv and return an object with the required properties
    # Use -LDAPFilter which requires the LDAP syntax: "(employeeID=$($User.Employee))"
    # Or use -Filter where you use the Powershell syntax
    $adUser = Get-ADUser -Filter "EmployeeID -eq $($User.Employee)" -Properties DisplayName, Enabled, EmployeeID |
              Select-Object DisplayName, Enabled, EmployeeID

    if ($adUser) {
        # if the above statement did find the user, we add this to the result array
        $result += $adUser
    }
    else {
        $msg = "User '{0} {1}' not found. Check the Employee id {2}." -f $user.FirstName, $user.LastName, $user.Employee
        Write-Warning $msg
        Add-content $logfile -Value $msg
    }
} 

# now write the output csv as a new file. Because it has a complete date and time in the name
# the chances of overwriting an existing file are very slim indeed, but we'll use -Force anyway.
$result | Export-Csv -Path $outFile -NoTypeInformation -Force
#Finish

Надеюсь это поможет

person Theo    schedule 12.08.2018
comment
Спасибо, этот код отличный, но, пожалуйста, потерпите меня, как я его понимаю. $result = @() запускает массив, который содержит данные в памяти и является предпочтительным/эффективным способом сравнения/поиска csv. ForEach ($User in $Users) - это цикл, который содержит каждую строку ($User) в csv ($Users) -Filter использует столбец Employee в csv для поиска атрибута EmployeeID и извлекает только 3 свойства, но именно оператор Select-Object помещает эти 3 свойства в переменная $adUser. Если найдено, поместите свойства в массив Else Warning message. Когда закончите, создайте CSV. - person Strive for Awesomeness; 13.08.2018
comment
Вы на месте! - person Theo; 13.08.2018
comment
Большое спасибо. Я разберусь с этим PowerShell (надеюсь, раньше, чем позже): D Я ценю помощь каждого в этом. - person Strive for Awesomeness; 13.08.2018

Чтобы Export-Csv, вам нужен какой-то ввод. В настоящее время вы ничего не экспортируете.

В идеале вы хотите создать массив всех ваших элементов и экспортировать этот массив.

$x = @()
ForEach ($User In $Users)
{
   $x += [pscustomobject]@{
     FirstName = $User.FirstName
     LastName = $User.LastName
     #etc...
   }
} 

$x | Export-Csv -Path "$logdate.ADEnabled-Disabled.csv"

У вас есть ряд мелких проблем, но я думаю, что это заставит вас работать над достижением реальных результатов.

person Jacob Colvin    schedule 10.08.2018
comment
Спасибо за ответ, теперь он говорит мне Get-ADUser : Фильтр поиска не может быть распознан $UserSN = ... Очевидно, моя переменная $ID пуста, я записал ее в файл журнала, и она пуста ... Что я сделал? сделать не так с этим? - person Strive for Awesomeness; 10.08.2018
comment
Я исправил пустую переменную $ID, но все еще получаю ошибку, что поисковый фильтр не может быть распознан. Любая помощь приветствуется. - person Strive for Awesomeness; 10.08.2018
comment
Я бы распечатал $User | ConvertTo-JSON -Depth 10 и убедился, что вы используете правильное имя/структуру свойства. - person Jacob Colvin; 10.08.2018
comment
Не уверен, по какой причине вы используете -LDAPFilter вместо -Filter? - person Jacob Colvin; 10.08.2018
comment
Я использую -LDAPFilter, потому что сценарий, из которого я скопировал эту строку, сделал это, -Filter тоже не работает, я получаю сообщение «Оператор не поддерживается», когда меняю его на $UserSN = (Get-ADUser -Filter (employeeID=$ID)). sAMAccountName - person Strive for Awesomeness; 10.08.2018
comment
-Фильтр имеет другой синтаксис. -Filter "employeeID -eq `"$ID`"" или -Filter "employeeID -like `"*$ID*`"" правильно iirc. - person Jacob Colvin; 10.08.2018
comment
Просьба избегать расширенных дискуссий в комментариях. Вы хотите переместить это в чат? У тебя есть время поболтать со мной об этом? - person Strive for Awesomeness; 10.08.2018
comment
Я пытался работать с приведенной ниже строкой, чтобы получить отображаемое имя, но не могу понять. Я продолжаю получать сообщение об ошибке Фильтр поиска не может быть распознан. $UserDN = (Get-ADUser -Filter employeeID -eq "$ID) - person Strive for Awesomeness; 10.08.2018
comment
Похоже, одно из ваших полей равно $null. Я думаю, вы также можете попробовать добавить результаты этого $PSVersionTable;get-module -all | ?{$_.name -eq 'Microsoft.ActiveDirectory.Management'} | select name,version к своему вопросу, возможно, вы используете старую версию или что-то в этом роде, если вы уверены, что оба этих поля совпадают. - person Jacob Colvin; 10.08.2018
comment
Хорошие моменты, но $logdate.ADEnabled-Disabled.csv без включения "..." разбивает вызов Export-Csv. Кроме того, намного эффективнее просто собрать все выходные данные инструкции foreach в $x (вместо того, чтобы постепенно добавлять в массив, который воссоздает его на каждой итерации), аналогично следующему примеру: $x = foreach ($num in 1..3) { $num * 2 }. Чтобы не хранить всю коллекцию в памяти, используйте Import-Csv | ForEach-Object ... | Export-Csv. - person mklement0; 10.08.2018
comment
Я понял, что отображаемое имя подтягивается как $Null, поэтому я заменил его на GivenName и SurName, я все еще не мог заставить работать Export-CSV, но я смог заставить работать команду Out-File, поэтому я просто сделал это таким образом. . Я могу использовать Excel, чтобы сделать его CSV. В моем файле импорта есть несколько строк, которых нет в AD, поэтому я сделал оператор IF, чтобы разделить их. Я буду продолжать практиковаться и, надеюсь, смогу понять, как правильно собрать весь вывод оператора foreach в $x. - person Strive for Awesomeness; 10.08.2018
comment
Проверьте мое редактирование и комментарий @mklement0. Export-csv, вероятно, не работает, потому что у вас нет кавычек для определения $var.x как $var+string, а не $var+property. - person Jacob Colvin; 10.08.2018
comment
Я недостаточно далеко продвинулся в сценарии, когда выполняю $result = @() ForEach ($User In $Users) { $result += [pscustomobject]@{ Он перестает читать данные из моего файла import-csv. Итак, я получаю Фильтр поиска не может быть распознан, но когда я его комментирую, он снова работает. Я уверен, что это то, что я делаю с синтаксисом, играя с ним. Завтра еще посмотрю, спасибо за все. - person Strive for Awesomeness; 10.08.2018
comment
нулевая строка в файле csv? - person Jacob Colvin; 10.08.2018