这个让我或过去几天感到困惑。无法将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
,那么它可以正常工作。
因此,传递参数的方式存在一个小问题。
答案 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/
但我再次得不到一致的结果。但是我知道防火墙是一个问题,我可以稍后再回过头来确定我应该打开哪些端口。如果有人有任何东西,我愿意接受如何做到这一点的想法:)。
我会将此标记为已回答。
感谢您的时间。