如何使用'query user'获取活动用户用户名



我将在用户框上运行一个在远程服务器上工作的脚本。但是,用户将无法访问服务器,因此我将作为具有权限的其他用户运行脚本。

我遇到困难的位是我需要在用户(框用户(用户名和域上登录以传递到服务器上。有多种命令可以获取我需要的数据,但是当运行PowerShell ISE作为其他用户时,他们都返回用户数据而不是登录用户数据的数据。

我所说的一些命令:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:USERNAME
$env:USERDOMAIN
$(whoami)

唯一可以按照我想要的方式工作的是:

query user

这返回:

的格式
用户名SessionName ID状态空闲时间登录时间> user1 sessionname 4活动。2017年6月22日下午2:56

我的两个问题是:

  1. 有没有办法以这种方式获得域?运行此命令时,我看不到它。
  2. 有没有办法只能从查询用户中获取用户名?"主动"用户名的特异性呢?

查询活动用户:

query user | Select-String '^>(w+)' | ForEach-Object { $_.Matches[0].Groups[1].Value }

这取决于不包含空格的用户名。将/server参数添加到query命令中以查询远程计算机。

win32_loggedonuser拥有您在每个用户的'前提'属性中所需的所有信息。您需要使用String-parsing进行过滤它,但它具有您想要的内容。如果您需要任何其他与会话相关的信息,则可以使用"依赖"属性中的值来搜索Win32_logonsession,以查找logonType和starttime之类的东西。

$s = (gwmi win32_loggedonuser).antecedent.split('=')
$s[1].Replace('"', '').Replace(',Name', '') ## domain
$s[2].Replace('"','') ## username

编辑:以上显示在单个用户方案中解析输出。在多用户方案中,您需要循环浏览结果并为每个用户执行类似操作。我的目的是提供一个例子。

edit2:get-wmiobject上的-computername属性允许您与远程计算机一起运行此功能。

您可以通过WMI列举登录的桌面用户,并通过从query user输出中提取的用户名来过滤该列表(请参阅Bill_stewart的答案(:

$user = (& query user) -replace '^>(S+).*', '$1'
$qry = 'SELECT * FROM Win32_Process WHERE Name="explorer.exe"'
Get-WmiObject -Query $qry | ForEach-Object {
    $_.GetOwner()
} | Sort-Object -Unique User, Domain | Where-Object {
    $_.User -eq $user
} | ForEach-Object {
    '{0}{1}' -f $_.Domain, $_.User
}

query user命令列出了远程桌面会话/用户,因此,如果可以同时登录多个用户,则需要过滤命令的输出。

如果您需要通过sessionname grep:

$userInfo =  (cmd /c "query user") | Out-String -Stream
For ($i = 0; $i -le $userInfo.Count; $i++)
{
If ($($userInfo[$i]) -like "*console*")
{
    $consoleUser = (($($userInfo[$i]) -Split ">")[1] -Split " ")[0]
    Break
}
}

最新更新