如何使用 Powershell 2.0 模拟单击链接以执行 aspx 服务器端代码



这有点与SharePoint有关,但我认为问题的本质实际上并不是SharePoint特定的。

情况是这样的。 我正在使用第三方 SharePoint 加载项。 安装此加载项后,它会在记录库的"SharePoint 库设置"页中提供一个链接。 如果单击该链接,它将执行一些代码并对库执行一些配置(安装自定义内容类型等(。

链接本身执行一些Javascript:

function dialogCallback()
{
    SP.UI.Notify.addNotification('Content types installed and settings configured.');                                                        
    SP.UI.ModalDialog.RefreshPage(SP.UI.DialogResult.OK);
}
function openInstallContentTypesDialog()
{ 
    var options = SP.UI.$create_DialogOptions();
    options.url = 'http://my.sharepoint.site/_layouts/Custom/Feature/ExecuteConfigurationCode.aspx?SiteUrl=http://my.sharepoint.site&ListId={6767676a-0101-b4dc-a67a-67a67a67a67a}';
    options.dialogReturnValueCallback = Function.createDelegate(null, dialogCallback);
    SP.UI.ModalDialog.showModalDialog(options);
}                
openInstallContentTypesDialog();

我需要配置 ~50 个库,所以我宁愿不必通过 UI 进入每个库的设置页面并单击该链接。 (特别是因为我将不得不多次执行此操作,因为我在多个开发/测试/等环境中设置了服务器场。 我宁愿编写一个Powershell脚本,循环浏览所有库,并以某种方式模拟单击该链接并调用ExecuteConfigurationCode.aspx页面。 我知道我可以通过 Powershell 获取查询字符串(站点 URL 和列表 ID(所需的信息,但我无法弄清楚如何触发 aspx 页面的代码。

我做了一些挖掘,发现一些帖子说使用System.Net.WebClient对象并调用DownloadString()。 像这样:

$web = get-spweb http://my.sharepoint.site
$list = $web.Lists["My Record Library"]
$requestUrl = $web.Url+"/_layouts/Custom/Feature/ExecuteConfigurationCode.aspx"
$querystring = new-object system.collections.specialized.namevaluecollection
$querystring.Add("SiteUrl", $web.Url)
$querystring.Add("ListId", "{"+$list.Id.Tostring()+"}")
$webclient = new-object system.net.webclient
$webclient.Credentials = new-object system.net.networkcredential("Site Collection Admin", "password")
$webclient.QueryString = $querystring
$response = $webclient.downloadstring($requestUrl)

而且,尽管我确实获得了构成页面的所有 HTML,但 aspx 页面背后的代码并未执行。

我还尝试了UploadString()方法,看看它是否需要是 POST。 这有相同的结果 - 页面的所有 HTML 都返回给我,但 aspx 页面的服务器端代码没有执行。

那么......我如何模拟通过Powershell单击该链接? (另请记住,由于它是 SharePoint,我使用的是 SharePoint 2010 Management Shell,即 Powershell 2.0。 所以我不能使用 Invoke-WebRequest cmdlet。

你有没有尝试过使用 IE COM 对象:

  $url = "http://blabla/"
  $ie = New-Object -com InternetExplorer.Application
  $ie.visible = $true; 
  $ie.navigate($url); 
  $ie.Document.getElementByID("a_componenent_id").value="blabla"
  $ie.Document.getElementById("A_Form").submit()
or
  $button = $ie.Document.getElementsByTagName("input")
  $button.item(0).Click()

最新更新