Powershell脚本,用于查看当前登录的用户(域和机器)+状态(活动,空闲,离开)

Ray*_*and 34 powershell active-directory powershell-2.0 powershell-3.0 windows-server-2012

我正在搜索一个简单的命令来查看服务器上登录的用户.我知道这个:

Get-WmiObject -Class win32_computersystem
Run Code Online (Sandbox Code Playgroud)

但这不会为我提供我需要的信息.它返回:域制造商模型名称(机器名称)PrimaryOwnerName TotalPhysicalMemory

我在Windows 2012服务器上运行Powershell 3.0.

Get-WmiObject Win32_LoggedOnUser -ComputerName $Computer | Select Antecedent -Unique
Run Code Online (Sandbox Code Playgroud)

没有给我我需要的确切答案.我很乐意看到空闲时间,或者他们是活跃还是离开.

小智 91

为了寻找同样的解决方案,我在stackoverflow中找到了我需要的另一个问题: Powershell-log-off-remote-session.下面一行将返回登录用户列表.

query user /server:$SERVER
Run Code Online (Sandbox Code Playgroud)

  • 这是一个比接受的答案更好的解决方案.接受的答案为您提供运行服务和应用程序的所有用户,而不是活动的RDP会话或控制台会话. (5认同)
  • 我会继续并同意这是一个更好的答案,因为OP想要一个"简单的命令",所以我赞成它,但我正在寻找更多的功能,谷歌把我发送到这里,所以对于我的目的,mjolinor的答案更有用,所以我赞成了那个......嗯 (3认同)

mjo*_*nor 19

这样做没有"简单的命令".您可以编写一个函数,也可以选择在各种代码存储库中在线提供的函数.我用这个:

function get-loggedonuser ($computername){

#mjolinor 3/17/10

$regexa = '.+Domain="(.+)",Name="(.+)"$'
$regexd = '.+LogonId="(\d+)"$'

$logontype = @{
"0"="Local System"
"2"="Interactive" #(Local logon)
"3"="Network" # (Remote logon)
"4"="Batch" # (Scheduled task)
"5"="Service" # (Service account logon)
"7"="Unlock" #(Screen saver)
"8"="NetworkCleartext" # (Cleartext network logon)
"9"="NewCredentials" #(RunAs using alternate credentials)
"10"="RemoteInteractive" #(RDP\TS\RemoteAssistance)
"11"="CachedInteractive" #(Local w\cached credentials)
}

$logon_sessions = @(gwmi win32_logonsession -ComputerName $computername)
$logon_users = @(gwmi win32_loggedonuser -ComputerName $computername)

$session_user = @{}

$logon_users |% {
$_.antecedent -match $regexa > $nul
$username = $matches[1] + "\" + $matches[2]
$_.dependent -match $regexd > $nul
$session = $matches[1]
$session_user[$session] += $username
}


$logon_sessions |%{
$starttime = [management.managementdatetimeconverter]::todatetime($_.starttime)

$loggedonuser = New-Object -TypeName psobject
$loggedonuser | Add-Member -MemberType NoteProperty -Name "Session" -Value $_.logonid
$loggedonuser | Add-Member -MemberType NoteProperty -Name "User" -Value $session_user[$_.logonid]
$loggedonuser | Add-Member -MemberType NoteProperty -Name "Type" -Value $logontype[$_.logontype.tostring()]
$loggedonuser | Add-Member -MemberType NoteProperty -Name "Auth" -Value $_.authenticationpackage
$loggedonuser | Add-Member -MemberType NoteProperty -Name "StartTime" -Value $starttime

$loggedonuser
}

}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,那是我生命中的30秒,我永远不会回来. (5认同)

Ver*_*Ray 12

由于我们在PowerShell区域,如果我们可以返回一个合适的PowerShell对象,它会非常有用......

我个人喜欢这种解析方法,因为简洁:

((quser) -replace '^>', '') -replace '\s{2,}', ',' | ConvertFrom-Csv
Run Code Online (Sandbox Code Playgroud)

注意:这不考虑断开连接("光盘")用户,但如果您只想获得快速的用户列表而不关心其他信息,则可以正常工作.我只是想要一个列表,并不关心它们当前是否已断开连接.

如果你关心其余的数据,那就更复杂了:

(((quser) -replace '^>', '') -replace '\s{2,}', ',').Trim() | ForEach-Object {
    if ($_.Split(',').Count -eq 5) {
        Write-Output ($_ -replace '(^[^,]+)', '$1,')
    } else {
        Write-Output $_
    }
} | ConvertFrom-Csv
Run Code Online (Sandbox Code Playgroud)

我再往前走一步,在我的博客上给你一个非常干净的对象.

我最终把它变成了一个模块.

  • 这需要更多的赞成.花了太长时间试图让它格式化我想要的方式. (3认同)
  • 确实,这是BRILLIANT! (2认同)

js2*_*010 5

也许你可以做点什么

get-process -includeusername
Run Code Online (Sandbox Code Playgroud)

  • 喜欢横向思维。我知道这不是“正确”的答案,但它确实提供了一个潜在的解决方案。`Get-Process -IncludeUserName | Select-Object -Unique -Property UserName` (3认同)