Enabling or Disabling Windows Updates with SSM Run Command
AWS-ConfigureWindowsUpdate
运行该命令时,它会将一个PowerShell脚本下载到我的EC2,位于“C:\ ProgramData \ Amazon \ Ec2Config \ Downloads \ _ aws_psModule \”,并带有一个随机名称
当PowerShell脚本执行时,它会将“Amazon.ConfigureWindowsUpdate-1.2.zip”下载到“%Temp%”,然后将其解压缩到“%WinDir%\ System32 \ WindowsPowerShell \ v1.0 \ Modules”
该脚本看起来在第32行失败,其中.CopyHere函数在解压缩中 Pastebin of Powershell Script: 1b3hh3oy.k51.ps1
(New-Object -Com Shell.Application).namespace($powerShellModuleLocation).CopyHere((New-Object -Com Shell.Application).namespace($tempLocation).Items(), 16)
输出:
从实例元数据中获取实例区域 从S3下载ConfigureWindowsUpdate PowerShell模块 验证ConfigureWindowsUpdate PowerShell模块zip文件的SHA 256 ExtractingConfigureWindowsUpdate zip文件内容到Windows PowerShell模块文件夹 -------------- ERROR -------------- C:\ ProgramData \ Amazon \ Ec2Config \ Downloads \ aws_psModule \ 1b3hh3oy.k51.ps1:
下载ConfigureWindowsUpdate时抛出异常 带有消息的PowerShell模块:调用目标已抛出异常。
在行:1个字符:1 +。 'C:\ ProgramData \ Amazon \ Ec2Config \ Downloads \ aws_psModule \ 1b3hh3oy.k51.ps1'; ex ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:NotSpecified:(:) [Write-Error],WriteErrorException
+ FullyQualifiedErrorId:Microsoft.PowerShell.Commands.WriteErrorException,1b3hh3oy.k51.ps1
其他细节:
- 我有运行的Windows Server Core 2012 R2的微EC2
- 我已经从AWS Console中成功使用了AWS-RunPowerShellScript命令几次
- 我通过AWS控制台运行了AWS-ConfigureWindowsUpdate,但它失败了
- 我远程连接到服务器并使用管理员权限运行powershell脚本并获得相同的错误
答案 0 :(得分:2)
您是对的,在调用Shell命名空间以提取cmdlet有效内容时发生异常。用于Shell访问的COM命名空间未包含在Core发行版中,因此在提取cmdlet时,ConfigureWindowsUpdate脚本失败。
目前有针对Windows Server Core AMI的解决方法,目前正在调查更完整的修复程序。解决方法涉及创建带有调整的custom ConfigureWindowsUpdate文档以修复提取过程。
下面是一个替换对
的调用的函数 (New-Object -Com Shell.Application).namespace($powerShellModuleLocation).CopyHere((New-Object -Com Shell.Application).namespace($tempLocation).Items(), 16)
function ExtractZipCoreOs($zipFilePath, $destPath) {
try
{
[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null
$zip = [System.IO.Compression.ZipFile]::OpenRead($zipFilePath)
foreach ($item in $zip.Entries) {
$extractedPath = Join-Path $destPath $item.FullName
if ($item.Length -eq 0) {
if ((Test-Path $extractedPath) -eq 0) {
mkdir $extractedPath | Out-Null
}
} else {
$fileParent = Split-Path $extractedPath
if ((Test-Path $fileParent) -eq 0) {
mkdir $fileParent | Out-Null
}
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($item,(Join-Path -Path $powerShellModuleLocation -ChildPath $item.FullName), $true)
}
}
}
catch
{
throw "Error encountered when extracting ConfigureWindowsUpdate zip file.`n$($_.Exception.Message)"
}
finally
{
$zip.Dispose()
}
}