在 PowerShell 中登录用户
![在 PowerShell 中登录用户](/img/PowerShell/feature-image---get-logged-on-users-using-powershell.webp)
当我们使用 Windows 时,在某些时候,我们可能需要找出当前登录到计算机的用户。幸运的是,我们可以使用 PowerShell 获取本地或远程计算机上的当前用户。
本文将讨论几种使用 PowerShell 获取计算机上当前登录用户的方法。我们知道的方法包括本机命令、.NET 类和 Windows Management Instrumentation (WMI) 特定的 cmdlet。
在 PowerShell 中使用 WMI 类登录用户
让我们从名为 Get-WMIObject
和 Get-CimInstance
的 PowerShell 原生 cmdlet 开始。这些 cmdlet 允许我们使用本地或远程计算机上的 Windows Management Instrumentation 或 WMI 类获取信息,包括当前登录的用户。
Get-WMIObject
是较旧(已弃用)的 cmdlet,仅适用于 Windows PowerShell 5.1 版。相反,Get-CIMInstance
命令是更新、更安全的 cmdlet,并且对最新的 PowerShell 版本开放。要使用 Windows PowerShell 获取当前用户,请调用针对 Win32_ComputerSystem
类的任一命令。Win32_ComputerSystem
.NET 类包括各种属性,包括用户名属性。
为此,请打开 Windows PowerShell 窗口并运行以下命令。
示例代码:
# Use any of the commands
(Get-WMIObject -ClassName Win32_ComputerSystem).Username
(Get-CimInstance -ClassName Win32_ComputerSystem).Username
值得注意的是,查询 Win32_ComputerSystem
.NET 类只会将当前登录用户的用户名输出到计算机上(控制台会话)。因此,如果用户远程登录(例如远程桌面),则用户名将为空白。
两个 cmdlet 返回相同的输出,如下所示。如果当前登录的用户是域用户帐户,该命令将返回域和用户名(域\用户名)。
但是对于本地帐户,输出将是本地计算机和用户名。
输出:
DOMAIN\User01
Get-WMIObject
和 Get-CimInstance
命令有一个名为 -ComputerName
的参数,它接受要查询的计算机名称。使用这个参数意味着我们可以从网络中的远程机器上查询相同的信息。
如果我们只需要获取用户的用户名而不需要域,一个解决方案是使用 split()
方法分离输出。
下面的代码片段将使用反斜杠 (\
) 字符作为分隔符将用户名属性一分为二。[1]
部分将使用 cmdlet 仅输出索引 [1] 处的结果。
值得注意的是,索引从 0 开始;指定索引一将在第二个位置显示结果。
示例代码:
((Get-WMIObject -ClassName Win32_ComputerSystem).Username).Split('\')[1]
Windows PowerShell 仅输出用户部分,如下面的输出。
输出:
User01
在 PowerShell 中使用 .NET 环境类登录用户
PowerShell 是一种面向对象的语言和 shell。我们所做的一切都是一个对象。
当我们运行命令时,输出是一个对象。如果我们声明一个变量,该变量就是一个对象。
这些对象具有定义正确数据类型的层次结构,类似于蓝图。这些蓝图被称为 .NET 类或简称为类。
与之关联的类是 .NET Environment
类。那么我们如何使用 PowerShell 中的 Environment
类来获取当前用户呢?
Environment 类包含一个 Username
属性,其值是当前登录用户的用户名。要检索用户名属性值,请在 PowerShell 中运行以下命令。
示例代码:
[System.Environment]::UserName
除了 Username
属性之外,Environment
类还包含一个获取环境变量值的过程。该方法的名称是 GetEnvironmentVariable
函数。
要使用此方法检索当前用户,请运行以下命令。
示例代码:
[System.Environment]::GetEnvironmentVariable('username')
输出:
User01
在 PowerShell 中使用 .NET WindowsIdentity 类登录用户
WindowsIdentity
.NET 类是我们可以在 Windows PowerShell 中调用以检索当前用户的另一个 .NET 类。这个类有一个叫做 GetCurrentName
函数的方法,它输出一个代表当前 Windows 用户的对象。
要检索当前用户详细信息,请运行以下命令。
示例代码:
[System.Security.Principal.WindowsIdentity]::GetCurrent()
该 cmdlet 返回当前用户对象属性,包括 Name
属性。Name
属性值遵循域\用户格式。
在 PowerShell 中使用 query
命令登录用户
如果我们是系统管理员或域用户,我们至少已经通过远程桌面协议或 RDP 登录到远程计算机一次,可能是为了管理资源或使用应用程序。假设我们想知道谁当前登录并使用系统资源。
Windows 有一个内置的命令行工具,称为 query
命令,用于列出计算机上所有当前登录的用户。该命令还向我们显示用户是通过远程桌面会话登录还是本地登录到计算机。
query
legacy 命令包含两个与获取登录用户相关的参数; 会话
和用户
。session
参数显示所有计算机会话,而 user
参数显示用户及其会话。
例如,执行以下命令列出当前服务器上的会话。
示例代码:
query user /server:$server
输出:
USERNAME SESSION NAME ID STATE IDLE TIME LOGON TIME
user01 console 1 Active none 3/27/2022 2:36 PM
运行命令后,我们会注意到 quser
返回会话,但这次没有空白会话。该命令还显示用户的空闲时间和登录时间戳。
与其他命令相比,quser
是 PowerShell 中更适合获取当前用户的命令。
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn