这个让我或过去几天感到困惑 . 无法将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 回答
要确保身份验证尝试有效,请记住将域凭据用户名格式化为
DomainName\UserName
. 您可能还需要为New-PSSession
cmdlet提供适当的-Authentication
参数值 .有许多可用的身份验证选项,您可以在MSDN上阅读有关它们和WinRM身份验证的更多信息 - https://msdn.microsoft.com/en-us/library/aa384295(v=vs.85).aspx
没有直接的理由相信你的脚本的语法是错误的,但是,如果上面的内容没有帮助,或许我们可以看一下 .
回复晚了非常抱歉 .
后来当我尝试在脚本中显式调用密码而不是通过变量传递它时,我遇到了间歇性连接问题 .
如果我使用上面相同的脚本连接到我们域上的机器,那么它可以正常工作 . 此问题似乎仅在计算机未连接到域时才会出现 .
我曾考虑过设置操作系统模板但我不能使用模板将虚拟机设置到域中,因为我们有太多的OU .
我的解决方法是禁用防火墙 . 我有将VM连接到域的脚本,一旦添加,我就可以重新启用防火墙 .
我对此并不是特别满意,但它是现在唯一可行的并且是一致的 . 我确实尝试打开一些特定的端口,如下所示:https://blogs.technet.microsoft.com/christwe/2012/06/20/what-port-does-powershell-remoting-use/
但我再次得不到一致的结果 . 但是我知道防火墙是一个问题,我可以稍后再回过头来确定我应该打开哪些端口 . 如果有人有任何东西,我愿意接受如何做到这一点的想法:) .
我会将此标记为已回答 .
谢谢你的时间 .