我有一个小脚本,可以帮助我们环境中的用户隐藏设施中其他用户的会话(我在公司办公室工作,企业用户需要能够影响其他用户在不同站点的会话)
所以我得到了这个:
$servers = "server1, server2, server3, server4, server5"
#search for user in servers farm
foreach ($server in $servers) {
$results = & qwinsta.exe $userid /server:$server
if ($results -ne $null) {
write-host "User found in $server"
$serverfound = $server
write-host $results[1]
$sessionid = $results[1] | Where-Object { $_ -is 0..99}
write-host "Session ID is: $sessionid"
}
}
但是,我无法从结果中获取会话ID,这是脚本的输出:
请等待我们在RDSfarm服务器上搜索x2adm
在server5中找到用户
rdp-tcp#0 x2adm 2有效
会话ID是:
我试图简单地获取输出中的数字并将其分配给$ sessionid,以便我可以完全自动化阴影过程。
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:2)
我建议您改用ConvertFrom-String
。解析像这样的数据真是太棒了。
ConvertFrom-String $results[1]
P1 :
P2 : console
P3 : Stephen
P4 : 1
P5 : Active
P6 :
因此我们的$SessionID
值将在p4中找到(P#只是此cmdlet为其找到的字符串提供的任意名称)。
完整的命令是
$sessionID = convertfrom-string $results[1] | select -expand P4
这将与您当前的代码一起使用,无需进一步修改。
答案 1 :(得分:1)
检查$servers
的数据类型,您将看到它是一个字符串而不是字符串数组,这就是您对它的处理方式。
PS C:\Users\matt> $servers = "server1, server2, server3, server4, server5"
PS C:\Users\matt> $servers.GetType().FullName
System.String
您可以从about_arrays了解有关数组基本概念的更多信息。您需要像这样定义它。
$servers = "server1", "server2", "server3", "server4", "server5"
至于处理来自qwinsta I have an answer that converts data from that into a PowerShell object的输出。可能不需要那么极端,因为你没有使用与链接问题的操作完全相同的命令。要点是ConvertFrom-StringData
是一个强大的cmdlet。