如何在使用PowerShell连接到不同系统时避免使用crendetial对话框?

时间:2015-09-05 09:43:06

标签: powershell

我使用PowerShell连接到不同的系统。我希望这个过程能够以一种方式自动化,一旦用户点击PowerShell脚本,他就可以连接到不同的系统,而无需在对话框中输入用户名和密码详细信息。所以,目前我的.PS1脚本如下:

Enable-PSRemoting -Force
Set-Item wsman:\localhost\client\trustedhosts CP0001256
Restart-Service WinRM
Test-WsMan CP0001256
$credential = Import-CliXml -Path "D:\$Env:USERNAME_pass.xml"
Invoke-Command -ComputerName CP0001256-ScriptBlock { Get-ChildItem D:\ }-credential $credential

在运行my.PS1之前,我已经执行了以下脚本:

$credential = Get-Credential  
$credential | Export-CliXml -Path "D:\$Env:USERNAME_pass.xml"

所以,当我执行my.PS1时,我得到错误:

Invoke-Command : Cannot process argument transformation on parameter 'Credential'. username
At my.PS1:7 char 86
+ Invoke-Command -ComputerName CP0001256-ScriptBlock { Get-ChildItem D:\ } -credential <<<< $credential
     + CategoryInfo         : InvalidData: (:) [Invoke-Command], ParameterBindin..mationException
     + FullyQualifiedErrorID : ParameterArgumentTransformationError,Microsoft.Powershell.Commands.InvokeCommand

所以,告诉我我做错了什么,如何避免弹出凭证对话框。

1 个答案:

答案 0 :(得分:1)

这是如何在脚本中存储凭据的问题。请记住,这总是带来一些风险。你当然可以用纯文本存储它们。然后,任何有权访问该脚本的人都有这些凭据。

您可以做的另一件事是利用[PSCredential]对象,并加密密码。考虑运行此代码(在该脚本之外):

$credential = Get-Credential  # dialog pops up here, enter server creds
$credential | Export-CliXml -Path "C:\Script\$Env:USERNAME_Credential.xml"

现在在您的脚本中,您可以执行此操作:

$credential = Import-CliXml -Path "C:\Script\$Env:USERNAME_Credential.xml"
Invoke-Command -ComputerName CP0001256-ScriptBlock { Get-ChildItem D:\ }-credential $credential

密码在该XML文件中加密,并使用特定于运行第一组命令的用户的密钥加密,因此只有该用户才能有效地运行该脚本。 / p>

这也是我将USERNAME环境变量用作文件名的一部分的原因。您可以让多个员工运行第一个代码段,为每个代码段生成单独的加密文件。然后,当任何一个脚本运行时,您的脚本将成功运行。

例如,如果您有一个用于计划任务的帐户,它也可以使用;以该用户运行一次片段,然后计划的任务将起作用。