无法将param传递给ConvertTo-SecureString,只能传递脚本定义的变量

时间:2018-05-25 13:16:43

标签: powershell vsphere powercli

这个让我或过去几天感到困惑。无法将param传递给ConvertTo-SecureString,只能传递脚本定义的变量。

当我运行脚本时,我传递了一些参数。它需要做的任务是通过PSSession连接到远程机器,即

./myscript.ps1 -VMPass "12345@!" -VMuser abc

在我的脚本中,我将以下内容传递给New-PSSession

[CmdletBinding()] 
Param(
    $VMuser,
    $VMPass
)

$PWord = ConvertTo-SecureString -AsPlainText -String "$VMPass" -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $VMuser, $PWord
$NewVMSession = (New-PSSession -ComputerName $NewVMAddress -Credential $cred -ErrorAction Stop)

当我运行时,我收到以下错误:

New-PSSession : [WIN-V2BK0KCPC7H] Connecting to remote server WIN-V2BK0KCPC7H
failed with the following error message : Access is denied. For more information,
see the about_Remote_Troubleshooting Help topic.
At C:\Users\ChildsC\Documents\Git\BAIC\Controller.ps1:85 char:26
+ ... MSession = (New-PSSession -ComputerName $NewVMAddress -Credential $vm ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotingTransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionOpenFailed

但是,如果我要在脚本中明确定义$VMPass = "12345@!",或者如果我要调用Get-Credential,那么它可以正常工作。

因此,传递参数的方式存在一个小问题。

2 个答案:

答案 0 :(得分:0)

要确保身份验证尝试有效,请记住将域凭据用户名格式化为DomainName\UserName。您可能还需要为-Authentication cmdlet提供适当的New-PSSession参数值。

有许多可用的身份验证选项,您可以阅读更多有关它们的信息。通常在MSDN上进行WinRM身份验证 - https://msdn.microsoft.com/en-us/library/aa384295(v=vs.85).aspx

没有直接的理由相信你的脚本的语法是错误的,但是,如果上述内容没有帮助,我们可以看一下。

答案 1 :(得分:0)

抱歉迟到了。

后来,当我尝试在脚本中使用密码显式调用而不是通过变量传递时,我遇到了间歇性连接问题。

如果我使用上面相同的脚本连接到我们域上的计算机,那么它可以正常工作。此问题似乎仅在计算机未连接到域时才会出现。

我曾考虑过设置操作系统模板,但我无法使用模板将虚拟机设置到域中,因为我们有太多的OU。

我的解决方法是禁用防火墙。我有将VM连接到域的脚本,一旦添加,我就可以重新启用防火墙。

我对此并不是特别满意,但它是现在唯一可行的并且是一致的。我尝试打开一些特定的端口,如下所示: https://blogs.technet.microsoft.com/christwe/2012/06/20/what-port-does-powershell-remoting-use/

但我再次得不到一致的结果。但是我知道防火墙是一个问题,我可以稍后再回过头来确定我应该打开哪些端口。如果有人有任何东西,我愿意接受如何做到这一点的想法:)。

我会将此标记为已回答。

感谢您的时间。