Изменить заголовки Active Directory для всех пользователей CSV - PullRequest
0 голосов
/ 15 марта 2020

Я хотел бы изменить 150 сотрудников на должность.

У меня есть csvfile с именем Titletest.csv со столбцами UserPrincipalName [user.name под ним] и Title [должность под ним ]

Сценарий PowerShell:

Import-Module ActiveDirectory  

$users = Import-Csv -Path c:\scripts\Titlestest.csv | Foreach-Object {

$user = $_.user

$title = $_.title

#Selects the specified user and sets Job Title

Get-ADUser -Filter {(UserPrincipalName -eq $user)} | Set-ADUser -Title $title

}

Я получаю сообщения об ошибках:

Get-ADUser: переменная: 'user' найдена в выражении: $ user is не определено.
В строке: 14 символов: 1
+ Get-ADUser -Filter {(UserPrincipalName -eq $ user)} | Set-ADUser -Titl ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~
+ CategoryInfo: InvalidArgument: (:) [Get-ADUser], ArgumentException
+ FullyQualifiedErrorId: ActiveDirectoryCmdlet: System.ArgumentException, Microsoft.ActiveDirectory.Management.Commands. GetADUser

Может кто-нибудь посоветовать, пожалуйста?

Спасибо.

1 Ответ

1 голос
/ 15 марта 2020

Причина вашей ошибки в том, что $user не имеет назначения. Вы пытаетесь присвоить $user значение свойства, которое не существует. Заголовок user, очевидно, не существует в вашем файле CSV. Ниже описано, как преобразовать CSV в объекты PowerShell и получить доступ к их свойствам.

# Sample CSV TitleTest.csv
UserPrincipalName,Title
covid19@domain.com,Usurper
jsmith@domain.com,CEO
bossman@domain.com,CFO

Import-Csv -Path c:\scripts\TitleTest.csv | Foreach-Object {
    $user = $_.UserPrincipalName
    $title = $_.Title
    Get-ADUser -Filter 'UserPrincipalName -eq $user' | Set-ADUser -Title $title
}

Объяснение:

При использовании Import-Csv в соответствующем CSV-файле, первая строка данных с разделителями будет преобразована в свойства всех входных объектов. Все последующие строки будут преобразованы в отдельные объекты со свойствами заголовка и выведены в виде коллекции (массива) этих объектов. Если используется параметр -Header, то значения, переданные в параметр, станут свойствами объектов. Важно иметь одинаковое количество элементов с разделителями в каждой строке, чтобы обеспечить правильное сопоставление.

Когда вы имеете дело с объектами, вы можете получить доступ к значениям их свойств с помощью оператора доступа к элементу .. Синтаксис object.property. Так как у вас есть заголовки UserPrincipalName и Title, вам нужно будет использовать $_.UserPrincipalName и $_.Title для доступа к связанным значениям.

$_ - текущий объект конвейера в вашем Foreach-Object {} блок сценария.

Обратите внимание, что вам технически не нужно определять $user и $title здесь. Вы можете просто получить доступ к свойствам непосредственно из текущего объекта:

Import-Csv -Path c:\scripts\TitleTest.csv | Foreach-Object {
    Get-ADUser -Filter "UserPrincipalName -eq '$($_.UserPrincipalName)'" |
        Set-ADUser -Title $_.Title
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...