Windows AWS EC2实例用户数据PowerShell不会为系统帐户级

时间:2017-04-10 19:06:44

标签: windows powershell amazon-ec2

我创建了一个PowerShell脚本,可以在AWS Windows实例的用户数据中运行。如果我以管理员身份手动执行脚本,它会成功运行并且可以正常运行。

User Data Script

但是当我在用户数据中发送脚本时(在实例创建期间),它会抛出异常。在从系统帐户

安装模块期间会发生这种情况

EC2上的PowerShell版本Windows 2012 R2 = v4.0

 Cannot bind argument to parameter 'Path' because it is an empty string.


2017-04-10T18:24:25.004Z: Ec2HandleUserData: Message: Executing C:Windowssystem32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy unrestricted . 'C:\Program Files\Amazon\Ec2ConfigService\Scripts\UserScript.ps1' from System account
2017-04-10T18:24:25.006Z: Ec2HandleUserData: Message: Executing User Data with PID: 1084
2017-04-10T18:24:34.639Z: Ec2HandleUserData: Message: ExitCode of User Data with PID: 1084 is 1
2017-04-10T18:24:34.642Z: Ec2HandleUserData: Message: The errors from user scripts: iex : Cannot bind argument to parameter 'Path' because it is an empty string.
At C: Program Files Amazon Ec2ConfigService Scripts UserScript.ps1:5 char:79
+  (new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") 
| ie ...
+                                                                              
 ~~
    + CategoryInfo          : InvalidData: (:) [Invoke-Expression], ParameterB 
   indingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAl 
   lowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand


2017-04-10T18:24:34.642Z: Ec2HandleUserData: Message: The output from user scripts: 
2017-04-10T18:24:34.642Z: Background plugin complete: Ec2HandleUserData

解决方案/解决方案:这更多是PsGet模块问题,而不是EC2问题

https://github.com/psget/psget/issues/208

在系统帐户级别,PsGet模块正在设置Path InCorrectly。 截至目前,我已修改PsGet.ps1来读取我的自定义路径$ env:PSModulePath,它没有任何问题。

PsGet.Ps1第1615行 注释#Add-PathToPSModulePath -PathToAdd:$ Destination -PersistEnvironment:$ PersistEnvironment -Global:$ Global

补充:[环境] :: SetEnvironmentVariable(" PSModulePath",&#34 ;; C:{DirectoryIwantModulesToBe} \ Modules"," Machine")

它在系统帐户级别上没有问题

感谢Alex的帮助。

1 个答案:

答案 0 :(得分:0)

我建议使用特定路径。 userdata块在windows系统帐户下执行,因此它没有配置文件目录,也没有临时路径。 例如,[System.IO.Path]::GetTempFileName()在使用此用户执行时失败。

当代码部署包执行时,这是相同的。

如果您必须经常使用AWS-EC2,那么最好尝试尽可能地在本地复制环境,因为EC2至少需要6分钟才能启动,这可能是您的主要减速故障排除工作出于这个原因,我决定使用匹配的操作系统设置一个流浪盒,在那个盒子上我执行/测试我需要的东西。当事情变得艰难并且我怀疑系统用户的特殊性时,我使用psexec来启动我的进程。这是一个很好的起点How to: become the LOCAL SYSTEM account with PsExec