【发布时间】:2020-11-19 22:34:44
【问题描述】:
我正在尝试编写一个 powershell 脚本,为保存在文本文件中的每个机器名称打开一个远程桌面连接。当我运行脚本时,它只连接到列表中的第一台机器并输出到控制台:CMDKEY: Credential added successfully 一次(不是每台机器一次)。 mstcs 似乎在执行后终止了进程,我不确定我是否以正确的方式添加凭据。谁能指出我正确的方向?
以下是我试图弄清楚发生了什么的一些测试:
- 在
mstsc之后打印。不打印。进程似乎在之后终止mstcs被调用。这似乎是问题的症结所在。 -
cmdkey /list显示了我存储的所有凭据及其目标。输出不包括文本文件中定义的所有目标。即使我注释掉mstsc,然后cmdkey /add:$MachineName /user:$User /pass:$Password似乎只在第一行执行,缺乏更多的控制台输出和cmdkey /list没有产生预期的目标证明了这一点。此外,我在cmdkey行之后添加了一个打印语句,它为每一行打印,所以它在运行后不会终止(我已经知道,因为mstcs在未注释掉的情况下在此行之后执行)。
# Read from file
$Lines = Get-Content -Path .\machines.txt | Out-String
# For each machine ...
foreach($Line in $Lines){
# Split line, save name and domain
$Tokens = $Line.Split(".")
$MachineName = $Tokens[0]
$Domain = $Tokens[1]
$User = "someDomain\someUsername"
$Password="somePassword"
# Switch username if someOtherDomain
if ($Domain -eq "someOtherDomain"){
$User = "someOtherDomain\someOtherUsername"
}
#set credentials and open connection
cmdkey /add:$MachineName /user:$User /pass:$Password
mstsc /v:$MachineName /console
}
编辑:我也尝试用Start-Process -FilePath "$env:windir\system32\mstsc.exe" -ArgumentList "/v:$MachineName" -Wait 替换mstsc /v:$MachineName。结果是打开会话,然后脚本没有在控制台中完成,但没有其他任何事情发生。
【问题讨论】:
-
Remove
| Out-String- 它将您刚刚从文件中读取的各个行转换为单个多行字符串,这就是您的循环在运行一次后退出的原因 -
@mathiasR.Jessen 行得通!我早些时候补充说,没有很好的理解......回想起来,它更多的是用于调试目的。仍在尝试处理为什么它的行为方式如此。感谢您的意见。
-
我最初的评论是在您添加有关多行字符串的解释之前。这说明了原因。再次感谢。
标签: powershell remote-desktop powershell-remoting mstsc