【问题标题】:Activate / Install a Solution in Sharepoint Online (Sitecollection -> Webtemplate)在 Sharepoint Online 中激活/安装解决方案(Sitecollection -> Webtemplate)
【发布时间】:2015-11-09 14:02:09
【问题描述】:

我尝试在 Webrequest 的帮助下,Sharepoint Online 中的一个按钮来触发。

第一个错误代码:

使用“0”参数调用“GetResponse”的异常:“远程服务器返回错误:(403) Forbidden。”

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

【问题讨论】:

    标签: sharepoint office365 solution sharepoint-online


    【解决方案1】:

    您是否在清单文件中添加了外部端点。您需要添加端点的 url,以便应用具有访问外部端点的权限。

    这是一个包含如何执行/查询外部端点和其他来源的代码示例的链接,例如:Web 应用程序、主机应用程序或网站集...等。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      相关资源
      最近更新 更多