从https://portal.msrc.microsoft.com/zh-cn/security-guidance/advisory/ADV990001

时间:2018-12-22 04:18:08

标签: powershell

我正在尝试抓取此网页:https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/ADV990001,特别是希望从Windows Server 2016的表(或较小的表)中获取最新文章编号。相应的SSU软件包号),今天是4465659。

我正在编写一个脚本,以自动获取此最新的服务堆栈更新以及Windows Server 2016的最新累积更新。我已使“累积更新”部分正常工作,但相同的方法未产生结果在上面的链接上。

作为参考,我的“累积更新”方法如下。它解析页面,进行一些调整,最后得到我可以输入到下载脚本中的KBID,据我所知。在上面的链接上使用它的问题在于,页面内容似乎是从其他位置动态填充的,因此我似乎无法在PowerShell中返回任何实际的表内容,因此我可以从中进行进一步的查询。 / p>

此外,我需要-UseBasicParsing,因为这是在Windows Server上执行的,可能是IE无法显示。

谢谢! 马特

$buildVersion = "14393"
$kbID = (Invoke-WebRequest -Uri 'https://support.microsoft.com/en-us/help/4000825' -UseBasicParsing).RawContent -split "`n"
$kbID = ($kbID | Where-Object { $_ -like "*heading*$buildVersion*" } | Select-Object -First 1)
$kbID = ((($kbID -split "KB", 2)[1]) -split "\s", 2)[0]

2 个答案:

答案 0 :(得分:0)

您无法使用简单的http客户端来执行此操作,因为该页面运行了一些javascript,并且该页面上的更多内容首先将您重定向到您需要检查/接受的eula页面。您可以在Google上搜索返回相同数据的其他Rest API或带有静态html的其他源。

如果没有,您仍然可以使其自动化,但是您需要使用实际的浏览器。我猜最流行的方法是使用Selenium(它将使用FireFox,Chrome或IE)。可能还有其他无头浏览器。

以下是使用Firefox的解决方案(如果尚未安装的话),但是我相信您也可以使用其他浏览器来实现。您还将需要一个C#驱动程序(WebDriver.dll,它位于Selenium.WebDriver.3.14.0.nupkg中)和Mozilla GeckoDriver(geckodriver.exe)。您可以从这里下载:https://www.seleniumhq.org/download/

使用powershell脚本将所有文件放在同一文件夹中。下面的脚本:

Add-Type -Path "C:\stack\selenium\WebDriver.dll"

$driver = [OpenQA.Selenium.Firefox.FirefoxDriver]::new()

$driver.manage().timeouts().ImplicitWait = [timespan]::FromSeconds(5)

$driver.Navigate().GoToUrl("https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/ADV990001")

$driver.FindElementByCssSelector(".ng-untouched").Click()  # check eula box 

$driver.FindElementByCssSelector(".btn-primary").Click()   # click accept button

#select rows of the seconds table
$data = $driver.FindElementsByTagName("table")[1].FindElementsByTagName("tr").text

$driver.quit()

$data | Select-String "Windows Server 2016"

答案 1 :(得分:0)

如果不调用IE或使用其他一些UI自动化,则无法执行此操作。 如果尚未提示您接受首页,则没有点击页面。

点击该网址后: https://support.microsoft.com/en-us/help/4000825

..您将在这里找到自己:

https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/ADV990001

该页面的主要来源一旦不直接包含表格,如果您检查表格元素,则会看到href的内容,甚至那些将您带到MS Catalog page的搜索位置,然后,您必须与之互动(如果您曾经去过该页面,它也会迫使您也接受该页面)。因此,这些东西只能使用浏览器进行渲染。

因此,这意味着,仅使用表格(不包括所有接受步骤),就可以使用IE进行如下所示的操作。我不会对第一个URL采取行动,因为您已经在处理它。

# Get all tables on a web page.
$Url1 = 'https://support.microsoft.com/en-us/help/4000825'
$Url2 = 'https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/ADV990001'

$ie = New-Object -com InternetExplorer.Application
while ($ie.Busy) {Sleep 1}

$ie.navigate($Url2)
while ($ie.Busy) {Sleep 1}

$KBTable = ForEach ($table in $ie.Document.getElementsByTagName('table')){ $table }
$KBPattern = 'https.*KB\d{7}'
[regex]::Matches(($KBTable | ConvertTo-Xml).Objects.Object.Property.'#text',$KBPattern).Value

# Results
https://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4093430
https://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4093430
https://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4465659

...当然,您可以根据需要使用这些链接。