【问题标题】:How to get the active user username using 'query user'如何使用“查询用户”获取活动用户用户名
【发布时间】:2017-06-27 15:23:33
【问题描述】:

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

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

我所说的一些命令:

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

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

query user

这将返回以下格式:

用户名 会话名 ID 状态 空闲时间 登录时间 >user1 sessionName 4 活动。 2017 年 6 月 22 日下午 2:56

我的两个问题是:

  1. 是否也可以通过这种方式获取域?运行此命令时看不到它。
  2. 有没有办法从查询用户中获取用户名? 'active' 用户名的特异性如何?

【问题讨论】:

  • 使用$env:USERNAME$env:USERDOMAIN有什么问题?
  • 我的猜测是他试图在另一个会话中确定用户的用户/域。
  • @thepip3r 嗯...从问题中我了解到有 2 个用户。但对我来说,让远程(服务器)会话查询本地(框)用户的信息似乎有点倒退;使用内置环境变量并将它们传递给远程执行的代码 - 作为脚本或函数参数会更有意义......(免责声明:我没有搞乱远程处理,所以可能会丢失一些东西)
  • 我也不明白他在做什么,但这对我来说是最引人注目的部分,“我将以具有权限的不同用户身份运行脚本”。这意味着,用户将处于与脚本不同的会话中(并且可能在另一台计算机上)。可能是错的,但这是我的解释。
  • @gms0ulman 问题在于它返回的是运行 powershell 会话的用户的信息,而不是登录的用户

标签: powershell scripting


【解决方案1】:

查询活跃用户:

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

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

【讨论】:

  • 谢谢@Bill_Stewart,这就是我要提取用户名的方法。
  • @Zirono - 听起来不错 - 如果您认为您的问题已回答,请随时标记答案。
【解决方案2】:

win32_loggedonuser 在每个用户的 'antecedent' 属性中都有您需要的所有信息。您需要使用字符串解析对其进行过滤,但它具有您要查找的内容。如果您需要任何其他与会话相关的信息,您可以使用 'dependent' 属性中的值来搜索 Win32_logonsession 以获取诸如 logontype 和 starttime 之类的信息。

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

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

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

【讨论】:

  • 谢谢@thepip3r,我想我可以像你建议的那样在循环中使用它,并结合Bill_Stewart的回答来得到我需要的东西。
【解决方案3】:

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

【讨论】:

  • 是的,这正是我的想法,然后我重新加载了页面并看到了你的答案。谢谢!
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多