【问题标题】:Open multiple remote sessions using 'mstsc' in powershell script在 powershell 脚本中使用“mstsc”打开多个远程会话
【发布时间】: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


【解决方案1】:

此行为是由您使用 Out-String 引起的。

Get-Content 输出 多个 字符串,文件中的每一行一个 - 但Out-String 将它们重新拼接成一个 单个 多行字符串:

PS C:\> $machines = Get-Content machines.txt
PS C:\> $machines.GetType().Name   # definitely an array
Object[]
PS C:\> $machines.Count            # multiple strings in there
4
PS C:\> $machines = Get-Content machines.txt | Out-String
PS C:\> $machines.GetType().Name   # now it's just a single string
String

所以你的foreach(){} 循环只运行一次,而$MachineName 的值不再是单个机器的名称,而是一个多行字符串,同时包含所有这些 -这可能就是mstsc 立即退出的原因:)

从第一行删除|Out-String,你的循环就可以工作了

【讨论】:

  • 有趣的是,我在 for 循环中打印出“每一”行(事实证明,只有一个)来尝试调试。它似乎打印了每一行(因为打印了所有行),但我没有意识到它是 1 个多行字符串。
  • @nonethewiser 我倾向于总是在调试消息中的值周围添加一些限定符,即。 Write-Host "Machine Name is '$MachineName'" 而不是普通的 Write-Host $MachineName
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多