Powershell и Sharepoint - список обновлений - PullRequest
0 голосов
/ 20 октября 2018

Я читал тонну этих статей, в которых говорится об использовании Get-SPWeb, но я так и не смог заставить эти функции работать из-за ошибок аутентификации.Я создал свои собственные маленькие функции, чтобы делать то, что мне нужно, но я изо всех сил пытаюсь выяснить, что я делаю неправильно для своей функции обновления.Ниже приведены функции, которые я построил, и все они работают:

If (!$cred) {$cred = get-credential -UserName "$ENV:Username@$ENV:UserDomain.com" -Message "Enter your office 365 login"}

function Get-AuthenticationCookie($context)
{
    $sharePointUri = New-Object System.Uri($context.site.Url)
    $authCookie = $context.Credentials.GetAuthenticationCookie($sharePointUri)
    if ($? -eq $false) #https://ss64.com/ps/syntax-automatic-variables.html
    {
        return $null
    }
    $fedAuthString = $authCookie.TrimStart("SPOIDCRL=".ToCharArray())
    $cookieContainer = New-Object System.Net.CookieContainer
    $cookieContainer.Add($sharePointUri, (New-Object System.Net.Cookie("SPOIDCRL", $fedAuthString)))
    return $cookieContainer
}

function Get-SharepointContext
{
    Param(
        [Parameter(Mandatory = $true)]
        $siteUrl,
        [Parameter(Mandatory = $false)]
        $cred)

    If (!$cred) {$cred = get-credential -UserName "$ENV:Username@$env:USERDNSDOMAIN" -Message "Login"}

    [string]$username = $cred.UserName
    $securePassword = $cred.Password

    [Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
    [Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.ClientContext")
    $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)
    $ctx.RequestTimeOut = 1000 * 60 * 10;
    $ctx.AuthenticationMode = [Microsoft.SharePoint.Client.ClientAuthenticationMode]::Default
    $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePassword)
    $ctx.Credentials = $credentials
    Return $ctx
}

function Add-SharepointListEntry
{
    #example
    #Add-SharepointListEntry -cred $cred -clientName $DestinationPages

    Param(
        [Parameter(Mandatory = $true)]
        $cred,
        [Parameter(Mandatory = $true)]
        $sitename,
        $siteUrl = "https://$env:Userdomain.sharepoint.com/$sitename",
        [Parameter(Mandatory = $true)]
        $ListName,
        $SharepointData
    )
    [Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")

    # Bind to site collection
    $Context = Get-SharepointContext -siteUrl $siteUrl -cred $cred

    # Get List
    $List = $Context.Web.Lists.GetByTitle($ListName)
    $Context.Load($List)
    $Context.ExecuteQuery()

    # Create Single List Item
    $ListItemCreationInformation = New-Object Microsoft.SharePoint.Client.ListItemCreationInformation
    $NewListItem = $List.AddItem($ListItemCreationInformation)

    #construct the entry to insert
    $NewListItem["Title"] = $SharepointData.Title #Client Name
    $NewListItem["Description"] = $SharepointData.Title

    #These objects should pass right through
    $NewListItem["Client"] = $SharepointData.Client
    $NewListItem["Author"] = $SharepointData.Author
    $NewListItem["Initials"] = $SharepointData.Author
    $NewListItem["Created"] = $SharepointData.Created

    $NewListItem.Update()
    $Context.ExecuteQuery()
}

Function Get-SharepointListData
{
    #example
    #Get-SharepointListData -cred $cred
    Param(
        [Parameter(Mandatory = $true)]
        $cred,
        [Parameter(Mandatory = $true)]
        $sitename,
        $siteUrl = "https://$env:Userdomain.sharepoint.com/$sitename",
        [Parameter(Mandatory = $true)]
        $ListName
    )

    [Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
    # Bind to site collection
    $Context = Get-SharepointContext -siteUrl $siteUrl -cred $cred

    #Retrive the List
    $List = $Context.web.Lists.GetByTitle($ListName)

    #Get All List Items
    #reference https://gallery.technet.microsoft.com/office/How-to-do-a-CAML-Query-6f5260cf
    $Query = New-Object Microsoft.SharePoint.Client.CamlQuery
    $ListItems = $List.GetItems($Query)
    $context.Load($ListItems)
    $context.ExecuteQuery()

    # Turn item into a catch array
    $ListItemCollection = @()

    ForEach ($item in $ListItems)
    {
        $propertiesValues = New-Object PSObject
        $currentItem = $item
        $item.FieldValues.Keys | Where {$_ -ne "MetaInfo"} | ForEach {Add-Member -InputObject $propertiesValues -MemberType NoteProperty -Name $_ -Value $currentItem[$_]}
        $ListItemCollection += $propertiesValues
        Remove-Variable propertiesValues
    }
    Return $ListItemCollection
}

Теперь я создаю новую функцию и пытаюсь использовать один список (который запрашивает папку sharepoint) для обновления sharepointсписок.Я запрашиваю каталог с помощью get-sharepointlistdata, а затем перебираю результаты, чтобы добавить новые записи, если чего-то не хватает.Весь этот процесс работает без проблем.Я пытаюсь добавить шаг для обновления для любых изменений, но функция продолжает сбой на $ list.Items.GetByID ($ index), выдавая ошибку «Вы не можете вызвать метод для выражения с нулевым значением.»:

    Function Set-SharepointListData
{
    Param(
        [Parameter(Mandatory = $true)]
        $cred,
        [Parameter(Mandatory = $true)]
        $sitename,
        $siteUrl = "https://$env:userdomain.sharepoint.com/$sitename",
        [Parameter(Mandatory = $true)]
        $ListName,
        [Parameter(Mandatory = $true)]
        [int]$Index,
        [Parameter(Mandatory = $true)]
        $Time
    )
    [Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")

    # Bind to site collection
    $Context = Get-SharepointContext -siteUrl $siteUrl -cred $cred

    # Get List
    $List = $Context.Web.Lists.GetByTitle($ListName)
    $Context.Load($List)
    $Context.ExecuteQuery()

    # Select Single List Item
    $ListItem = $List.Items.GetById($index)

    $ListItem["Created"] = $time
    $ListItem.Update();
    $Context.ExecuteQuery(); 
}

Я уверен, что я пропускаю что-то очевидное здесь ... у кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 20 октября 2018

$ Context.Web.Lists.GetByTitle ($ ListName) не возвращает элементы списка.Вы должны загрузить элементы ... обычно это делается с помощью запроса caml.См. здесь - хотя образец находится на C #, он должен помочь вам начать.

На самом деле я советую вам использовать PnPPowershell , для работы с Sharepoint достаточно командлетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...