2015-11-09 23 views
0

我嘗試使用Sharepoint Online中的WebRequest按鈕來觸發。在Sharepoint Online中激活/安裝解決方案(Sitecollection - > Webtemplate)

第一Errro碼:

異常調用 「的GetResponse」 與 「0」 的參數(一個或多個): 「:禁止(403)的遠程服務器返回錯誤」。

$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() 

語境

$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) 

回答

相關問題