Копирование (синхронизация) файлов из SharePoint в локальную папку

В одном из клиентских сценариев понадобилось настроить автоматическое копирование файлов и папок из библиотеки SharePoint Online в каталог на локальном файловом сервере.

Предпочтительным способом синхронизации файлов из библиотеки SharePoint Online является использования клиента OneDrive (OneDrive позволяет синхронизировать файлы из указанной библиотеки SharePoint), однако это требует наличия активной сессии пользователя Microsoft 365 и лицензии для пользователя. В этой статье мы рассмотрим PowerShell скрипт для копирования (синхронизации) файлов из библиотеки SharePoint в локальной хранилище на on-premises Windows Server.

Задание копирования файлов из SharePoint Online должно запускаться автоматически из планировщика на одном из хостов Windows Server. Для этого нужно:

  1. Создать в Azure (Entra ID) отдельное приложение (App registration);
  2. Предоставить приложению следующие права: Microsoft Graph ( Files.Read.All и User.Read ) и SharePoint ( Sites.FullControl.All , User.Read.All , Sites.Read.All , Sites.Selected и TermStore.Read.All );
    Порядок регистрации приложения в Azure для доступа через Microsoft Graph API описан здесь .
  3. Создать сертификат для аутентификации в приложении Azure из скрипта PowerShell без пароля;
  4. Установить PowerShell Core на компьютере, который будет запускать скрипт копирования файлов.

Создайте переменные для скрипта и подставьте в них свои данные:

$certThumbprint = "7E82C3A560737C7894562593926E495777ECDB75"_x000D_$AzureAppID = "123456-1234-1234-1234-123456789"_x000D_$tenant="remontka.onmicrosoft.com"_x000D_

Параметры сайта и библиотеки SharePoint, файлы из которой вы будете копировать:

$siteUrl = "https://remontka.sharepoint.com/sites/SyncLibrary"_x000D_$LibraryFolder = "/Shared Documents/General"_x000D_

Путь к целевой локальной папке, в которую нужно копировать файлы:

$localFolderPath = "\fs01DocsSharePoint"

Путь к файлу лога:

$Logfile = $localFolderPath + "sharepoint_sync_sync.log"

Создайте PowerShell функцию, которая будет писать лог :

function WriteLog_x000D_{_x000D_ Param ([string]$LogString)_x000D_ $Stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")_x000D_ $LogMessage = "$Stamp $LogString"_x000D_ Add-content $LogFile -value $LogMessage_x000D_}_x000D_WriteLog "Script started....."_x000D_

Для подключения к SharePoint Online нужно установить модуль PnP:

Install-Module PnP.PowerShell

Подключитесь к SharePoint Online с помощью команду:

Connect-PnPOnline -Url $siteUrl -ApplicationId $AzureAppID -Tenant $tenant -Thumbprint $certThumbprint

Следующий этап необходимы для корректной синхронизации. Нужно удалить в локальном хранилище файлы, которые были ранее удалены на сайте SharePoint (проверяется наличие файлы в корзине SPO):

$removedobjects= Get-PnPRecycleBinItem|select Title, DirName ,ItemType,DeletedDate _x000D_ foreach ($removedobject in $removedobjects) {_x000D_ $removedpath= $removedobject.DirName -replace 'sites/remontka/Shared Documents/General', ''_x000D_ $removedpath = $removedpath -replace '/', ''_x000D_ $removedpath = $localFolderPath + $removedpath + "" + $removedobject.Title_x000D_ If (Test-Path -Path $removedpath) {_x000D_  WriteLog ""Object existsneed to delete: $removedpath""  _x000D_  Remove-Item -Path $removedpath -Recurse -Force_x000D_ }_x000D_ }_x000D_

Получить все объекты (файлы и папки в библиотеке SharePoint):

$files= Get-PnPFolderItem -FolderSiteRelativeUrl $LibraryFolder -Connection $Connection -Recursive|select NameServerRelativeUrl
admin

Share
Published by
admin

Recent Posts

Настройка Mercurial по HTTPS

Иногда mercurial, при скачивании и комитах ругается на https. Особенно на самоподписанные сертификаты. Чтобы заработал…

1 неделя ago

Компиляция libvirt в Ubuntu

Компиляция libvirt Подробнее

1 неделя ago

Ошибка libvirt permission denied: решение

Если возникает ошибка libvirt destroy lxc permission denied , при попытке остановить контейнер: _x000D_# virsh…

1 неделя ago

Настройка редиректа в NGINX

Файлы с примерами редиректа для nginx Подробнее

1 неделя ago

Включение gzip в NGINX

Как включить gzip сжатие в Nginx ? Подробнее

1 неделя ago

Удаление postinst-скрипта в Linux

Иногда возникает ситуация, когда криво настроенные пакеты не устанавливаются в системе. У меня это произошло…

1 неделя ago