使用PowerShell查找具有過期密碼的Active Directory用戶

使用 PowerShell 查找已过期密码的 Active Directory 用户。您负责管理您的 Active Directory(AD)环境中的密码吗?一个关键的任务是识别密码已过期的用户,因为这些用户将无法登录他们的帐户,直到他们重置他们的密码。本文向您展示如何有效地使用 PowerShell 查找已过期密码的 Active Directory 用户。

我们开始我们的文章博客,关于如何使用 PowerShell 查找已过期密码的 Active Directory 用户。

使用 PowerShell 查找密码已过期的 AD 用户

遵循本文可以節省時間和精力,因為我們可以快速對特定用戶進行密碼重置或過期通知。無論您是網絡管理員還是 merely 想要改善您的Active Directory環境的安全性,本指南提供了您開始所需的資訊。

前提條件

如果我們計劃遵循本文,我們將需要以下內容:

在Active Directory中尋找用戶

重置用戶密碼之前,我們必須首先找到帳戶。因此,我們的第一步應該是確定是否存在備用。為此,運行 Get-ADUser cmdlet,並將 Identity 參數設置為帳戶名稱。

Identity 參數接受四種標識符之一: 分別名稱(DN),GUID(objectGUID),安全 ID(objectSID)或 SAM 帳戶名稱(SAMAccountName)。

例如,如果我們要求重置特定用戶的密碼,我們應該首先驗證該用戶 存在,然後再發出帳戶重置。為此,複製以下命令並將其粘貼到我們的 PowerShell 控制台。請務必先將用戶名更改為正確的名稱:

Get-ADUser -Identity

命令返回了用戶屬性,如下面的屏幕截圖所示,確認帳戶存在且用戶名正確:

在 AD 中查找密碼已過期的用戶

我們可以透過附加並使用屬性msDS-UserPasswordExpiryTimeComputedGet-ADUser命令快速獲取單個用戶的密碼到期日期:

Get-ADUser -Identity USERNAME -Properties 'msDS-UserPasswordExpiryTimeComputed'

但這行代碼會導致人類難以閱讀的輸出,因此我們需要添加以下行來將結果轉換為可讀格式。要添加以下行,我們將在新的PowerShell管道上使用Select-Object -Property命令:

Select-Object -Property {[datetime]::FromFileTime($_.”msDS-UserPasswordExpiryTimeComputed”)}

運行相同的屬性msDS-UserPasswordExpiryTimeComputed,並使用正確的篩選器,我們可以獲得Active Directory帳戶及其密碼到期時間的列表:

Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" |
Select-Object -Property "Displayname",@{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}

我們通過將用戶列表導出到以後可以使用的文本文件來改進上述腳本。為此,我們可以使用Out-File命令將輸出發送到文本文件:

Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" |
Select-Object -Property "GivenName" |
Out-File -FilePath .\userslist.txt

上面的腳本會生成一個名為 userslist.txt 的文件,我們可以稍後使用。我們還從輸出中省略了 ExpiryDate 屬性,因為我們只需要已過期的帳戶的用戶ID。我們將此列表用於大規模修復,稍後將在本文中討論。

重設 Active Directory 用戶密碼

現在我們已經學會了如何使用 Get-ADUser 驗證用戶帳戶,我們知道結果是有效的並且用戶ID存在。我們現在必須使用 Set-ADAccountPassword cmdlet 來重設用戶的密碼。

Set-ADAccountPassword 命令會更改用戶的 密碼 如果我們提供了舊密碼。如果我們沒有舊密碼,則該 cmdlet 將使用 Reset 參數來重設密碼。

新生成的隨機密碼是一個具有五個非字母數字字符的14字符隨機密碼。要執行,打開一個 PowerShell 窗口,複製代碼,將其粘貼到 PowerShell 中,然後按 Enter:

$username = USERNAME
Add-Type -AssemblyName 'System.Web'
$randomPassword = [System.Web.Security.Membership]::GeneratePassword(14, 5)
$newPassword = $randomPassword | ConvertTo-SecureString -AsPlainText -Force
Set-ADAccountPassword -Identity $username -NewPassword $newPassword -Reset |
Set-ADUser -ChangePasswordAtLogon true
$randomPassword
  • 第 1 行:指定要重置密碼的使用者名稱。請確保將USERNAME字串替換為實際使用者 ID。
  • 第 2 行:匯入System.Web .NET 組件物件類別。
  • 第 3 行:生成一個隨機密碼,長度為 14 個字符,其中包含五個非字母數字字符。
  • 第 4 行:將明文密碼轉換為安全字串密碼物件。
  • 第 5 行:協助重置密碼。
  • 第 6 行:強制 AD 帳戶在下次登錄時更改密碼。
  • 第 7 行:在控制台中顯示新密碼。但出於安全考慮,我們不建議這樣做。第 6 行負責根據使用者的喜好更改密碼,被認為是此程序的最佳實踐。

提升您的 Active Directory 安全性和 Azure AD

試用我們免費,訪問所有功能。- 200+ AD 報告模板可用。輕鬆定製您自己的 AD 報告。




編寫Active Directory密碼重置工具

我們現在有一個用於重置用戶密碼的腳本。下一步是將我們的腳本轉化為一個工具。一個可重用的工具以最少的用戶手動操作執行相同的動作。

在構建工具時,一個關鍵的方面是,運行工具的人不應該每次都需要編輯代碼。但不幸的是,我們的代碼仍然需要用戶編輯$username變量。

與其允許我們工具的用戶手動更改值,為什麼不編寫一個接受參數的腳本呢?為此,請按照以下步驟操作:

  1. 打開Windows PowerShell ISE。
  2. 創建一個新的PowerShell文件,並將文件命名為 Reset-ADPassword.ps1。將腳本保存在我們偏好的位置。本文將文件保存在 C:\PS\scripts 文件夾中。
  3. 在保存腳本之前,請將以下代碼複製並粘貼到我們的腳本編輯器中。
param (
     $username
 )

 if (-not($username)) {
     Write-Host "Username not found. Exiting script"
     return $null
 }

 try {
     $null = Get-ADUser -Identity $username -ErrorAction Stop
 } catch {
     Write-Host $_.Exception.Message
     return $null
 }

$randomPassword = [System.Web.Security.Membership]::GeneratePassword(14, 5)
$newPassword = $randomPassword | ConvertTo-SecureString -AsPlainText -Force

 try {
     Set-ADAccountPassword -Identity $username -NewPassword $newPassword -Reset -ErrorAction Stop
     Set-ADuser -Identity $username -ChangePasswordAtLogon $true

     [pscustomobject]@{
         Username = $username
         NewPassword = $randomPassword
     }
 } catch {
     Write-Host "There was an error performing the password reset. Please find additional information below."
     Write-host $_.Exception.Message
     return $null
 }
  • 第一行:添加了一個名為 用戶名的參數。
  • 第五行:檢查用戶是否提供了用戶名值。如果條件滿足,if塊還會顯示一條消息並退出腳本。
  • 第十行:檢查用戶名是否有效。
  • 第十二行:驗證用戶名是否無效。顯示一條消息並停止腳本執行。
  • 第十七行:生成一個包含五個非字母數字字符的14個字符長的隨機密碼。
  • 第十八行:將純文本密碼轉換為安全字符串密碼對象。
  • 第二十行:幫助重置密碼。
  • 第二十二行:強制AD帳戶在下次登錄時更改密碼。
  • 第二十四行:在控制台顯示新密碼。然而,我們不建議這樣做,因為安全原因。第六行將負責將密碼更改為用戶喜歡的密碼,並且被認為是此過程的最佳實踐。
  • 第二十八行:如果重置失敗,則顯示錯誤消息。

使用AD密碼重置工具的示例執行

A PowerShell console pane is already available if we use Windows PowerShell ISE. If not, we should launch a separate PowerShell session. Change the current working directory to the destination folder where the script was saved, such as Set-Location C:\PS\Scripts.

重置單個用戶的密碼

假設我們需要重置一個用戶的密碼。首先,運行Active Directory密碼重置工具並指定要針對的用戶名。例如,要重置單個用戶的密碼,請運行以下腳本:

.\Reset-ADPassword.ps1 -username USERNAME

結果,腳本重置了密碼並將其顯示在屏幕上。例如,此輸出將新密碼發送給受影響的用戶:

重置多個用戶的密碼

幸運的是,我們可以使用PowerShell中的數組和foreach循環遍歷列表。此外,PowerShell中的ForEach-Object cmdlet允許我們同時處理多個項目。此cmdlet允許我們通過管道傳遞各種項目。

要重置多個用戶的密碼,請創建一個包含兩個或更多用戶名的數組。然後,數組項目通過管道傳遞,其中PowerShell命令ForEach-Object對每個用戶名運行密碼重置工具。

@('user1', 'user2') | ForEach-Object {.\Reset-ADPassword.ps1 -username $PSItem}

但是,如果我們要修復兩個以上的用戶帳戶,我們可以改進這一點。記得我們之前生成的文本文件嗎?我們在本節中利用它。

我們必須讀取包含用戶帳戶的文本文件並在每個帳戶上運行AD密碼重置工具。為此,使用Get-Content cmdlet將文本文件的內容導入到PowerShell中。之後,腳本將數據發送到管道並在每個帳戶上運行AD密碼重置腳本。

Get-Content .\userslist.txt | ForEach-Object {.\Reset-ADPassword.ps1 -username $PSItem}

執行上述片段後,我們將在單個運行時間中重置多個用戶密碼。

感謝您閱讀文章部落格使用 PowerShell 找尋已過期密碼的 Active Directory 用戶。我們將現在總結。

使用 PowerShell 找尋 AD 用戶的已過期密碼 結論

總結來說,透過 PowerShell 尋找已過期的 Active Directory 用戶 密碼是一個簡單直接的方法,可以節省我們的时间和精力。透過使用 PowerShellGet-ADUser 命令下山,並過濾出那些密碼已經過期的用戶,你能夠快速識別並對特定的用戶進行密碼重置或 過期 通知。對於用戶數量众多的組織來說,這個命令非常便利,因為它讓你能夠積極管理密碼的過期,並減少 安全 洩漏的風險。

請查看我們的 Active directory 部落格部分 這裡 以及 PowerShell 部分 這裡 以閱讀更多內容。

Source:
https://infrasos.com/find-active-directory-users-with-expired-password-powershell/