Powershell 无法将参数传递给ConvertTo SecureString,只有脚本定义的变量

Powershell 无法将参数传递给ConvertTo SecureString,只有脚本定义的变量,powershell,vsphere,powercli,Powershell,Vsphere,Powercli,这件事让我或是最近几天都很困惑。无法将参数传递到转换到SecureString,只有脚本定义的变量 当我运行脚本时,我会传递一些参数。它需要完成的任务之一是通过PSSession连接到远程机器,即 ./myscript.ps1 -VMPass "12345@!" -VMuser abc 在我的脚本中,有以下内容将被传递到New PSSession: [CmdletBinding()] Param( $VMuser, $VMPass ) $PWord = 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 新建PSSession:[WIN-V2BK0KCC7H]连接到远程服务器WIN-V2BK0KCC7H 失败,错误消息如下:访问被拒绝。欲了解更多信息, 请参阅关于远程故障排除帮助主题。 在C:\Users\ChildsC\Documents\Git\BAIC\Controller.ps1:85 char:26 + ... MSession=(新PSession-ComputerName$NewVMAddress-Credential$vm。。。 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:OpenError:(System.Manageme….RemoteRunspace:RemoteRunspace)[New PSSession],PSRemotingTransportException +FullyQualifiedErrorId:AccessDenied,PSSessionOpenFailed 但是,如果我在脚本中显式定义
$VMPass=“12345@!”
,或者如果我调用
Get Credential
,它可以正常工作


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

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

有许多可用的身份验证选项,您可以在MSDN-


没有直接的理由相信脚本的语法有问题,但是,如果上面的内容没有帮助,也许我们可以查看一下。

很抱歉响应太晚

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

如果我用上面相同的脚本连接到我们域中已经存在的机器,那么它可以正常工作。这个问题似乎只有在机器未连接到域时才会出现

我曾考虑过设置操作系统模板,但我不能使用模板将VM设置到域中,因为我们有太多的OU

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

我对此并不特别满意,但这是目前唯一有效且一致的方法。我确实尝试打开了一些特定端口,如下所述:

但我再次强调,我没有得到一致的结果。但我知道防火墙是一个问题,我可以稍后再讨论它,以确定我应该打开哪些端口。如果有人有任何问题,我愿意考虑如何做到这一点:)

我将把这个标记为已回答


感谢您抽出时间。

您为什么要将密码以明文形式传递给函数?您可以通过传递
PSCredential
对象来避免整个问题。您好,很抱歉响应太晚。我正在使用输入创建PSCredential。有更好的方法吗?请记住,此脚本将从gitlab运行,并且能够保存将被解密和传递的安全凭据。