Изменение путей к профилям пользователей

Недавно передо мной была поставлена следующая задача:

В связи с вводом в строй нового файлового сервера часть профилей пользователей было перенесено на новый сервер. Список этих профилей был передан мне в экселевском файле. Необходимо было указать в настройках пользователей, использующих эти профиля, пути к новому хранилищу профилей.

В принципе задача не сложная. Используя командлет 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

5 thoughts on “Изменение путей к профилям пользователей

  1. А вы не сталкивались с проблемой кодировки при импорте/экспорте 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. но непомогло. видимо тут вопрос в самом export/imputr-csv
    Будем искать

Leave a Reply

Your email address will not be published. Required fields are marked *