在Sharepoint中激活/安装解决方案(Sitecollection - > Webtemplate)

时间:2015-11-09 14:02:10

标签: sharepoint office365 solution sharepoint-online

我尝试借助Webrequest,Sharepoint Online中的Button来触发。

第一个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)

1 个答案:

答案 0 :(得分:0)

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

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

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