Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Сравнение данных в строке csv-файла с данными из строки в списке SharePoint 2010 (http://forum.oszone.net/showthread.php?t=285191)

hax0rz 17-07-2014 11:05 2377475

Сравнение данных в строке csv-файла с данными из строки в списке SharePoint 2010
 
Добрый день. Меня зовут Никита, мне 26 и я алкоголик ещё только начинаю писать на PS.

Возникла такая непростая (для меня) задачка:
1. Выгрузить список атрибутов некоторых пользователей из AD ---> *.csv
2. Подключиться с списку на SharePoint'e (Таблица, дублирующая *.csv-файл выше)
3. Построчно сравнить csv со списком. (в данном случае, уникальный идентификатор строки - атрибут EmployeeID) --> Файл csv - master, а список в SharePoint - slave.
3.1 Если в списке - нет строки, как в csv - то добавить её.
3.2 Если строка есть, проверить, все ли значения одинаковые, если нет, то записать в список как в csv.

Вот, что у меня пока получилось :sorry: :
Выгрузка в csv:
Код:

Get-ADUser -Filter {(ObjectClass -eq "user") -and (employeeID -like "*")}
-Properties employeeID, 1, 2, 3
| sort-object -property Name | Select employeeID, 1, 2, 3
| Export-Csv D:\Contacts.csv -Encoding Unicode -NoTypeInformation
C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe -version 2.0 " & ' D:\to_list.ps1 ' "

Дальше из примеров в интернете удалось состряпать только такое: (просто очистить и залить снова)
Код:

to_list.ps1
add-pssnapin microsoft.sharepoint.powershell
$web = Get-SPWeb "http://SP/test"
$list = $web.lists["Test_AD_Import_Export"]
do {$list.items.delete(0)}
until ($list.items.Count -eq 0)
Import-Csv D:\Contacts.csv | ForEach-Object {
$item = $list.items.Add()
$item["employeeID"] = $_.employeeID
$item["1"] = $_.1
$item["2"] = $_.2
$item["3"] = $_.3
$item.update()
}

Прошу хотя-бы пример кода, как сравнивать строчку со значениями.
Или у меня изначально алгоритм неверно выбран?

Заранее спасибо за любой ответ )

hax0rz 17-07-2014 15:07 2377549

Нашёл на форуме нечто похожее. Попробовал вот так :
Код:

$web = Get-SPWeb "http://SP/test"
$list = $web.lists["Test_AD_Import_Export"]
$items=$spList.Items
$Information  = Import-Csv "D:\Contacts.csv" -Delimiter ';'
ForEach ($stroka in $Information){
ForEach ($item in $items){
if ($stroka.employeeID -eq  $item["employeeID"]){
if ($item["1"] -eq $stroka.1){}
else {$item["1"] = $stroka.1}}
$item.update()}}

т.е. изменяя значение в колонке "1"в csv - должно измениться и в списке SharePoint

отрабатывает, без ошибок. В списке в строке просто поле "1" - становится пустым.

Что не так? (((

Kazun 17-07-2014 15:40 2377569

Не тестировал, т.к. нет SharePoint:

Код:

$web = Get-SPWeb "http://SP/test"
$list = $web.lists["Test_AD_Import_Export"]
$items=$spList.Items

$prop = Write-Output employeeID 1 2 3
$adusers = @{}
$index = @()
Get-ADUser -Filter {(ObjectClass -eq "user") -and (employeeID -like "*")} -Properties $prop | Foreach {
        $adusers[$_.employeeID] = $_
}

# Обновляем данные или удалим запись, если нет в AD, но есть на листе
foreach($item in $items) {
        $id = $item["employeeID"]
        $user = $adusers["$id"]
        $index += $id
        if($user) {
                $prop | Foreach {
                        if ($user."$_" -ne $item["$_"]) {
                                $item["$_"] = $user."$_"
                        }
                }
                $item.update()
        }
        else {
                $item.delete()
        }
}

# Добавляем запись на лист
Compare-Object ($adusers.GetEnumerator() | Foreach {$_.Name}) $index | Where {$_.SideIndicator -eq "<="} | Foreach {
        $user = $adusers["$($_.InputObject)"]
        $item = $list.items.Add()
        $prop | Foreach {
                        $item["$_"] = $user."$_"
        }
        $item.update()
}


Kazun 18-07-2014 10:39 2377881

Для диагностики проверить переменную до и после изменения(и засечь время):

$adusers = @{}
Get-ADUser -Filter {(ObjectClass -eq "user") -and (employeeID -like "*")} -Properties $prop | Foreach {
$adusers[$_.employeeID] = $_
}

$adusers["66666"]

И если значения меняются, будем думать дальше. Возможно репликация влияет, т.к. между сайтами, как раз минимально возможное 15 минут.

PS. По поводу книги, можно начать с - http://www.amazon.com/Learn-Windows-...5665469&sr=1-4

PSS. 1.hax0rz превысил(а) максимальный объем сохраненных персональных сообщений и не может получать новые сообщения, пока не удалит часть старых.

hax0rz 22-07-2014 10:43 2379626

Итак, получилось 2 варианта.

1. Импорт AD в csv и последующий импорт в список SP.
читать дальше »
Код:

import-module ActiveDirectory
Get-ADUser -Filter {(ObjectClass -eq "user") -and (employeeID -like "*")} -Properties employeeID, name, givenName, sn, mail, title, homePhone, pager, mobile, facsimileTelephoneNumber, physicalDeliveryOfficeName | sort-object -property Name | Select employeeID, name, givenName, sn, mail, title, homePhone, pager, mobile, facsimileTelephoneNumber, physicalDeliveryOfficeName | Export-Csv D:\Contacts.csv -Encoding Unicode -NoTypeInformation
#
#
import-module ActiveDirectory
if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.Sharepoint.Powershell"}) -eq $null) {
                                                  Add-PSSnapin Microsoft.Sharepoint.Powershell
                                                }
$web = Get-SPWeb "http://portal/site1"
$list = $web.lists["AD2SP"]
$items = $list.Items
$sprop = @{ "employeeID" = "Табельный"
                        "Name" = "Полное имя"
                    "givenName"  = "Фамилия"
                        "sn" = "Имя Отчество"
                        "mail" = "Адрес электронной почты"
                        "title" = "Должность"
                        "homePhone" = "Корп №"
                        "pager" = "№"
                        "mobile" = "Мобильный №"
                        "facsimileTelephoneNumber" = "Городской №"
                        "physicalDeliveryOfficeName" = "Кабинет"}
$prop = Write-Output employeeID, name, givenName, sn, mail, title, homePhone, pager, mobile, facsimileTelephoneNumber, physicalDeliveryOfficeName

$adusers = @{}
Import-Csv "D:\Contacts.csv" | Foreach {
$adusers[$_.employeeID] = $_
}
$index = @()

foreach($item in $items) {
        $id = $item["Табельный"]
        $user = $adusers["$id"]
        $index += $id
        if($user) {
                $prop | Foreach {
                        $p = $sprop["$_"]
                        if ($user."$_" -ne $item["$p"]) {
                                $item["$p"] = $user."$_"
                        }
                }
                $item.update()
        }
        else {
                $item.delete()
        }
}
Compare-Object ($adusers.GetEnumerator() | Foreach {$_.Name}) $index | Where {$_.SideIndicator -eq "<="} | Foreach {
        $user = $adusers["$($_.InputObject)"]
        $item = $list.items.Add()
        $prop | Foreach {
                        $p = $sprop["$_"]
                        if ($user."$_" -ne $item["$p"]){
                        $item["$p"] = $user."$_"
        }
        }
        $item.update()
}
exit



2. Импорт из AD напрямую в SP
читать дальше »
Код:

import-module ActiveDirectory
if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.Sharepoint.Powershell"}) -eq $null) {
                                                  Add-PSSnapin Microsoft.Sharepoint.Powershell
                                                }                                               
$web = Get-SPWeb "http://portal/site1"
$list = $web.lists["AD2SP"]
$items = $list.Items
$sprop = @{ "employeeID" = "Табельный"
                        "Name" = "Полное имя"
                    "givenName"  = "Фамилия"
                        "sn" = "Имя Отчество"
                        "mail" = "Адрес электронной почты"
                        "title" = "Должность"
                        "homePhone" = "Корп №"
                        "pager" = "№"
                        "mobile" = "Мобильный №"
                        "facsimileTelephoneNumber" = "Городской №"
                        "physicalDeliveryOfficeName" = "Кабинет"}
$prop = Write-Output employeeID, name, givenName, sn, mail, title, homePhone, pager, mobile, facsimileTelephoneNumber, physicalDeliveryOfficeName
$adusers = @{}
$index = @()
Get-ADUser -Filter {(ObjectClass -eq "user") -and (employeeID -like "*")} -Properties $prop | Foreach {
        $adusers[$_.employeeID] = $_
}
foreach($item in $items) {
        $id = $item["Табельный"]
        $user = $adusers["$id"]
        $index += $id
        if($user) {
                $prop | Foreach {
                        $p = $sprop["$_"]
                        if ($user."$_" -ne $item["$p"]) {
                                $item["$p"] = $user."$_"
                        }
                }
                $item.update()
        }
        else {
                $item.delete()
        }
}
Compare-Object ($adusers.GetEnumerator() | Foreach {$_.Name}) $index | Where {$_.SideIndicator -eq "<="} | Foreach {
        $user = $adusers["$($_.InputObject)"]
        $item = $list.items.Add()
        $prop | Foreach {
                        $p = $sprop["$_"]
                        if ($user."$_" -ne $item["$p"]){
                        $item["$p"] = $user."$_"
        }
        }
        $item.update()
}
exit



П.С.: Огромное спасибо пользователю Kazun.


Время: 06:44.

Время: 06:44.
© OSzone.net 2001-