在enter-pssession中自动输入密码

时间:2016-07-25 07:27:16

标签: powershell powershell-remoting

我目前在Powershell ISE中制作一个Powershell脚本,用于输入我们托管的所有服务器,并从服务器ActiveDirectory中获取所有用户。要做到这一点,我必须自动连接到所有服务器(有许多服务器,但我们只需要访问42个)。让我解释一下到目前为止我做了什么以及实际问题是什么。

因为你知道有很多不同的服务器,所以我们必须从同事制作的excel文件中读取所有服务器IP:S /用户名/密码,然后将它们放入数组中。

从那里开始,我们制作了一个如下所示的for循环:

for ($S = 0; $ -le $ServerAdressArray.Length; $S++) 
{

    if ($ServerAdressArray[$S] -like '192.168.*.10')
    {
        GetData($S)
    }

}

它的作用是通过数组过滤出阵列中的所有本地IP地址,如果找到本地IP地址,它会运行GetData函数,此时此类似乎是这样:

function GetData([int]$arg1)
{
    Enter-PSsession -ComputerName $ServerAdressArray[$arg1] -Credential $UsernamesArray[$arg1] $PasswordArray[$arg1]
}

我想要它做的是使用它找到本地IP地址的行号,然后使用该号码找到正确的用户名和密码,以便在该特定服务器上登录。

问题是,我必须在powershell中为每个单个服务器输入密码。我只想在与Enter-PSSession相同的行中输入它。

如果您需要更具体的详细信息,请与我们联系。另外,我是这类脚本的新手,所以如果你在解释中尽可能冷,那就太棒了:)

谢谢。

2 个答案:

答案 0 :(得分:2)

这里的问题是你如何通过" Credential"参数。它应该是PSCredential类型。

假设您已在文件中以明文形式存储用户名和密码,则可以直接创建凭证对象:

New-Object PSCredential -ArgumentList @("a", ("p"|ConvertTo-SecureString -AsPlainText -Force))

对于你的例子:

Enter-PSsession -ComputerName $ServerAdressArray[$arg1] -Credential (New-object PSCredential -ArgumentList @($UsernamesArray[$arg1], ($PasswordArray[$arg1]|ConvertTo-secureString -AsPlainText -Force)))

然而;如果您有兴趣将每个服务器的某些数据返回给执行主机(例如,为了进一步处理),您将不想进入会话,您可能希望使用Invoke-command。

E.g。

Invoke-command -ComputerName $ServerAdressArray[$arg1] -Credential (New-object PSCredential -ArgumentList @($UsernamesArray[$arg1], ($PasswordArray[$arg1]|ConvertTo-secureString -AsPlainText -Force))) -Scriptblock $scriptblockToExecute

答案 1 :(得分:0)

你好CmdrTchort / Richard(:P)。谢谢你的回答!

出于安全原因,excelfile中的所有密码都已加密。我目前正在开发一个在使用密码之前解密密码的函数。

我在网上看了一下,我偶然发现了这篇文章: Using PowerShell credentials without being prompted for a password

我尝试了Jeroen Landheer所说的内容,现在的功能如下:

function GetData(int[$arg1])
{
    $secstr = New-Object -TypeName System.Security.Securestring
    $PasswordArray[$arg1].ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr

    $session = new-pssession -computername $ServerAdressArray[$arg1] -credential $UserNameArray[$arg1] $PasswordArray[$arg1]
}

出现提示,因此密码未自动填写,当我关闭提示时。我收到这个错误:

New-PSSession:找不到接受参数'(encryptedpassword)'的位置参数。 在C:\ xxxxxxx \ xxxxx \ xxxxxx \ superfile.ps1:109 char:16 + ... $ session = new-pssession -computername $ ServerAdressArray [$ arg1] -cr ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~     + CategoryInfo:InvalidArgument:(:) [New-PSSession],ParameterBindingException     + FullyQualifiedErrorId:PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewPSSessionCommand

我是否必须输入某种位置参数,或者它现在是否有效,因为它是加密的?