为什么AWS-ConfigureWindowsUpdate SSM运行命令失败?

时间:2016-07-01 18:31:29

标签: windows powershell amazon-web-services amazon-ec2

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脚本并获得相同的错误

1 个答案:

答案 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()
    }
}