如何在无需硬编码密码的情况下静默运行远程PowerShell命令?

如何在无需硬编码密码的情况下静默运行远程PowerShell命令?,powershell,credentials,Powershell,Credentials,我正在尝试运行: Invoke-Command -Computer $computer -ScriptBlock {...} 但我收到错误“访问被拒绝”winrm错误,我不太愿意使用以下选项: Invoke-Command -Computer $computer -Credential $cred -ScriptBlock {...} 其中$cred为: $username = "John Doe" $password = "ABCDEF" $secstr = New-Object -Typ

我正在尝试运行:

Invoke-Command -Computer $computer -ScriptBlock {...}
但我收到错误“访问被拒绝”winrm错误,我不太愿意使用以下选项:

Invoke-Command -Computer $computer -Credential $cred -ScriptBlock {...}
其中$cred为:

$username = "John Doe"
$password = "ABCDEF"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -
argumentlist $username, $secstr
它必须远程运行,并且必须静音。所以我不能让PSCredential弹出窗口在脚本中间

有人能给我看一下或给我指一份文件,让我找到一个可能的解决方案吗


提前谢谢。

您可以做的一件事是加密密码并将其保存到磁盘。然后,您可以读取该文件,并将加密密码转换为安全字符串,并从中生成凭证对象。请注意,这必须使用将用于运行脚本的帐户来完成

'$uper$secret1' | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Set-Content .\AccountPass.txt
这将以文本文件的形式将密码保存到磁盘。如果打开文本文件,它将显示如下内容:

01000000d08c9ddf0115d1118c7a00c04fc297eb01000000b584d55e9c47c942904dd30531d3ad070000000002000000000003660000c0000000100000003060266c3c4333a41e7f0e92176fb3d50000000004800000a000000010000000a2c8bbb2a3666c092004bb5e66fd440320000000636a413a6905789e0f3521cea3d8703405897cd5948da955192bcccd08990ffc1400000068c1
5f8ac088ef0972dfce7d5a20ff3bbcdac4cc 现在,创建该文件的帐户将是唯一可以解密该文件的帐户,但该帐户可以运行:

$Password = Get-Content .\AccountPass.txt | ConvertTo-SecureString
$Creds = New-Object System.Management.Automation.PSCredential ("$env:UserDomain\$env:UserName",$Password)

现在您有了一个凭证对象,而不必以明文形式保存密码。如前所述,唯一可以解密文本文件中密码的帐户是生成文本文件的帐户,每当密码更改时,文本文件都必须更新。

您可以做的一件事是加密密码并将其保存到磁盘。然后,您可以读取该文件,并将加密密码转换为安全字符串,并从中生成凭证对象。请注意,这必须使用将用于运行脚本的帐户来完成

'$uper$secret1' | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Set-Content .\AccountPass.txt
这将以文本文件的形式将密码保存到磁盘。如果打开文本文件,它将显示如下内容:

01000000d08c9ddf0115d1118c7a00c04fc297eb01000000b584d55e9c47c942904dd30531d3ad070000000002000000000003660000c0000000100000003060266c3c4333a41e7f0e92176fb3d50000000004800000a000000010000000a2c8bbb2a3666c092004bb5e66fd440320000000636a413a6905789e0f3521cea3d8703405897cd5948da955192bcccd08990ffc1400000068c1
5f8ac088ef0972dfce7d5a20ff3bbcdac4cc 现在,创建该文件的帐户将是唯一可以解密该文件的帐户,但该帐户可以运行:

$Password = Get-Content .\AccountPass.txt | ConvertTo-SecureString
$Creds = New-Object System.Management.Automation.PSCredential ("$env:UserDomain\$env:UserName",$Password)

现在您有了一个凭证对象,而不必以明文形式保存密码。如前所述,唯一可以解密文本文件中密码的帐户是生成文本文件的帐户,并且每当更改密码时,文本文件都必须更新。

除了您之外,还有其他人打算使用此脚本吗?只有我可以查看,其他人可以查看。@TheMadTechnician的解决方案将适用于您,但加密密码仅限于您在创建密码的计算机上的用户帐户。我建议为这种性质的东西创建一个注册表项,而不是一个文件。除了您之外,还有其他人打算使用此脚本吗?只有我,其他人可以查看它。@MadTechnician的解决方案适用于您,但加密密码仅限于您在创建它的计算机上的用户帐户。我建议为这种性质的东西创建一个注册表项,而不是一个文件。如果您完全依赖DPAPI,它也仅限于计算机。因此,如果我在大量计算机上运行此脚本,我必须在每台计算机上存储密码?@Ben Correct。DPAPI依赖于当前用户帐户和机器指纹(用最简单的术语来说),而这正是
ConverttoSecureString
实现所依赖的。是的,您可以这样做。您真的希望在必须远程执行需要凭据的命令的多台计算机上以静默方式运行脚本吗?也许你应该在远程机器上设置一个按你需要的凭据运行的计划任务,并让“成吨的机器”远程执行该任务。@Ben当您使用
调用命令时,为什么要将脚本放在本地?
?如果您完全依赖DPAPI,它也仅限于机器。因此,如果我在成吨的机器上运行此脚本,我必须在每台机器上存储密码?@Ben Correct。DPAPI依赖于当前用户帐户和机器指纹(用最简单的术语来说),而这正是
ConverttoSecureString
实现所依赖的。是的,您可以这样做。您真的希望在必须远程执行需要凭据的命令的多台计算机上以静默方式运行脚本吗?也许您应该在远程计算机上设置一个按您需要的凭据运行的计划任务,并让“成吨的计算机”远程执行该任务。@Ben当您使用
Invoke命令时,为什么要将脚本放在本地?