在 PowerShell 中登录用户

Marion Paul Kenneth Mendoza 2023年1月30日
  1. 在 PowerShell 中使用 WMI 类登录用户
  2. 在 PowerShell 中使用 .NET 环境类登录用户
  3. 在 PowerShell 中使用 query 命令登录用户
在 PowerShell 中登录用户

当我们使用 Windows 时,在某些时候,我们可能需要找出当前登录到计算机的用户。幸运的是,我们可以使用 PowerShell 获取本地或远程计算机上的当前用户。

本文将讨论几种使用 PowerShell 获取计算机上当前登录用户的方法。我们知道的方法包括本机命令、.NET 类和 Windows Management Instrumentation (WMI) 特定的 cmdlet。

在 PowerShell 中使用 WMI 类登录用户

让我们从名为 Get-WMIObjectGet-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-WMIObjectGet-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 Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

相关文章 - PowerShell Log