且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

远程计算机上的活动登录用户

更新时间:2022-06-19 22:43:07

为 Win32_ComputerSystem 类添加查询:

Add a query for the Win32_ComputerSystem class:

Get-WMIObject -Class Win32_ComputerSystem -Computername $Computer | Select UserName

这将获取活动"用户,然后您可以使用活动"布尔值构建一个对象.

That'll grab the 'active' user, then you can build an object with an 'Active' boolean value.

这是我的实现:

function Get-LoggedOnUser
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true,
                   Position=0,
                   ValueFromPipeline=$true,
                   ValueFromPipelineByPropertyName=$true)]
        [String[]]$ComputerName
    )
    Begin            
    {            
        $users = $null
        $return = @()
    }
    Process
    {
        ForEach($Computer in $ComputerName)
        {
            $activeUser = Get-WMIObject -class Win32_ComputerSystem -ComputerName $Computer -EA stop | select UserName
            Try
            {
                $processinfo = @(Get-WmiObject -class win32_process -ComputerName $Computer -EA "Stop")
                If ($processinfo)
                {    
                    ForEach($process in $processinfo)
                    {
                        [string[]]$users += $process.GetOwner().user| Where{($_ -ne "NETWORK SERVICE") -and ($_ -ne "LOCAL SERVICE") -and ($_ -ne "SYSTEM")}
                    }
                    If($Users)
                    { 
                        ForEach($user in ($Users | Select -unique))
                        {
                            If($ActiveUser.username -like "*$user")
                            {
                                $Return += New-Object PSObject -Property @{
                                            "User" = $user
                                            "Active" = $true
                                            "Computer" = $Computer
                                }
                            }
                            Else
                            {
                                $Return += New-Object PSObject -Property @{
                                            "User" = $user
                                            "Active" = $false
                                            "Computer" = $Computer
                                }
                            }
                        }
                    }
                    Else
                    {
                        "There are no users logged onto $computer" | Out-Host
                    }
                }
            }
            Catch
            {
                "Cannot find any processes running on $computer" | Out-Host
            }
        }
    }
    End
    {
        $Return
    }
}

值得指出的是,Win32_ComputerSystem 用户名仅在用户本地登录时才会填充,因此任何通过远程桌面登录的人都不会显示为活动".

It is worth it to point out that the Win32_ComputerSystem username is only populated if the user is logged in locally, so anyone logged in through remote desktop won't show as 'Active'.