Monday, 27 June 2016

SharePoint and Powershell - Oh so sweet!!!

Below is the working and tested code to get the web details using REST
Add-Type –Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll" 
Add-Type –Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll" 

<#
.Synopsis
    Sends an HTTP or HTTPS request to a SharePoint Online REST-compliant web service.
.DESCRIPTION
    This function sends an HTTP or HTTPS request to a Representational State
    Transfer (REST)-compliant ("RESTful") SharePoint Online web service.
.EXAMPLE
   Invoke-SPORestMethod -Url "https://contoso.sharepoint.com/_api/web"
.EXAMPLE
   Invoke-SPORestMethod -Url "https://contoso.sharepoint.com/_api/contextinfo" -Method "Post"
#>
  
Function Invoke-RestSPO(){

Param(
[Parameter(Mandatory=$True)]
[String]$Url,

[Parameter(Mandatory=$False)]
[Microsoft.PowerShell.Commands.WebRequestMethod]$Method = [Microsoft.PowerShell.Commands.WebRequestMethod]::Get,

[Parameter(Mandatory=$True)]
[String]$UserName,

[Parameter(Mandatory=$False)]
[String]$Password,

[Parameter(Mandatory=$False)]
[String]$Metadata,

[Parameter(Mandatory=$False)]
[System.Byte[]]$Body,

[Parameter(Mandatory=$False)]
[String]$RequestDigest,

[Parameter(Mandatory=$False)]
[String]$ETag,

[Parameter(Mandatory=$False)]
[String]$XHTTPMethod,

[Parameter(Mandatory=$False)]
[System.String]$Accept = "application/json;odata=verbose",

[Parameter(Mandatory=$False)]
[String]$ContentType = "application/json;odata=verbose",

[Parameter(Mandatory=$False)]
[Boolean]$BinaryStringResponseBody = $False

)




   if([string]::IsNullOrEmpty($Password)) {
      $SecurePassword = Read-Host -Prompt "Enter the password" -AsSecureString 
   }
   else {
      $SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force
   }


   $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName, $SecurePassword)
   $request = [System.Net.WebRequest]::Create($Url)
   $request.Credentials = $credentials
   $request.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f")
   $request.ContentType = $ContentType
   $request.Accept = $Accept
   $request.Method=$Method

   if($RequestDigest) { 
      $request.Headers.Add("X-RequestDigest", $RequestDigest)
   }
   if($ETag) { 
      $request.Headers.Add("If-Match", $ETag)
   }
   if($XHTTPMethod) { 
      $request.Headers.Add("X-HTTP-Method", $XHTTPMethod)
   }
   if($Metadata -or $Body) {
      if($Metadata) {     
         $Body = [byte[]][char[]]$Metadata
      }      
      $request.ContentLength = $Body.Length 
      $stream = $request.GetRequestStream()
      $stream.Write($Body, 0, $Body.Length)
   }
   else {
      $request.ContentLength = 0
   }

   #Process Response
   $response = $request.GetResponse()
   try {
       if($BinaryStringResponseBody -eq $False) {    
           $streamReader = New-Object System.IO.StreamReader $response.GetResponseStream()
           try {
              $data=$streamReader.ReadToEnd()
              $results = $data | ConvertFrom-Json
              $results.d 
           }
           finally {
              $streamReader.Dispose()
           }
        }
        else {
           $dataStream = New-Object System.IO.MemoryStream
           try {
           Stream-CopyTo -Source $response.GetResponseStream() -Destination $dataStream
           $dataStream.ToArray()
           }
           finally {
              $dataStream.Dispose()
           } 
        }
    }
    finally {
        $response.Dispose()
    }
   
}


# Get Context Info 
Function Get-SPOContextInfo(){

Param(
[Parameter(Mandatory=$True)]
[String]$WebUrl,

[Parameter(Mandatory=$True)]
[String]$UserName,

[Parameter(Mandatory=$False)]
[String]$Password
)

   
   $Url = $WebUrl + "/_api/contextinfo"
   Invoke-RestSPO $Url Post $UserName $Password
}



Function Stream-CopyTo([System.IO.Stream]$Source, [System.IO.Stream]$Destination)
{
    $buffer = New-Object Byte[] 8192 
    $bytesRead = 0
    while (($bytesRead = $Source.Read($buffer, 0, $buffer.Length)) -gt 0)
    {
         $Destination.Write($buffer, 0, $bytesRead)
    }
}


#Referencehttps://blog.vgrem.com/2014/04/15/consuming-the-sharepoint-2013-rest-api-from-powershell/

Below is the code to invoke REST from SharePoint 2016
$URI = "http://spthangu.sps2016.hostingcloudapp.com/_api/web"
$cred = Get-Credential
$request = [System.Net.WebRequest]::Create($URI)
$request.Credentials = $cred
$request.Accept = "application/json;odata-verbose"
$request.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED","f");
$response = $request.GetResponse()
$reader = New-Object System.IO.StreamReader $response.GetResponseStream()
$data = $reader.ReadToEnd()
$data


#$results = ConvertFrom-Json -InputObject $data




#References: http://www.ilikesharepoint.de/2015/04/powershell-calling-sharepoint-webservice/




#URL for the Webservice
$URI = "http://<site>/_vti_bin/lists.asmx?WSDL"
$cred = Get-Credential



#Call a proxy
$proxy = New-WebServiceProxy -Uri $URI -Class ILSWebservice -Namespace ILS -Credential $cred



#Get the list
$list = $proxy.GetList('Documents')



#Display the list title
$list.Title

#References: https://www.itunity.com/article/sharepoint-rest-service-windows-powershell-1381








#URL for the Webservice
$URI = "http://xxx.xxx/_api/lists"


$cred = Get-Credential


$request = [System.Net.WebRequest]::Create($URI)


$request.Credentials = $cred

$request.Accept = "application/json;odata-verbose"


$request.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED","f");


$response = $request.GetResponse()


$reader = New-Object System.IO.StreamReader $response.GetResponseStream()


$data = $reader.ReadToEnd()







$data
$results = ConvertFrom-Json -InputObject $data











No comments:

Post a Comment