web-dev-qa-db-ja.com

現在ログインしているユーザー(ドメインとマシン)+ステータス(アクティブ、アイドル、退席中)を表示するPowerShellスクリプト

サーバーにログオンしているユーザーを表示する簡単なコマンドを探しています。私はこれを知っています:

Get-WmiObject -Class win32_computersystem

しかし、これは私が必要な情報を提供しません。ドメインメーカーメーカー名(マシン名)PrimaryOwnerName TotalPhysicalMemory

Windows 2012サーバーでPowershell 3.0を実行しています。

また

Get-WmiObject Win32_LoggedOnUser -ComputerName $Computer | Select Antecedent -Unique

必要な正確な答えが得られません。アイドル時間、またはアクティブかアウェイかを確認したいと思います。

32
RayofCommand

この同じソリューションを探して、stackoverflowの別の質問で必要なものを見つけました: Powershell-log-off-remote-session 。以下の1行は、ログオンしているユーザーのリストを返します。

query user /server:$SERVER
86
Hyon

それを行うための「単純なコマンド」はありません。関数を作成することも、さまざまなコードリポジトリでオンラインで利用できるいくつかの選択肢を選択することもできます。私はこれを使用します:

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
}

}
19
mjolinor

PowerShell領域にいるので、適切なPowerShellオブジェクトを返すことができればさらに便利です...

私は個人的に、簡潔さのためにこの解析方法が好きです:

((quser) -replace '^>', '') -replace '\s{2,}', ',' | ConvertFrom-Csv

注:これは切断を考慮しません(「ディスク」 )ユーザーが、ユーザーの簡単なリストを取得したいだけで、残りの情報を気にしない場合はうまく機能します。リストが欲しいだけで、それらが現在切断されているかどうかは気にしませんでした。

残りのデータに関心がある場合、もう少し複雑です。

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

それをさらに一歩進めて、私のブログで非常にきれいなオブジェクトを提供します。

これをモジュールにしました。

9
VertigoRay

たぶんあなたは何かをすることができます

    get-process -includeusername
4
js2010

Explorer.exeプロセスのみを選択することによるDarKalimHeroの提案に基づく私のアプローチを次に示します。

Function Get-RdpSessions 
{
    param(
        [string]$computername 
    )

    $processinfo = Get-WmiObject -Query "select * from win32_process where name='Explorer.exe'" -ComputerName $computername

    $processinfo | ForEach-Object { $_.GetOwner().User } | Sort-Object -Unique | ForEach-Object { New-Object psobject -Property @{Computer=$computername;LoggedOn=$_} } | Select-Object Computer,LoggedOn
}
1
Matze

対話的にログオンしているユーザーを見つけたい場合は、ここで素晴らしいヒントを見つけました: https://p0w3rsh3ll.wordpress.com/2012/02/03/get-logged-on-users/ (Win32_ComputerSystem私を助けなかった)

$explorerprocesses = @(Get-WmiObject -Query "Select * FROM Win32_Process WHERE Name='Explorer.exe'" -ErrorAction SilentlyContinue)
If ($explorerprocesses.Count -eq 0)
{
    "No Explorer process found / Nobody interactively logged on"
}
Else
{
    ForEach ($i in $explorerprocesses)
    {
        $Username = $i.GetOwner().User
        $Domain = $i.GetOwner().Domain
        Write-Host "$Domain\$Username logged on since: $($i.ConvertToDateTime($i.CreationDate))"
    }
}
1
DarKalimHero