首页 > 解决方案 > 使用 PowerShell 和 [ADSI] 远程设置 Windows 本地管理员密码

问题描述

这么近,但这么远……

我正在尝试使用 [ADSI] 和 PowerShell 更改 Windows 服务器上的本地管理员密码,但在调用时找不到传递字符串变量的方法并出现以下错误:

Exception calling "Invoke" with "2" argument(s): "Number of parameters specified does not match the expected number."
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodTargetInvocation
+ PSComputerName        : vmdeploytest1

这适用于语句中的字符串:

$vmName = "vmdeploytest1"

Invoke-Command -ComputerName $vmName -Credential $creds -ScriptBlock {
  $account = [ADSI]("WinNT://localhost/Administrator,user")
  $account.psbase.invoke("setpassword","Password123")
}

这不会:

$vmName = "vmdeploytest1"   
$password = '"Password123"'
$invoke = '"setpassword",'
$invokeStr = $invoke + $password

Invoke-Command -ComputerName $vmName -Credential $creds -ScriptBlock {
$account = [ADSI]("WinNT://localhost/Administrator,user")
$account.psbase.invoke($invokeStr)
}

这不

$vmName = "vmdeploytest1"   
$password = '"Password123"'

Invoke-Command -ComputerName $vmName -Credential $creds -ScriptBlock {
$account = [ADSI]("WinNT://localhost/Administrator,user")
$account.psbase.invoke("setpassword",$password)
}

这不会:

$vmName = "vmdeploytest1"   
$password = 'Password123'

Invoke-Command -ComputerName $vmName -Credential $creds -ScriptBlock {
$account = [ADSI]("WinNT://localhost/Administrator,user")
$account.psbase.invoke("setpassword",$password)
}

都给出相同的错误。我需要能够使用变量,因为我要生成一个随机密码。

标签: powershell

解决方案


Jeroen Mostert 是正确的

当您将变量传递到 ScriptBlock 时,您需要在它们前面加上$using:

例如:

$vmName = "vmdeploytest1"   
$password = 'Password123'

Invoke-Command -ComputerName $vmName -Credential $creds -ScriptBlock {
$account = [ADSI]("WinNT://localhost/Administrator,user")
$account.psbase.invoke("setpassword",$using:password)
}

推荐阅读