2015-11-09 2 views
0

J'essaye de déclencher à l'aide d'un Webrequest, un bouton dans Sharepoint Online.Activer/Installer une solution dans Sharepoint Online (Sitecollection -> Webtemplate)

Le premier Errro-Code:

Exception appelant "GetResponse" avec "0" argument (s): "Le serveur distant a renvoyé une erreur: (403) interdite."

$solutionId = Get-SPOSolutionId -solutionName $solutionName 

# Queries the solution's page 
$operation = "" 
if($activate) 
{ 
    $operation = "ACT" 
} 
else 
{ 
    $operation = "DEA" 
} 

$solutionPageUrl = Join-SPOParts -Separator '/' -Parts $context.Site.Url, "/_catalogs/solutions/forms/activate.aspx?Op=$operation&ID=$solutionId" 

$c 
if ($context.Credentials -ne $null) 
{ 
    $authCookieValue = $context.Credentials.GetAuthenticationCookie($context.Url) 
    # Create fed auth Cookie 
    $fedAuth = new-object System.Net.Cookie 
    $fedAuth.Name = "FedAuth" 
    $fedAuth.Value = $authCookieValue.TrimStart("SPOIDCRL=") 
    $fedAuth.Path = "/" 
    $fedAuth.Secure = $true 
    $fedAuth.HttpOnly = $true 
    $fedAuth.Domain = (New-Object System.Uri($context.Url)).Host 

    # Hookup authentication cookie to request 
    $cookieContainer.Add($fedAuth) 

    $request.CookieContainer = $cookieContainer 
} 
else 
{ 
    # No specific authentication required 
    $request.UseDefaultCredentials = $true 
} 

$request.ContentLength = 0 

$response = $request.GetResponse() 

    # decode response 
    $strResponse = $null 
    $stream = $response.GetResponseStream() 
    if (-not([String]::IsNullOrEmpty($response.Headers["Content-Encoding"]))) 
    { 
     if ($response.Headers["Content-Encoding"].ToLower().Contains("gzip")) 
     { 
      $stream = New-Object System.IO.Compression.GZipStream($stream, [System.IO.Compression.CompressionMode]::Decompress) 
     } 
     elseif ($response.Headers["Content-Encoding"].ToLower().Contains("deflate")) 
     { 
      $stream = new-Object System.IO.Compression.DeflateStream($stream, [System.IO.Compression.CompressionMode]::Decompress) 
     } 
    } 

    # get response string 
    $sr = New-Object System.IO.StreamReader($stream) 

     $strResponse = $sr.ReadToEnd() 

    $sr.Close() 
    $sr.Dispose() 

    $stream.Close() 

    $inputMatches = $strResponse | Select-String -AllMatches -Pattern "<input.+?\/??>" | select -Expand Matches 

    $inputs = @{} 

    # Look for inputs and add them to the dictionary for postback values 
    foreach ($match in $inputMatches) 
    { 
     if (-not($match[0] -imatch "name=\""(.+?)\""")) 
     { 
      continue 
     } 
     $name = $matches[1] 

     if(-not($match[0] -imatch "value=\""(.+?)\""")) 
     { 
      continue 
     } 
     $value = $matches[1] 

     $inputs.Add($name, $value) 
    } 

    # Lookup for activate button's id 
    $searchString = "" 
    if ($activate) 
    { 
     $searchString = "ActivateSolutionItem" 
    } 
    else 
    { 
     $searchString = "DeactivateSolutionItem" 
    } 

    $match = $strResponse -imatch "__doPostBack\(\&\#39\;(.*?$searchString)\&\#39\;" 
    $inputs.Add("__EVENTTARGET", $Matches[1]) 

$response.Close() 
$response.Dispose() 

# Format inputs as postback data string, but ignore the one that ends with iidIOGoBack 
$strPost = "" 
foreach ($inputKey in $inputs.Keys) 
{ 
    if (-not([String]::IsNullOrEmpty($inputKey)) -and -not($inputKey.EndsWith("iidIOGoBack"))) 
    { 
     $strPost += [System.Uri]::EscapeDataString($inputKey) + "=" + [System.Uri]::EscapeDataString($inputs[$inputKey]) + "&" 
    } 
} 
$strPost = $strPost.TrimEnd("&") 

$postData = [System.Text.Encoding]::UTF8.GetBytes($strPost); 

# Build postback request 
$activateRequest = $context.WebRequestExecutorFactory.CreateWebRequestExecutor($context, $solutionPageUrl).WebRequest 
$activateRequest.Method = "POST" 
$activateRequest.Accept = "text/html, application/xhtml+xml, */*" 
if ($context.Credentials -ne $null) 
{ 
    $activateRequest.CookieContainer = $cookieContainer 
} 
else 
{ 
    # No specific authentication required 
    $activateRequest.UseDefaultCredentials = $true 
} 
$activateRequest.ContentType = "application/x-www-form-urlencoded" 
$activateRequest.ContentLength = $postData.Length 
$activateRequest.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"; 
$activateRequest.Headers["Cache-Control"] = "no-cache"; 
$activateRequest.Headers["Accept-Encoding"] = "gzip, deflate"; 
$activateRequest.Headers["Accept-Language"] = "fr-FR,en-US"; 

# Add postback data to the request stream 
$stream = $activateRequest.GetRequestStream() 
    $stream.Write($postData, 0, $postData.Length) 
    $stream.Close(); 
$stream.Dispose() 

# Perform the postback 
$response = $activateRequest.GetResponse() 
$response.Close() 
$response.Dispose() 

Contexte

$context = New-Object Microsoft.SharePoint.Client.ClientContext($xmlContent.sites.site.Url) 

$context.Credentials = $spoCredentials 
$context.RequestTimeOut = 500 * 60 * 10; 
$web = $context.Web 
$site = $context.Site 
$context.Load($web) 
$context.Load($site) 
try 
{ 
$context.ExecuteQuery() 

$ spoCredentials

$spoCredentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($xmlContent.sites.site.Username, $SecurePassword) 

Répondre

0

Avez-vous ajouté votre point de terminaison externe dans le fichier manifeste. Vous devez ajouter l'URL du point de terminaison afin que l'application dispose des autorisations nécessaires pour accéder au point de terminaison externe.

Voici un lien avec un exemple de code pour exécuter/interroger des points de terminaison externes et d'autres sources telles que: application web, application hôte ou collections de sites ... etc.

http://blog.ctp.com/2014/06/23/data-access-in-sharepoint-hosted-apps/