在enter-pssession中自动输入密码
Entering password automatically in enter-pssession
我目前正在 Powershell ISE 中制作一个 Powershell 脚本,该脚本将用于进入我们托管的所有服务器并从服务器 ActiveDirectory 中获取所有用户。为此,我必须自动连接到所有服务器(有很多服务器,但我们需要访问的只有 42 个)。让我解释一下我到目前为止所做的以及实际问题是什么。
所以你知道有很多不同的服务器,所以我们不得不从同事制作的excel文件中读取所有服务器IP:S/Usernames/Passwords,然后将它们放入数组中。
从那里,我们创建了一个 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 相同的行中输入它。
如果您需要更具体的细节,请告诉我。另外,我是这种类型的脚本的新手,所以如果您在解释中尽可能地了解基础知识,那就太好了 :)
谢谢。
这里的问题是您如何传递 "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。
例如
Invoke-command -ComputerName $ServerAdressArray[$arg1] -Credential (New-object PSCredential -ArgumentList @($UsernamesArray[$arg1], ($PasswordArray[$arg1]|ConvertTo-secureString -AsPlainText -Force))) -Scriptblock $scriptblockToExecute
嗨 CmdrTchort/Richard (:P)。谢谢您的回答!
出于安全原因,excel 文件中的所有密码均已加密。我目前正在研究一个在使用密码之前解密密码的功能。
我在 Internet 上浏览了更多,无意中发现了这个 post:
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
我是否必须输入某种位置参数,或者它现在可以工作是因为它已加密?
我目前正在 Powershell ISE 中制作一个 Powershell 脚本,该脚本将用于进入我们托管的所有服务器并从服务器 ActiveDirectory 中获取所有用户。为此,我必须自动连接到所有服务器(有很多服务器,但我们需要访问的只有 42 个)。让我解释一下我到目前为止所做的以及实际问题是什么。
所以你知道有很多不同的服务器,所以我们不得不从同事制作的excel文件中读取所有服务器IP:S/Usernames/Passwords,然后将它们放入数组中。
从那里,我们创建了一个 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 相同的行中输入它。
如果您需要更具体的细节,请告诉我。另外,我是这种类型的脚本的新手,所以如果您在解释中尽可能地了解基础知识,那就太好了 :)
谢谢。
这里的问题是您如何传递 "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。
例如
Invoke-command -ComputerName $ServerAdressArray[$arg1] -Credential (New-object PSCredential -ArgumentList @($UsernamesArray[$arg1], ($PasswordArray[$arg1]|ConvertTo-secureString -AsPlainText -Force))) -Scriptblock $scriptblockToExecute
嗨 CmdrTchort/Richard (:P)。谢谢您的回答!
出于安全原因,excel 文件中的所有密码均已加密。我目前正在研究一个在使用密码之前解密密码的功能。
我在 Internet 上浏览了更多,无意中发现了这个 post: 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
我是否必须输入某种位置参数,或者它现在可以工作是因为它已加密?