Добавление информации из csv-файла в AD с обработкой
Доброго времени суток.
Прошу помочь в решении посредством PowerShell следующей задачи:
Есть users1s.csv - содержащий два поля - полное ФИО (name) и табельный номер (tabnum), необходимо в AD найти сотрудника с таким ФИО (при условии, что в AD вместо полного отчества есть только инициал) и добавить в поле почтового индекса табельный номер, удалив при этом запись об этом сотруднике из users1s.csv, чтобы в итоге в файле остались только необработанные сотрудники.
P.S. Обращение к AD необходимо реализовать с помощью командлетов PowerGUI.
|
Цитата:
Цитата IvanXXL
при условии, что в AD вместо полного отчества есть только инициал »
|
по каким конкретно атрибутам сравнивать?
Цитата:
Цитата IvanXXL
Обращение к AD необходимо реализовать с помощью командлетов PowerGUI. »
|
AFAIK PowerGUI использует ActiveRoles Management Shell for Active Directory
|
Цитата:
Цитата amel27
по каким конкретно атрибутам сравнивать? »
|
По фамилии, имени и инициалу отчества.
Цитата:
Цитата IvanXXL
P.S. Обращение к AD необходимо реализовать с помощью командлетов PowerGUI. »
|
Цитата:
Цитата amel27
AFAIK PowerGUI использует ActiveRoles Management Shell for Active Directory »
|
В домене присутствует только серверы с Windows Server 2003.
|
примерно так:
Код:
$file="file.csv"
$temp="temp.csv"
Get-Content $file|Out-File $temp -Encoding "Unicode"
$header = "FIO","Index"
$csv = Import-CSV $temp -header $header
$csv | Select-Object @{Name="FIO"; Expression={($_.FIO).Split(" ")}}, Index | ForEach-Object {
$index = $_.Index
$user = get-QADUser -SearchRoot 'domain.local/Users' -LastName $_.FIO[0] -FirstName $_.FIO[1] -Initials ($_.FIO[2]).Substring(0,1) -ErrorVariable errs 2>&1
$user | set-QADUser -PostalCode $index -ErrorVariable errs 2>&1
If ($errs.Count -gt 0) { Out-File $file -InputObject ($_.FIO[0]+" "+$_.FIO[1]+" "+$_.FIO[2]+","+$_.Index) -Encoding "Default" }
} | Out-Null
в 1-м блоке исходный файл перекодируется в Unicode (для Import-CSV)
во 2-м блоке полученный файл загружается в переменную $csv
ну и 3-й блок - собственно конвейер обработки
P.S. предполагается, что исходный CSV в ANSI и не содержит заголовка
|
Скрипт не работает в части внесения табельного номера в AD. После того как закоментировал строку "| Out-Null" получаю при выполнении сообщение об ошибке:
Код:
Set-QADUser : Не удается проверить аргумент для параметра "Identity". Аргумент пустой или имеет значение NULL. Укажите не п
устой аргумент, не имеющий значение NULL, после чего повторите выполнение команды.
O:\_ps\TabNumInAD.ps1:12 знак:22
+ $user | set-QADUser <<<< -PostalCode $index -ErrorVariable errs 2>&1
+ CategoryInfo : InvalidData: (:) [Set-QADUser], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Quest.ActiveRoles.ArsPowerShellSnapIn.Powershell.Cmdlets.Se
tUserCmdlet
|
Это штатная ошибка - говорит о том, что объект с заданными условиями не найден, соответственно операция установки параметра проваливается. Для конкретики нужен пример исходного CSV в несколько строк.
|
Цитата:
Цитата amel27
Это штатная ошибка - говорит о том, что объект с заданными условиями не найден, соответственно операция установки параметра проваливается. Для конкретики нужен пример исходного CSV в несколько строк. »
|
Вот пример csv-файла:
Код:
Иванов Петр Сергеевич;1234567890
Петров Сергей Иванович;0987654321
|
дык, разделителем по умолчанию является запятая, другие нужно явно указывать:
Код:
$file="file.csv"
$temp="temp.csv"
Get-Content $file|Out-File $temp -Encoding "Unicode"
$header = "FIO","Index"
$csv = Import-CSV $temp -header $header -delimiter ";"
$csv | Select-Object @{Name="FIO"; Expression={($_.FIO).Split(" ")}}, Index | ForEach-Object {
$index = $_.Index
$user = get-QADUser -SearchRoot 'domain.local/Users' -LastName $_.FIO[0] -FirstName $_.FIO[1] -Initials ($_.FIO[2]).Substring(0,1) -ErrorVariable errs 2>&1
$user | set-QADUser -PostalCode $index -ErrorVariable errs 2>&1
If ($errs.Count -gt 0) { Out-File $file -InputObject ($_.FIO[0]+" "+$_.FIO[1]+" "+$_.FIO[2]+";"+$_.Index) -Encoding "Default" }
} | Out-Null
|
Цитата:
Цитата amel27
дык, разделителем по умолчанию является запятая, другие нужно явно указывать »
|
Я - птица, долбящая дерево ;)
Скрипт работает, спасибо огромное!
|
Dead_Of_Fantasy7 |
22-07-2014 17:42 2379816 |
Вложений: 3
Очень нужна помощь! Как перезапустить службу в Power Shell на локальном компьютере, сделал только это, а дальше заплутал. Помогите, плизззззз!
|
Dead_Of_Fantasy7, используйте Restart-Service
|
Dead_Of_Fantasy7 |
23-07-2014 08:49 2380087 |
Я пробовал :
PS C:\Users\Руслан>restart-service spooler-PassThru после чего он выдал массив (т.е. параметры сравнения массива) и не дал ни каких результатов .
|
Цитата:
Цитата Dead_Of_Fantasy7
после чего он выдал массив »
|
Restart-Service:
Цитата:
Outputs
The output type is the type of the objects that the cmdlet emits.
None or System.ServiceProcess.ServiceController
When you use the PassThru parameter, Restart-Service generates a System.ServiceProcess.ServiceController object that represents the restarted service. Otherwise, this cmdlet does not generate any output.
|
т.е., как Вы и хотели своим «-PassThru».
Права есть:
Цитата:
Notes
Restart-Service can control services only when the current user has permission to do so. If a command does not work correctly, you might not have the required permissions.
|
? Зависимые службы от «spooler» есть? Наконец, покажите, что именно:
|
Время: 15:30.
© OSzone.net 2001-2025