如何使用“查询用户”获取活动用户用户名

时间:2017-06-27 15:23:34

标签: powershell scripting

我将在用户盒上运行脚本,该脚本在远程服务器上执行某些操作。但是,用户将无法访问服务器,因此我将以具有权限的其他用户身份运行脚本。

我遇到困难的一点是我需要抓住已登录用户(用户名)的用户名和域名才能传递给服务器。有各种命令可以获取我需要的数据,但是当以不同的用户身份运行PowerShell ISE时,它们都返回用户数据而不是登录用户数据。

我所说的一些命令:

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

唯一似乎以我想要的方式工作的是:

query user

返回格式:

USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
>user1                sessionName         4  Active          .  6/22/2017 2:56 PM

我的两个问题是:

  1. 有没有办法以这种方式获取域名?我运行这个命令时没有看到它。
  2. 有没有办法从查询用户那里获取用户名?那么“活跃”用户名的特殊性呢?

4 个答案:

答案 0 :(得分:2)

查询活动用户:

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

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

答案 1 :(得分:1)

win32_loggedonuser拥有您在前面提供的所有信息'每个用户的财产。您需要使用字符串解析来过滤它,但它具有您正在寻找的内容。如果您想要任何其他与会话相关的信息,您可以使用“依赖”中的值。用于搜索Win32_logonsession的属性,例如logontype和starttime。

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

编辑:以上显示在单个用户场景中解析输出。在多用户场景中,您需要遍历结果并为每个用户执行类似操作。我的意图是提供一个例子。

edit2:Get-WmiObject上的-computername属性允许您针对远程计算机运行它 - 当然具有适当的权限。

答案 2 :(得分:1)

您可以通过WMI枚举登录的桌面用户,并按照您从query user输出中提取的用户名过滤该列表(请参阅Bill_Stewart's answer):

$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命令列出远程桌面会话/用户,因此如果可以同时登录多个用户,则需要过滤命令的输出。

答案 3 :(得分:0)

如果您需要通过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
}
}