在 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