我目前在PowerShell中有以下查询:

query user /server:$server

返回输出:
USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
svc_chthost                               2  Disc         1:05  8/16/2016 12:01 PM
myusername                rdp-tcp         3  Active          .  8/29/2016 11:29 AM

目前,我使用@(query user /server:$server).Count - 1作为代表登录用户数的值(我知道这并不漂亮)。但是,现在我想获取诸如USERNAMEIDLOGON TIME之类的信息以在脚本的其他部分中使用。

我的问题是围绕一种更轻松的方法来解析上述信息,或者可能是对我的问题的更好解决方案:统计和收集与登录用户有关的信息。

我发现了其他似乎更有效的解决方案,但是我确信必须有一种更简单的方法来完成此任务:
$ComputerName | Foreach-object {
$Computer = $_
try
    {
        $processinfo = @(Get-WmiObject -class win32_process -ComputerName $Computer -EA "Stop")
            if ($processinfo)
            {
                $processinfo | Foreach-Object {$_.GetOwner().User} |
                Where-Object {$_ -ne "NETWORK SERVICE" -and $_ -ne "LOCAL SERVICE" -and $_ -ne "SYSTEM"} |
                Sort-Object -Unique |
                ForEach-Object { New-Object psobject -Property @{Computer=$Computer;LoggedOn=$_} } |
                Select-Object Computer,LoggedOn
            }#If
    }
catch
    {

    }

最佳答案

评论中的引人入胜的引用文献,并且对于此问题仍然开放,因为它应该有更简单的解决方案!

    foreach ($s in $servers) #For Each Server
{
    foreach($ServerLine in @(query user /server:$s) -split "\n") #Each Server Line
    {
        #USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME

        $Parsed_Server = $ServerLine -split '\s+'

        $Parsed_Server[1] #USERNAME
        $Parsed_Server[2] #SESSIONNAME
        $Parsed_Server[3] #ID
        $Parsed_Server[4] #STATE
        $Parsed_Server[5] #IDLE TIME
        $Parsed_Server[6] #LOGON TIME
    }
}

这种解决方案暂时解决了这个问题。

有关具有更多功能的更深入的解决方案,请查看原始问题的评论:)

08-19 10:35