Недавно передо мной была поставлена следующая задача:
В связи с вводом в строй нового файлового сервера часть профилей пользователей было перенесено на новый сервер. Список этих профилей был передан мне в экселевском файле. Необходимо было указать в настройках пользователей, использующих эти профиля, пути к новому хранилищу профилей.
В принципе задача не сложная. Используя командлет Set-QADUser эта задача решается элементарно. Сложнее оказалось изменять профиля не для всех пользователей, а только для тех, чьи профили были перенесены.
Решение задачи начал с получения списка пользователей (логинов) и их профайлов:
Get-QADUser -IncludeAllProperties -SizeLimit 0 | select profilePath,sAMAccountname | Export-Csv out.csv
Итак, у меня 2 файла – in.csv (2 столбца – путь к профайлу, имя папки профайла) и out.csv (2 столбца – путь к профайлу, логин). Возникает промежуточная задача – получить логины тех пользователей, чьи профили были перенесены, сравнивая первый файл со вторым:
$csv1 = import-csv f:in.csv $csv2 = import-csv f:out.csv for ($i = 0; $i -lt $csv1.length; $i++){ for ($j = 0; $j -lt $csv2.length; $j++){ if ($csv2[$j].column1 -like $csv1[$i].column1) { ... } } }
Дальше у меня возникла проблема с тем, что делать с этими данными. Полученные логины командлет Set-QADUser отказывался принимать в качестве -Identity. Тупик.
Тут пришла мысль – почему бы не перебирать пользователей из AD и сравнивать с путям к профилям из in.csv и эих пользователей уже передавать в Set-QADUser в случае совпадения профилей? Сказано – сделано:
Get-QADUser -IncludeAllProperties -SizeLimit 0 | ? {$_.profilePath -notlike ''} | ForEach-Object { $profilePath = $_.profilePath ; $Name = $_.Name ; Import-Csv in.csv | ForEach-Object { if ($_.oldprofilePath -like $profilePath) { $newprofilePath = 'PATH_TO_NEW_PROFILE_STORE'+$_.partOfPath ; Get-QADUser $Name | Set-QADUser -ObjectAttributes @{profilePath = $newprofilePath} }} }
Вначале я отбираю только тех пользователей, у кого непустые пути к профилям. Затем имя пользователя и его профиль я передаю во временные переменные $profilePath и $Name. Первую из них я сравниваю с теми путями, которые находятся в файле in.csv (колонка oldprofilePath), и, в случае совпадения, создаётся переменная с новым путем к профилю $newprofilePath, заново из AD вытаскивается пользователь $Name и передается в Set-QADUser.
Заработало сразу, хотя на мой взгляд, скрипт несколько корявый. Непонятно почему Set-QADUser не захотел сразу принимать $Name в качестве идентификатора объекта и пришлось использовать связку Get-QADUser $Name | Set-QADUser. Также немного удивило, что около 20% перенесённых профилей никто не использует, и таким образом, скрипт обработал только 80% списка путей из in.csv.
P.S. Коллега Василий Гусев с Технета подсказал, на мой взгляд, более изящное решение по сравнению двух csv-фафйлов:
Вариант 1, как объекты:
$obj1 = import-csv test1.csv $obj2 = import-csv test2.csv Compare-Object $obj1 $obj2 -Property НазваниеСтолбца -ExcludeDifferent -IncludeEqual
Вариант 2, как текст:
$txt1 = get-content test1.csv $txt2 = get-content test2.csv Compare-Object $txt1 $txt2 -Property {$_ -replace ',.+$'} -IncludeEqual -ExcludeDifferent
А вы не сталкивались с проблемой кодировки при импорте/экспорте csv?
Пример:
[PS] C:>Get-QADUser s.korotkov | Select-Object name, SamAccountName
Name SamAccountName
—- ————–
Сергей Коротков s.korotkov
[PS] C:>Get-QADUser s.korotkov | Select-Object name, SamAccountName | Export-Csv c:99test.csv
[PS] C:>Import-Csv C:99test.csv
Name SamAccountName
—- ————–
?????? ???????? s.korotkov
//—-
Ну и в файле соответственно “?????” вместо Русского 🙁
Уверен решается просто, но незнаю как.
2Сергей Коротков
Проблема известная, решение можно посмотреть здесь – http://forum.sysfaq.ru/index.php?showtopic=1645. Сам в сети не использую кириллицу, так что с проблемой этой не сталкивался.
Большое спасибо!
но непомогло. видимо тут вопрос в самом export/imputr-csv
Будем искать
маловероятно… в любом случае советую обратиться к Василию Гусеву – его блог здесь – http://xaegr.wordpress.com/