我使用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
所以,告诉我我做错了什么,如何避免弹出凭证对话框。
答案 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
环境变量用作文件名的一部分的原因。您可以让多个员工运行第一个代码段,为每个代码段生成单独的加密文件。然后,当任何一个脚本运行时,您的脚本将成功运行。
例如,如果您有一个用于计划任务的帐户,它也可以使用;以该用户运行一次片段,然后计划的任务将起作用。